Normalização e formas normais

Dependências funcionais, fecho, chaves candidatas, cobertura mínima e 1FN a BCNF.

TLDR

Perguntar sobre esta página

ChatGPTClaudePerplexityGrokGeminiCopiar e abrirDeepSeekCopiar e abrir

Duas vendas do produto 11 guardam o seu nome atual em cada encomenda:

EncomendaNome
100Rato
102Rato

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:

idProduto→nomeProduto.\text{idProduto}\to\text{nomeProduto}.

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, X→YX\to Y significa que duas linhas iguais nos atributos de XX têm de ser iguais nos de YY. XX e YY 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: Y⊆XY\subseteq X. 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 Y⊆XY\subseteq X, então X→YX\to Y.
  • Aumento: de X→YX\to Y, obtemos XZ→YZXZ\to YZ.
  • Transitividade: de X→YX\to Y e Y→ZY\to Z, obtemos X→ZX\to Z.

A justaposição representa união de conjuntos, não multiplicação. Por exemplo, ABAB significa {A,B}\{A,B\}.

Podemos separar e reunir atributos à direita: A→BCA\to BC equivale a A→BA\to B e A→CA\to C. Não podemos separar automaticamente a esquerda: AB→CAB\to C não implica A→CA\to C nem B→CB\to C.

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 X+X^+ contém todos os atributos determinados por XX segundo as DFs dadas. Para o calcular:

  1. Começa com os atributos de XX.
  2. Se o lado esquerdo de uma DF já estiver todo no fecho, acrescenta o lado direito.
  3. Repete até nenhuma DF acrescentar atributos.

O processo termina porque só acrescentamos atributos e o esquema tem um conjunto finito deles. Para testar X→YX\to Y, verifica se Y⊆X+Y\subseteq X^+.

Considera R(A,B,C,D,E)R(A,B,C,D,E) com:

AB→C,C→D,D→E.AB\to C,\qquad C\to D,\qquad D\to E.

Para calcular (AB)+(AB)^+, aplica as DFs por rondas:

RondaDF usadaFecho
0nenhumaABAB
1AB→CAB\to CABCABC
2C→DC\to DABCDABCD
3D→ED\to EABCDEABCDE

Na ronda 2, AB→CAB\to C já não acrescenta nada. O processo para quando nenhuma DF aumenta o fecho. Assim, ABAB determina o esquema inteiro.

Já A+=AA^+=A e B+=BB^+=B. Nenhum determina os outros atributos. Para CC, começamos com CC, acrescentamos DD e depois EE, obtendo CDECDE. Não podemos usar AB→CAB\to C ao contrário para obter AA ou BB.

Chaves candidatas e atributos primos

XX é superchave quando X+X^+ contém todos os atributos de RR. É chave candidata quando é superchave e nenhum subconjunto próprio o é. Portanto, um fecho completo prova superchave; a minimalidade exige outro passo.

No exemplo anterior, ABAB é candidata porque o seu fecho é completo e nem AA nem BB chegam sozinhos.

É a única. Nenhum atributo consegue obter AA ou BB pelas DFs dadas, pois estes nunca aparecem à direita. Qualquer chave tem de conter ambos. Os supersets ABCABC e ABDEABDE 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 S(A,B,C)S(A,B,C) com AB→CAB\to C e C→BC\to B, temos duas candidatas: ABAB e ACAC. Ambas determinam o esquema; AA, BB e CC isolados não. Todos os atributos são primos, mesmo que escolhamos ABAB 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 X→AX\to A com um atributo à direita, que XX seja superchave ou que AA 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 XX de toda a DF não trivial seja superchave. Não há a exceção de atributo primo.

FormaCondição que verificamos
2FNNenhum atributo não primo depende de parte própria de uma candidata.
3FNNuma DF não trivial, o determinante é superchave ou o atributo determinado é primo.
BCNFNuma 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 R(A,B,C,D,E)R(A,B,C,D,E) com AB→CAB\to C, C→DC\to D e D→ED\to E, a candidata é ABAB. Os atributos C,D,EC,D,E são não primos.

A relação está em 2FN: nem AA nem BB determinam atributos não primos. Falha 3FN por C→DC\to D: C+=CDEC^+=CDE não é o esquema completo, logo CC não é superchave; DD não é primo. D→ED\to E também viola 3FN. A forma mais alta é 2FN.

Agora considera S(A,B,C)S(A,B,C) com AB→CAB\to C e C→BC\to B. As candidatas são ABAB e ACAC, portanto BB é primo. A DF C→BC\to B não viola 3FN, embora CC 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):

idProdutonomeProduto
11Rato

Item(idEncomenda, idProduto, qtd):

idEncomendaidProdutoqtd
100111
102113

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 F={A→BC, B→C, AB→D}F=\{A\to BC,\ B\to C,\ AB\to D\}.

  1. Separa A→BCA\to BC em A→BA\to B e A→CA\to C.
  2. Em AB→DAB\to D, o BB é dispensável: a partir de AA obtemos BB, depois DD. Podemos substituir por A→DA\to D.
  3. A→CA\to C é redundante, porque A→BA\to B e B→CB\to C já a implicam. Retira-a.

Fica {A→B, B→C, A→D}\{A\to B,\ B\to C,\ A\to D\}. 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 A→BA\to B, A+=ADA^+=AD e BB perde-se; sem B→CB\to C, CC perde-se; sem A→DA\to D, DD 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
Um atributo que nunca aparece à direita não pode ser produzido pelo cálculo do fecho.
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

Não uses AF → B ao contrário para obter F. Contar os atributos do fecho não demonstra a minimalidade de uma candidata.
Voltar à explicação
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
O filme nunca aparece à direita. Experimenta completá-lo com cinema e com cidade nas duas hipóteses.
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.
Voltar à explicação
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
Uma DF só pode ser aplicada quando tens todos os atributos à esquerda. Ao testar redundância, retira primeiro a DF que estás a avaliar.
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 retiradaFechoFalta
AB → CABC
BC → ABCDEA
BC → DABCD
D → EDE
CF → BCFB

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.
Voltar à explicação
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
Que atributos nunca aparecem à direita?
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.
Voltar à explicação

À tua maneira

Aparência

Modo de cor
Tema
Cor de destaque

Leitura

Fonte de leitura

Álgebra, lógica e uma ideia de cada vez.

Código

Fonte do código

Navegação

Cursor de leitura, sem edição. h, j, k, l movem; / pesquisa nesta página. v seleciona caracteres; V seleciona linhas; y copia. Tab permite destacar ou comentar. Espaço ou Enter abre blocos recolhíveis. Nos cartões, h, j, k, l mudam o foco.

CSS personalizado

Ativa uma sugestão ou guarda o teu CSS. Só muda este navegador.

Usa --page, --text e --accent para acompanhar o tema.

Seletores e recuperação

.site-header, .prose, .course-card, [data-reading-history], [data-playground] e .page-actions.

Abre a aparência com a tecla vírgula ou no rodapé. Se o CSS esconder os controlos, abre esta página sem CSS personalizado.

Pesquisar

Escreve para pesquisar em todo o site.

para escolher · Enter para abrir · Esc para fechar

Copiar fórmula

A cópia automática não está disponível. Copia o LaTeX abaixo.

Pesquisar nesta página

Enter procura · n / N repetem · Esc cancela. Ctrl / Cmd K pesquisa todo o site.

Atalhos de teclado

Clica numa tecla para a mudar. Esc cancela. Backspace desativa.

PesquisarCtrl / Cmd K

Os atalhos não interferem enquanto escreves. Tab e Enter funcionam sempre.