Normalização e formas normais
Dependências funcionais, fecho, chaves candidatas, cobertura mínima e 1FN a BCNF.
Duas vendas do produto 11 guardam o seu nome atual em cada encomenda:
| Encomenda | Nome |
|---|---|
| 100 | Rato |
| 102 | Rato |
Mudar «Rato» para «Rato sem fios» exige corrigir as duas linhas. Se esta fosse a única tabela onde guardamos produtos, apagar as duas vendas apagaria também o nome do produto 11.
A normalização usa dependências entre atributos para identificar estas anomalias e separar factos. Podemos guardar o nome uma só vez, numa relação de produtos, e manter a quantidade de cada compra nas linhas da encomenda.
Dependências funcionais
Assumimos que cada produto tem um único nome atual. Assim, o produto 11 tem de se chamar Rato nas duas linhas, apesar de aparecer em encomendas diferentes. Escrevemos esta regra como:
Esta é uma dependência funcional, abreviada DF ou FD nos slides. Duas linhas com o mesmo idProduto têm de ter o mesmo nomeProduto. O mesmo produto pode aparecer em várias encomendas, como acontece com o 11. A dependência não exige uma única linha por produto.
Os restantes atributos podem variar. Na encomenda 100 foi vendida uma unidade do produto 11; na 102 foram vendidas três. O mesmo produto tem quantidades diferentes, por isso idProduto → qtd é falsa nestas vendas.
Em geral, significa que duas linhas iguais nos atributos de têm de ser iguais nos de . e podem ser conjuntos de atributos. A regra deve valer em todas as instâncias válidas, incluindo dados futuros.
A tabela ilustra a regra sobre o nome. A justificação vem da condição de um único nome atual por produto.
A dependência inversa exige outra condição. Se produtos diferentes puderem chamar-se Rato, nomeProduto → idProduto não vale. Nomes distintos numa amostra não provam essa dependência; dois produtos de igual nome e ids diferentes refutam-na.
Dependências triviais
idProduto, nomeProduto → nomeProduto é uma dependência trivial. O lado direito já está incluído no esquerdo: . Duas linhas iguais no produto e no nome têm necessariamente o mesmo nome, sem precisarmos de impor outra regra ao domínio.
Em idProduto → idProduto, nomeProduto, a dependência completa não é trivial, mas só idProduto → nomeProduto acrescenta uma restrição. O atributo idProduto à direita pode ser retirado sem mudar o significado.
Inferir dependências
Os axiomas de Armstrong permitem obter todas as DFs implicadas por um conjunto inicial:
- Reflexividade: se , então .
- Aumento: de , obtemos .
- Transitividade: de e , obtemos .
A justaposição representa união de conjuntos, não multiplicação. Por exemplo, significa .
Podemos separar e reunir atributos à direita: equivale a e . Não podemos separar automaticamente a esquerda: não implica nem .
Na loja, assumimos uma única linha por par encomenda/produto. Logo esse par determina a quantidade.
O produto sozinho não chega. Vimos que o produto 11 foi vendido em quantidades diferentes. A quantidade também pode variar entre os produtos de uma mesma encomenda. Por isso o id da encomenda sozinho não chega.
Fecho de um conjunto de atributos
O fecho contém todos os atributos determinados por segundo as DFs dadas. Para o calcular:
- Começa com os atributos de .
- Se o lado esquerdo de uma DF já estiver todo no fecho, acrescenta o lado direito.
- Repete até nenhuma DF acrescentar atributos.
O processo termina porque só acrescentamos atributos e o esquema tem um conjunto finito deles. Para testar , verifica se .
Considera com:
Para calcular , aplica as DFs por rondas:
| Ronda | DF usada | Fecho |
|---|---|---|
| 0 | nenhuma | |
| 1 | ||
| 2 | ||
| 3 |
Na ronda 2, já não acrescenta nada. O processo para quando nenhuma DF aumenta o fecho. Assim, determina o esquema inteiro.
Já e . Nenhum determina os outros atributos. Para , começamos com , acrescentamos e depois , obtendo . Não podemos usar ao contrário para obter ou .
Chaves candidatas e atributos primos
é superchave quando contém todos os atributos de . É chave candidata quando é superchave e nenhum subconjunto próprio o é. Portanto, um fecho completo prova superchave; a minimalidade exige outro passo.
No exemplo anterior, é candidata porque o seu fecho é completo e nem nem chegam sozinhos.
É a única. Nenhum atributo consegue obter ou pelas DFs dadas, pois estes nunca aparecem à direita. Qualquer chave tem de conter ambos. Os supersets e são superchaves, mas não candidatas.
Um atributo é primo se pertence a pelo menos uma chave candidata, não apenas à primária escolhida. Para encontrar todas as chaves, começa pelos atributos que não aparecem à direita de nenhuma DF não trivial. Testa extensões em ordem crescente e descarta supersets de candidatas já encontradas. Confirma sempre os fechos.
Por exemplo, em com e , temos duas candidatas: e . Ambas determinam o esquema; , e isolados não. Todos os atributos são primos, mesmo que escolhamos como primária.
Formas normais
A 1.ª forma normal, 1FN, usa valores atómicos dentro dos domínios escolhidos, sem grupos repetidos de atributos. Guardar produto1, produto2 e produto3 limita artificialmente uma encomenda. Guardar uma lista de ids numa célula dificulta referências e operações relacionais. Uma relação Item resolve estes problemas.
A atomicidade depende do modelo. Uma data pode ser um valor do domínio, mesmo que consigamos decompor o seu texto em ano, mês e dia. “Atómico” não significa “impossível de dividir de qualquer maneira”.
A 2FN exige 1FN e que cada atributo não primo dependa totalmente de cada chave candidata. Não pode depender de uma parte própria de uma candidata composta. Se todas as candidatas tiverem um único atributo, não há uma parte própria não vazia que crie a dependência parcial habitual.
A 3FN exige 1FN e, para cada DF não trivial com um atributo à direita, que seja superchave ou que seja primo. A descrição “não haver dependências entre atributos não chave” ajuda em casos simples com uma candidata, mas não substitui esta definição.
A BCNF, forma normal de Boyce-Codd, exige 1FN e que o determinante de toda a DF não trivial seja superchave. Não há a exceção de atributo primo.
| Forma | Condição que verificamos |
|---|---|
| 2FN | Nenhum atributo não primo depende de parte própria de uma candidata. |
| 3FN | Numa DF não trivial, o determinante é superchave ou o atributo determinado é primo. |
| BCNF | Numa DF não trivial, o determinante é superchave. |
Uma relação em BCNF está em 3FN; uma relação em 3FN está em 2FN, assumindo o modelo em 1FN. A implicação inversa pode falhar.
Classificar uma relação
Em com , e , a candidata é . Os atributos são não primos.
A relação está em 2FN: nem nem determinam atributos não primos. Falha 3FN por : não é o esquema completo, logo não é superchave; não é primo. também viola 3FN. A forma mais alta é 2FN.
Agora considera com e . As candidatas são e , portanto é primo. A DF não viola 3FN, embora não seja superchave. Viola BCNF. Esta relação está em 3FN e não em BCNF.
Precisamos de considerar as DFs implicadas, não apenas uma lista arbitrária de setas. Para BCNF, verificar os determinantes das DFs de uma base equivalente é suficiente quando o determinante de cada DF não trivial dessa base é superchave. Depois de decompor, a base original tem de ser projetada sobre cada esquema.
Dependência parcial e anomalias
Retomamos as duas vendas da abertura no esquema Venda(idEncomenda, idProduto, nomeProduto, qtd). Admitimos uma linha por par encomenda/produto e que cada produto tem um único nome atual. O par (idEncomenda, idProduto) é candidato a chave: determina o nome e a quantidade, enquanto nenhum dos ids isolados determina a venda completa.
Nos dados de abertura, (100,11) determina quantidade 1 e (102,11) determina quantidade 3. Já o produto 11 determina Rato nas duas linhas. O nome depende só de uma parte da candidata, violando 2FN. Cada compra volta a guardar o nome. Uma alteração exige várias atualizações; um produto ainda sem compras não tem um lugar independente; apagar a última compra apaga também a informação do nome.
As projeções separam as propriedades do produto das propriedades da compra:
Produto(idProduto, nomeProduto):
| idProduto | nomeProduto |
|---|---|
| 11 | Rato |
Item(idEncomenda, idProduto, qtd):
| idEncomenda | idProduto | qtd |
|---|---|---|
| 100 | 11 | 1 |
| 102 | 11 | 3 |
O nome tem agora um único lugar para mudar. As quantidades continuam ligadas a cada encomenda. A página de decomposição explica por que esta separação não inventa combinações ao reconstruir os dados.
O preço exige a mesma atenção ao significado do atributo. O preço atual depende do produto; o preço acordado numa venda pertence à linha da encomenda. Mesmo que coincidam hoje, mudar o primeiro não deve reescrever o segundo. Uma coincidência de preços entre vendas também não prova idProduto → precoPago.
Cobertura mínima
Uma cobertura mínima é um conjunto equivalente de DFs com um único atributo à direita, sem atributos dispensáveis à esquerda e sem DFs redundantes. Equivalente significa que os dois conjuntos implicam as mesmas dependências.
Considera .
- Separa em e .
- Em , o é dispensável: a partir de obtemos , depois . Podemos substituir por .
- é redundante, porque e já a implicam. Retira-a.
Fica . Confere cada remoção com fechos. Para testar se uma DF inteira é redundante, retira-a antes de calcular o fecho; caso contrário, ela própria prova o resultado que querias testar. A ordem das reduções pode produzir coberturas mínimas diferentes, mas equivalentes.
Confere o conjunto final: sem , e perde-se; sem , perde-se; sem , perde-se. Nenhuma das três é redundante e nenhuma esquerda tem atributos dispensáveis.
Exercícios
Fechos, candidata e atributos obrigatórios
Em R(A,B,C,D,E,F), temos AB → C, AD → E, B → D e AF → B. Calcula (AB)+ e (AF)+, mostrando a ordem de aplicação. Encontra todas as chaves candidatas e justifica que não faltam outras.
Pista
Solução
Partindo de AB, obtemos C por AB → C e D por B → D. Com AD obtemos E. O resultado é ABCDE; não chega a F, logo AB não é superchave.
Partindo de AF, obtemos B por AF → B, C por AB → C, D por B → D e E por AD → E. O resultado é ABCDEF, logo AF é superchave. A e F nunca aparecem à direita: qualquer superchave tem de os conter. Como AF já chega, é a única candidata. Retirar qualquer um deles impede o fecho completo.
Confere a tua resposta:
- Calculei os fechos de AB e AF por passos.
- Distingui superchave de candidata.
- Provei que AF é a única candidata.
Erros frequentes
Regras de exibição e formas normais
Exibicao(filme, cinema, cidade) guarda os cinemas onde cada filme está em exibição. Cada cinema pertence a uma cidade. Inicialmente, um filme só pode estar num cinema de cada cidade. As DFs dadas são cinema → cidade e filme, cidade → cinema, e não assumimos outras regras além das que se deduzem destas. A relação está em 1FN.
Encontra todas as candidatas e a forma normal mais alta. Depois, a distribuidora permite o mesmo filme em dois cinemas da mesma cidade: a segunda DF deixa de valer, mas a primeira mantém-se. Volta a determinar as candidatas e a forma normal. Explica por que a conclusão muda sem acrescentar ou retirar atributos.
Pista
Solução
Com as duas regras, (filme, cinema)+ obtém cidade e (filme, cidade)+ obtém cinema. Filme sozinho não obtém os restantes atributos; cinema e cidade não permitem obter filme. As candidatas são, portanto, filme/cinema e filme/cidade. Todos os atributos são primos.
cinema → cidade não viola 3FN porque cidade pertence a uma candidata. Viola BCNF: o fecho de cinema é apenas cinema/cidade, sem filme. A outra DF tem uma candidata à esquerda. A relação está em 3FN, mas não em BCNF.
Quando resta apenas cinema → cidade, filme/cidade já não determina cinema. A única candidata é filme/cinema, porque ambos os atributos têm de estar na chave e juntos obtêm cidade. Cidade deixa de ser primo. Depende de cinema, que é parte própria da candidata composta: há uma dependência parcial de um atributo não primo. Falha 2FN, logo a forma mais alta é 1FN.
As formas normais dependem das regras do domínio e das candidatas que delas resultam, não apenas dos nomes das colunas.
Confere a tua resposta:
- Encontrei as candidatas nas duas hipóteses.
- Distingui 3FN de BCNF quando cidade é primo.
- Identifiquei a dependência parcial quando a segunda regra deixa de valer.
Redundância e atributos dispensáveis
Em R(A,B,C,D,E,F), são dadas AB → C, BC → AD, D → E, CF → B e AB → E.
Uma colega propõe retirar AB → E e substituir BC → AD por C → AD, argumentando que C permite obter B por CF → B. Decide separadamente se cada alteração é válida e obtém uma cobertura mínima das DFs originais. Justifica as remoções com fechos calculados no conjunto apropriado.
Pista
Solução
Sem AB → E, começamos em AB, obtemos C por AB → C, D por BC → AD e E por D → E. Logo, a primeira remoção é válida.
A segunda alteração não é válida: C+ = C no conjunto original. CF → B precisa também de F, que não está no fecho. Não podemos obter A nem D só a partir de C. Substituir a esquerda acrescentaria regras que não eram implicadas pelo conjunto original.
Depois de separar BC → AD, uma cobertura mínima é:
AB → C;BC → A;BC → D;D → E;CF → B.
Nas esquerdas compostas, os atributos isolados A, B, C e F têm fechos de um só atributo, por isso nenhum deles permite dispensar o outro. Para conferir a redundância das DFs inteiras, retiramos uma de cada vez:
| DF retirada | Fecho | Falta |
|---|---|---|
| AB → C | AB | C |
| BC → A | BCDE | A |
| BC → D | ABC | D |
| D → E | D | E |
| CF → B | CF | B |
Nenhuma seta final se obtém das restantes. As direitas têm um só atributo, as esquerdas não têm atributos dispensáveis e a única DF retirada já foi demonstrada a partir das que ficaram.
Confere a tua resposta:
- Separei as direitas e retirei AB → E com uma prova de fecho.
- Rejeitei a redução de BC → AD para C → AD.
- Verifiquei equivalência e minimalidade do conjunto final.
Uma cadeia com uma só candidata
R(A,B,C,D) tem A → B, B → C e C → D. Encontra todas as candidatas e a forma normal mais alta, assumindo 1FN.
Pista
Solução
A+ = ABCD, por isso A é superchave. A nunca aparece à direita, logo todas as chaves o incluem, e A sozinho chega: é a única candidata. B, C e D são não primos. A relação está em 2FN porque a chave tem um só atributo e não há dependências parciais. Falha 3FN por B → C: B não é superchave e C não é primo. A forma mais alta é 2FN.
Confere a tua resposta:
- Encontrei A como única candidata e provei minimalidade.
- Classifiquei B, C e D como não primos.
- Justifiquei 2FN e a violação de 3FN por B → C.