Eu li a citação: os dados dependem da tecla [1NF], da tecla inteira [2NF] e nada além da tecla [3NF] .
No entanto, estou tendo problemas para entender o 3.5NF ou BCNF como é chamado. Aqui está o que eu entendo:
- O BCNF é mais rígido que o 3NF
- o lado esquerdo de qualquer FD na tabela deve ser uma superchave (ou pelo menos uma chave candidata)
Então, por que é que algumas tabelas 3NF não estão no BCNF? Quero dizer, a citação da 3NF diz explicitamente "nada além da chave", o que significa que todos os atributos dependem apenas da chave primária. A chave primária é, afinal, uma chave candidata até que seja escolhida para ser nossa chave primária.
Se algo estiver errado com relação ao meu entendimento até o momento, corrija-me e obrigado por qualquer ajuda que você possa fornecer.
database
relational-database
database-normalization
3nf
Arnab Datta
fonte
fonte
Respostas:
Sua pizza pode ter exatamente três tipos de cobertura:
Por isso, pedimos duas pizzas e escolhemos as seguintes coberturas:
Espere um segundo, a mussarela não pode ser um queijo e uma carne! E salsicha não é queijo!
Precisamos evitar esse tipo de erro, para fazer a mussarela sempre ser queijo. Deveríamos usar uma tabela separada para isso, portanto, anotamos esse fato em apenas um lugar.
Essa foi a explicação que uma criança de 8 anos pode entender. Aqui está a versão mais técnica.
O BCNF age de maneira diferente do 3NF somente quando houver várias chaves candidatas sobrepostas.
A razão é que a dependência funcional
X -> Y
é obviamente verdadeira seY
for um subconjunto deX
. Portanto, em qualquer tabela que tenha apenas uma chave candidata e esteja em 3NF, ela já está no BCNF porque não há coluna (chave ou não chave) que depende funcionalmente de qualquer coisa além dessa chave.Como cada pizza deve ter exatamente um de cada tipo de cobertura, sabemos que (Pizza, Tipo de cobertura) é uma chave candidata. Também sabemos intuitivamente que uma determinada cobertura não pode pertencer a diferentes tipos simultaneamente. Portanto (Pizza, Cobertura) deve ser exclusivo e, portanto, também é uma chave candidata. Portanto, temos duas chaves candidatas sobrepostas.
Eu mostrei uma anomalia em que marcamos mozarella como o tipo de cobertura errado. Sabemos que isso está errado, mas a regra que o engana é uma dependência
Topping -> Topping Type
que não é válida para o BCNF para esta tabela. É uma dependência de algo diferente de uma chave de candidato inteira.Portanto, para resolver isso, retiramos o Tipo de Cobertura da tabela Pizzas e o tornamos um atributo não chave em uma tabela de Coberturas.
fonte
A diferença sutil é que o 3NF faz uma distinção entre os atributos chave e não chave (também chamados de atributos não primos ), enquanto o BCNF não.
Isso é melhor explicado usando a definição de 3NF de Zaniolo, que é equivalente à de Codd:
O BCNF exige (a) mas não trata (b) como um caso especial próprio. Em outras palavras, o BCNF exige que todo determinante não trivial seja uma superchave, mesmo que seus atributos dependentes façam parte de uma chave.
O BCNF é, portanto, mais rigoroso.
A diferença é tão sutil que o que muitas pessoas descrevem informalmente como 3NF é na verdade BCNF. Por exemplo, você declarou aqui que 3NF significa "dados dependem da chave [s] ... e nada além da chave [s]", mas essa é realmente uma descrição informal do BCNF e não da 3NF. O 3NF poderia ser descrito com mais precisão como " dados não chave dependem das chaves ... e nada além das chaves".
Você também declarou:
Isso é uma simplificação excessiva. 3NF e BCNF e todos os formulários normais estão relacionados a todas as chaves candidatas e / ou superchaves, e não apenas uma chave "primária".
fonte
A diferença entre BCNF e 3NF
Usando a definição BCNF
Se, e somente se, para cada uma de suas dependências X → Y, pelo menos uma das seguintes condições seja válida :
e a definição 3NF
Se e somente se, para cada uma de suas dependências funcionais X → A, pelo menos uma das seguintes condições é válida:
Vemos a seguinte diferença, em termos simples:
enquanto que
Onde
Ou seja, nenhum subconjunto parcial (qualquer subconjunto não trivial, exceto o conjunto completo) de uma chave candidata pode ser funcionalmente dependente de qualquer coisa que não seja uma superchave.
Uma tabela / relação que não esteja no BCNF está sujeita a anomalias, como as anomalias de atualização mencionadas no exemplo da pizza por outro usuário. Infelizmente,
Exemplo 3NF versus BCNF
Atualmente, um exemplo da diferença pode ser encontrado na " tabela 3NF que não atende ao BCNF (formulário normal de Boyce-Codd) " na Wikipedia, onde a tabela a seguir atende ao 3NF, mas não ao BCNF, porque o "campo de tênis" (um atributo parcial de chave / prime) depende no "Tipo de taxa" (um atributo chave / principal parcial que não é uma superchave), que é uma dependência que poderíamos determinar perguntando aos clientes do banco de dados, o clube de tênis:
Reservas de quadra de tênis de hoje ( 3NF, não BCNF )
As superchaves da tabela são:
O problema da 3NF : O atributo parcial de chave / principal "Tribunal" depende de algo diferente de uma superchave. Em vez disso, depende do atributo de chave / principal parcial "Tipo de taxa". Isso significa que o usuário deve alterar manualmente o tipo de taxa se atualizarmos um tribunal ou alterar manualmente o tribunal se desejar aplicar uma alteração na taxa.
(Em termos técnicos, não podemos garantir que a dependência funcional "Tipo de tarifa" -> "Tribunal" não seja violada.)
A solução BCNF : Se quisermos colocar a tabela acima no BCNF, podemos decompor a relação / tabela fornecida nas duas relações / tabelas a seguir (supondo que sabemos que o tipo de taxa depende apenas do status do tribunal e da associação, o que poderíamos descobrir perguntando aos clientes de nosso banco de dados, aos proprietários do clube de tênis):
Tipos de taxa ( BCNF e o 3NF mais fraco, implícito pelo BCNF)
Reservas de quadra de tênis de hoje ( BCNF e o 3NF mais fraco, o que está implícito no BCNF)
Problema resolvido : agora, se atualizarmos o tribunal, podemos garantir que o tipo de taxa refletirá essa alteração e não podemos cobrar o preço errado por um tribunal.
(Em termos técnicos, podemos garantir que a dependência funcional "Tipo de taxa" -> "Tribunal" não será violada.)
fonte
Todas boas respostas. Para colocar em linguagem simples [BCNF] Nenhuma chave parcial pode depender de uma chave.
ou seja, nenhum subconjunto parcial (ou seja, qualquer subconjunto não trivial, exceto o conjunto completo) de uma chave candidata pode ser funcionalmente dependente de alguma chave candidata.
fonte
As respostas de ' smartnut007 ', ' Bill Karwin ' e ' sqlvogel ' são excelentes. No entanto, deixe-me colocar uma perspectiva interessante sobre isso.
Bem, temos chaves primárias e não primas.
Quando focamos em como os não-primos dependem dos primos, vemos dois casos:
Não primos podem ser dependentes ou não .
Quando não é dependente: não pode haver dependência ou dependência transitiva
E as dependências entre números primos?
Agora, veja bem, não estamos tratando da relação de dependência entre números primos pela 2ª ou pela 3ª NF. Além disso, essa dependência, se houver, não é desejável e, portanto, temos uma regra única para resolver isso. Isto é BCNF .
Referindo-se ao exemplo da postagem de Bill Karwin aqui, você notará que ' Topping ' e ' Topping Type ' são chaves primárias e têm uma dependência. Se eles não fossem primos com dependência, o 3NF teria entrado em ação.
Nota:
A definição de BCNF é muito genérica e sem atributos diferenciadores entre primário e não primário. No entanto, a maneira de pensar acima ajuda a entender como alguma anomalia é percolada, mesmo após a 2ª e a 3ª FN.
Tópico avançado: Mapeando BCNF genérico para 2NF e 3NF
Agora que sabemos que o BCNF fornece uma definição genérica sem referência a quaisquer atributos primos / não primos, vamos ver como o BCNF e 2/3 das NFs estão relacionados.
Primeiro, o BCNF exige (além do caso trivial) que, para cada dependência funcional
X -> Y
X (FD), X seja uma super-chave. Se você considerar qualquer DF, então temos três casos: (1) X e Y não primos, (2) ambos primos e (3) X primos e Y não primos, descartando o caso (sem sentido) X não -prime e Y prime.No caso (1), a 3NF cuida.
No caso (3), 2NF cuida.
No caso (2), encontramos o uso de BCNF
fonte
Esta é uma pergunta antiga com respostas valiosas, mas eu ainda estava um pouco confuso até encontrar um exemplo da vida real que mostra o problema com a 3NF. Talvez não seja adequado para uma criança de 8 anos, mas espero que ajude.
Amanhã, encontrarei os professores da minha filha mais velha em uma dessas reuniões trimestrais de pais / professores. Aqui está a aparência do meu diário (nomes e salas foram alterados):
Há apenas um professor por sala e eles nunca se mexem. Se você tem um olhar, você verá que: (1) para cada atributo
Teacher
,Date
,Room
, temos apenas um valor por linha. (2) super-chaves são:(Teacher, Date, Room)
,(Teacher, Date)
e(Date, Room)
e chaves candidatas são, obviamente,(Teacher, Date)
e(Date, Room)
.(Teacher, Room)
não é uma super-chave, porque vou completar a tabela no próximo trimestre e talvez tenha uma linha como esta (o Sr. Smith não se mexeu!):O que podemos concluir? (1) é uma formulação informal mas correta de 1NF. De (2), vemos que não há "atributo não primo": 2NF e 3NF são dados gratuitamente.
Meu diário é 3NF. Boa! Não. Não, porque nenhum modelador de dados aceitaria isso em um esquema de banco de dados. O
Room
atributo depende doTeacher
atributo (novamente: os professores não se mexem!), Mas o esquema não reflete esse fato. O que um modelador de dados sensato faria? Divida a tabela em duas:E
Mas o 3NF não lida com dependências de atributos principais. Esse é o problema: a conformidade com a 3NF não é suficiente para garantir um design de esquema da tabela de som em algumas circunstâncias.
Com o BCNF, você não se importa se o atributo é um atributo principal ou não nas regras 2NF e 3NF. Para toda dependência não trivial (os subconjuntos são obviamente determinados por seus superconjuntos), o determinante é uma super chave completa. Em outras palavras, nada é determinado por outra coisa senão uma super chave completa (excluindo FDs triviais). (Veja outras respostas para definição formal).
Assim que
Room
dependeTeacher
,Room
deve ser um subconjunto deTeacher
(não é esse o caso) ouTeacher
deve ser uma super chave (não é o caso no meu diário, mas é o caso quando você divide a tabela).Para resumir: BNCF é mais rigoroso, mas na minha opinião mais fácil de entender, do que 3NF:
fonte