Bases de Dados · 1.º ano (indicativo)
Como identificar chaves numa tabela?
Resposta curta
Uma chave é um atributo (ou conjunto de atributos) cujo valor identifica cada linha de forma única. Para a encontrar, procure o que nunca se repete em nenhuma situação possível, retire atributos que sobrem e escolha uma como chave primária. As restantes ficam como chaves alternativas.
Quando se aplica
Identificar chaves é o passo central do modelo relacional. Faz-se ao analisar uma tabela existente, ao desenhar tabelas a partir de um diagrama entidade-associação e ao verificar se uma tabela está bem estruturada (normalização). Sem chave, não há forma segura de atualizar ou apagar uma linha, e os dados repetidos multiplicam-se.
Pré-requisitos
Saber o que é uma tabela (relação), uma linha (tuplo) e uma coluna (atributo).
Os tipos de chave
| Tipo | Definição |
|---|---|
| Superchave | conjunto de atributos que identifica cada linha de forma única (pode ter atributos a mais) |
| Chave candidata | superchave mínima: se tirar qualquer atributo, deixa de identificar |
| Chave primária | a chave candidata escolhida para identificar as linhas; não aceita valores nulos |
| Chave alternativa | as chaves candidatas que não foram escolhidas |
| Chave composta | chave formada por mais de um atributo |
| Chave estrangeira | atributo que referencia a chave primária de outra tabela |
Método passo a passo
- Perceba o significado das colunas. A pergunta é «o que identifica uma linha na vida real?», não «o que é único nos dados de hoje».
- Procure atributos únicos em todas as situações possíveis. Um nome pode repetir-se; o número de BI de uma pessoa não.
- Verifique a unicidade para todos os valores futuros, não só para as linhas que vê: duas pessoas podem vir a ter o mesmo nome.
- Se nenhum atributo chega, combine atributos e teste de novo.
- Garanta que é mínima: retire cada atributo, um de cada vez; se ainda identificar, o atributo retirado era a mais.
- Escolha a chave primária entre as candidatas: estável, curta e nunca nula. Muitas vezes cria-se um número de código (
id) para isso. - Identifique as chaves estrangeiras: colunas que apontam para a chave primária de outra tabela.
Atenção
Os dados de hoje podem enganar. Se todos os alunos na tabela têm nomes diferentes, isso não faz de nome uma chave: a regra tem de valer para qualquer linha que possa ser inserida.
Exemplos resolvidos
Exemplo 1 — Chaves de uma tabela de alunos
Enunciado: Dada a tabela ALUNO(nr_aluno, bi, nome, turma) com as linhas abaixo, identifique as chaves candidatas, a primária e a alternativa.
| nr_aluno | bi | nome | turma |
|---|---|---|---|
| 101 | 000111LA | Ana Mendes | 10A |
| 102 | 000222LA | Paulo Neto | 10A |
| 103 | 000333LA | Ana Mendes | 10B |
Resolução:
nomerepete-se (Ana Mendes aparece duas vezes) eturmatambém: não servem.nr_alunoé atribuído pela escola, único para cada aluno: serve.bié único para cada pessoa: serve também.- Ambos são mínimos (têm um só atributo). As chaves candidatas são
nr_alunoebi. - Escolha
nr_alunocomo primária (atribuído pela escola, estável e sempre preenchido).bifica como chave alternativa.
Resposta: candidatas: nr_aluno e bi; primária: nr_aluno; alternativa: bi. Verificação: nenhuma das duas colunas repete valores nas linhas vistas, e a regra vale para qualquer aluno novo.
Exemplo 2 — Chave composta
Enunciado: Na tabela INSCRICAO(nr_aluno, cod_disciplina, ano, nota), um aluno pode repetir uma disciplina noutro ano. Qual é a chave?
Resolução:
nr_alunosozinho repete-se (o aluno tem várias disciplinas).- (
nr_aluno,cod_disciplina) ainda se repete se o aluno repetir a disciplina noutro ano. - (
nr_aluno,cod_disciplina,ano) identifica cada inscrição de forma única. - Mínima? Sem
ano, falha para repetições; semcod_disciplina, o aluno teria uma só inscrição por ano; semnr_aluno, outros alunos coincidem. Logo é mínima.
Resposta: chave primária composta (nr_aluno, cod_disciplina, ano). Verificação: em SQL escreve-se PRIMARY KEY (nr_aluno, cod_disciplina, ano); nota não faz parte da chave, porque depende dela.
Exemplo 3 — Chaves estrangeiras
Enunciado: Há duas tabelas: TURMA(cod_turma, sala) e ALUNO(nr_aluno, nome, cod_turma). Quais são as chaves primárias e estrangeiras?
Resolução:
- Em TURMA,
cod_turmaidentifica cada turma: chave primária. - Em ALUNO,
nr_alunoidentifica cada aluno: chave primária. - A coluna
cod_turmaem ALUNO guarda o código de uma turma da tabela TURMA: é chave estrangeira.
Resposta: primárias: cod_turma (TURMA) e nr_aluno (ALUNO); estrangeira: cod_turma em ALUNO, que referencia TURMA. Verificação: não se pode registar um aluno com cod_turma que não exista em TURMA.
Exemplo 4 — Nível de exame: chaves a partir de dependências funcionais
Enunciado: A relação R(A, B, C, D) tem as dependências A → B e B → C. Determine a chave candidata.
Resolução:
- D não aparece do lado direito de nenhuma dependência; logo D tem de fazer parte de qualquer chave.
- Calcule o fecho de A: A → B, depois B → C, logo {A}+ = {A, B, C}. Não inclui D.
- Teste {A, D}: {A, D}+ = {A, B, C, D}, todos os atributos.
- É mínima? {A}+ não tem D, e {D}+ = {D}. Nenhum subconjunto chega.
- Não há outra: B ou C isolados com D não chegam a A.
Resposta: a única chave candidata é {A, D}. Verificação: o fecho de {A, D} contém os quatro atributos.
Erros frequentes
- Escolher o nome como chave. Nomes repetem-se, mesmo que na tabela atual não pareça.
- Concluir pela amostra. Só vê as linhas de hoje; a regra tem de ser válida para todas as linhas futuras.
- Chave com atributos a mais: (nr_aluno, nome) é superchave, mas não é candidata, porque
nomesobra. - Aceitar nulos na chave primária. Nenhum dos atributos da primária pode ficar vazio.
- Chave estrangeira para valor inexistente. O valor tem de existir na tabela referenciada (integridade referencial).
- Confundir chave estrangeira com chave primária. Uma coluna pode ser as duas coisas ao mesmo tempo, mas os papéis são diferentes.
- Usar dados que mudam, como o número de telefone, como chave primária.
Exercícios propostos
1Exercício 1
Na tabela PRODUTO(cod_barras, nome, preco), qual é a melhor chave primária e porquê?
Ver solução
cod_barras: identifica cada produto e não se repete. nome pode repetir-se (marcas diferentes) e preco varia e repete-se.
2Exercício 2
A tabela PESSOA(bi, nome, data_nascimento) tem a linha (000111LA, Ana, 2005-03-02). nome e data_nascimento podem formar chave? Justifique.
Ver solução
Não. Duas pessoas diferentes podem ter o mesmo nome e a mesma data de nascimento, por isso a combinação não garante unicidade. A chave é bi.
3Exercício 3
Na tabela NOTA(nr_aluno, cod_disciplina, trimestre, valor), cada aluno tem uma nota por disciplina e por trimestre. Indique a chave primária e as chaves estrangeiras prováveis.
Ver dica
Quantos atributos são precisos para identificar uma única nota?
Ver solução
A chave primária é composta: (nr_aluno, cod_disciplina, trimestre). As chaves estrangeiras prováveis são nr_aluno, que referencia a tabela de alunos, e cod_disciplina, que referencia a de disciplinas.
4Exercício 4
A relação R(A, B, C) tem as dependências A → B e B → C. Qual é a chave candidata?
Ver solução
Fecho de A: A → B, B → C, logo {A}+ = {A, B, C}, que é tudo. A é mínima (um só atributo). Como C e B não determinam A, a chave candidata única é A.
5Exercício 5
Numa tabela de viagens de candongueiro VIAGEM(matricula, data, hora_partida, destino), um veículo parte no máximo uma vez por hora. Indique a chave candidata e escreva a instrução SQL da chave primária.
Ver dica
Um veículo pode fazer várias viagens, mas nunca duas à mesma hora do mesmo dia.
Ver solução
Chave candidata: (matricula, data, hora_partida); o destino não faz parte, porque depende da viagem. Em SQL: PRIMARY KEY (matricula, data, hora_partida). Sem hora_partida ou sem data, a combinação repetir-se-ia.
Perguntas frequentes
Posso ter mais do que uma chave candidata?
Sim. Num aluno, nr_aluno e bi podem ser ambas candidatas. Escolhe-se uma como primária e as outras ficam como chaves alternativas, geralmente declaradas como UNIQUE.
Devo usar uma chave artificial (id) ou uma chave natural?
Chaves naturais (como o BI) têm significado real, mas podem mudar ou ter erros. Uma chave artificial, como um número sequencial, é curta e estável. Muitos projetos usam um id como primária e mantêm a natural como UNIQUE.
Uma chave primária pode ter valores nulos?
Não. A chave primária identifica a linha, por isso todos os atributos que a compõem têm de ter valor. As chaves estrangeiras, essas, podem ser nulas se a relação for opcional.
Qual é a diferença entre superchave e chave candidata?
Toda a chave candidata é superchave, mas nem toda a superchave é candidata. A candidata é a superchave mínima: se lhe tirar um atributo, deixa de identificar de forma única.
Resumo
- Chave é o atributo (ou conjunto) que identifica cada linha de forma única.
- Superchave pode ter atributos a mais; chave candidata é a superchave mínima.
- A primária é escolhida entre as candidatas e nunca é nula; as outras são alternativas.
- Chave composta junta vários atributos; a estrangeira referencia a primária de outra tabela.
- Teste sempre a unicidade para todos os valores possíveis, não só para os dados de hoje.
Onde aprofundar
- O programa e o manual da sua cadeira de Bases de Dados.
- Silberschatz, Korth e Sudarshan, Database System Concepts, capítulo sobre o modelo relacional (confirme a edição).
- Elmasri e Navathe, Sistemas de Banco de Dados, secções sobre chaves e restrições; documentação do PostgreSQL ou do MySQL sobre
PRIMARY KEYeFOREIGN KEY.
Continue a estudar
Como desenhar um diagrama ER passo a passo?
Leia o enunciado e marque os substantivos como entidades e os verbos como associações. Acrescente atributos e um identificador a cada entidade, indique a cardinalidade…
4 exemplos5 exercícios com solução✓ Estudado