Diferença entre 3NF e BCNF em termos simples (deve ser capaz de explicar a uma criança de 8 anos)

157

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.

Arnab Datta
fonte
Esse é um sentimento tão estranho que apenas um livro publicado pode fornecer uma descrição concisa e precisa de um conceito. Se você olhar as respostas para essa pergunta (realmente antiga), verá que nenhuma das mais bem avaliadas é vaga ou imprecisa. Ter uma definição algébrica não era o problema, era entender o conceito através de exemplos do mundo real. Quanto à citação na minha pergunta original, o Google "me ajude a Codd" para encontrar a origem das citações. Não há nada vago nisso.
Arnab Datta
1
De onde você acha que fontes que não são de livros escolares obtêm suas informações? Também existem muitos livros didáticos ruins, mas os livros didáticos são revisados ​​por várias pessoas com aprendizado acadêmico e são muito mais propensos a não serem bobagens do que as interpretações de outros livros didáticos. As classificações altas de pessoas desinformadas e desinformadas não fazem algo correto. Coloquei esse comentário lá para as pessoas que chegaram à sua pergunta. Essa frase "nada além da chave" é menos que inútil. Ter uma definição correta é certamente o problema, porque "entender o conceito" é impossível sem um.
Philipxy

Respostas:

162

Sua pizza pode ter exatamente três tipos de cobertura:

  • um tipo de queijo
  • um tipo de carne
  • um tipo de vegetal

Por isso, pedimos duas pizzas e escolhemos as seguintes coberturas:

Pizza    Topping     Topping Type
-------- ----------  -------------
1        mozzarella  cheese
1        pepperoni   meat
1        olives      vegetable
2        mozzarella  meat
2        sausage     cheese
2        peppers     vegetable

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.

Pizza    Topping
-------- ----------
1        mozzarella
1        pepperoni
1        olives
2        mozzarella 
2        sausage
2        peppers

Topping     Topping Type
----------  -------------
mozzarella  cheese
pepperoni   meat
olives      vegetable
sausage     meat
peppers     vegetable

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 se Yfor um subconjunto de X. 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 Typeque 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.

Bill Karwin
fonte
3
"É uma dependência de algo diferente de uma chave de candidato inteira". - Obrigado
gnsb
12
"Assim, em qualquer tabela que tenha apenas uma chave candidata e esteja em 3NF" - Não é bem assim. O exemplo que você dá atende a essa condição. No entanto, não é um exemplo de 3NF porque não é 2NF. A chave (1NF), a chave inteira (2NF) e nada além da chave (3NF). A chave é (Pizza, Topping) e a coluna ToppingType depende da chave e nada além da chave, mas não depende da chave inteira. Portanto, não é 2NF e, portanto, não é 3NF ou BCNF. É 1NF. Torná-lo 2NF ignoraria o problema que você está tentando ilustrar.
Daniel Barbalace
4
@DanielBarbalace, O ponto desta tabela é que ela possui uma chave candidata alternativa para esta tabela: (Pizza, ToppingType). Como ToppingType é um subconjunto dessa chave candidata, ela satisfaz 2NF.
Bill Karwin
6
Desculpe, tive que diminuir o voto. O exemplo que você mostrou não está no 3NF. Para entender o propósito do BCNF, devo ver um exemplo em que está no 3NF, mas não no BCNF. No momento, não vejo o propósito do BCNF.
Spero 28/01
5
Por que isso NÃO é tratado no 2NF já? Do meu ponto de vista, a chave primária da tabela original é Pizza + Topping, e Topping Type depende de Topping, portanto, não é uma dependência parcial que deve ser tratada no estágio 2NF?
GreenPenguin
91

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:

Uma relação, R, está em 3NF se, para cada DF não trivial (X-> A) satisfeito por R, pelo menos UMA das seguintes condições for verdadeira:

(a) X é uma superchave para R, ou

(b) A é um atributo-chave para R

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.

Uma relação, R, está no BCNF se, para cada DF não trivial (X-> A) satisfeito por R, a seguinte condição for verdadeira:

(a) X é uma superchave para R

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:

a citação da 3NF diz explicitamente "nada além da chave", significando que todos os atributos dependem apenas da chave primária.

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".

nvogel
fonte
7
Uau. O professor Zaniolo realmente ensina minha turma (CS 143, UCLA), e me deparei com essa resposta enquanto me preparava para o exame final. Ótimo ver o nome do meu professor e obrigado pela resposta detalhada!
DV.
você poderia dar um exemplo de uma relação que está no 3NF, mas não no BCNF? é difícil para mim imaginar ...
Leo
10
R {A, B, C} onde {A, B} é uma chave. Dada a dependência C-> B, R atende aos requisitos do 3NF, mas não do BCNF.
Nvogel
2
Chave significa chave candidata. Atributo de chave significa um atributo que faz parte de uma chave candidata, AKA um atributo principal .
Nvogel
3
Um atributo é primo se fizer parte de qualquer chave candidata; não primo se não fizer parte de nenhuma chave candidata.
Nvogel
26

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 :

  • X → Y é uma dependência funcional trivial (Y ⊆ X), ou
  • X é uma super chave para o esquema R

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:

  • X contém A (ou seja, X → A é uma dependência funcional trivial) ou
  • X é uma superchave ou
  • Cada elemento do AX, a diferença definida entre A e X, é um atributo principal (ou seja, cada atributo no AX está contido em alguma chave candidata)

Vemos a seguinte diferença, em termos simples:

  • No BCNF : toda chave parcial (atributo principal) pode depender apenas de uma superchave,

enquanto que

  • No 3NF : uma chave parcial (atributo principal) também pode depender de um atributo que não seja uma superchave (ou seja, outro atributo de chave parcial / principal ou mesmo um atributo não primário).

Onde

  1. Um atributo principal é um atributo encontrado em uma chave candidata e
  2. Uma chave candidata é uma superchave mínima para essa relação e
  3. Uma superchave é um conjunto de atributos de uma variável de relação para o qual mantém que em todas as relações atribuídas a essa variável, não há duas tuplas (linhas) distintas que tenham os mesmos valores para os atributos desse conjunto. ser definido como um conjunto de atributos de um esquema de relação do qual todos os atributos do esquema dependem funcionalmente. (Uma superchave sempre contém uma chave candidata / uma chave candidata é sempre um subconjunto de uma superchave. Você pode adicionar qualquer atributo em uma relação para obter uma das superchaves.)

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,

  • O BNCF nem sempre pode ser obtido , enquanto
  • 3NF sempre pode ser obtido .

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 )

Court   Start Time  End Time    Rate Type
------- ----------  --------    ---------
1       09:30       10:30       SAVER
1       11:00       12:00       SAVER
1       14:00       15:30       STANDARD
2       10:00       11:30       PREMIUM-B
2       11:30       13:30       PREMIUM-B
2       15:00       16:30       PREMIUM-A

As superchaves da tabela são:

S1 = {Court, Start Time}
S2 = {Court, End Time}
S3 = {Rate Type, Start Time}
S4 = {Rate Type, End Time}
S5 = {Court, Start Time, End Time}
S6 = {Rate Type, Start Time, End Time}
S7 = {Court, Rate Type, Start Time}
S8 = {Court, Rate Type, End Time}
ST = {Court, Rate Type, Start Time, End Time}, the trivial superkey

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.

  • Mas e se o usuário atualizar o tribunal, mas não se lembrar de aumentar a taxa? Ou, se o tipo de taxa errado for aplicado a um tribunal?

(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)

Rate Type   Court   Member Flag
---------   -----   -----------
SAVER       1       Yes
STANDARD    1       No
PREMIUM-A   2       Yes
PREMIUM-B   2       No

Reservas de quadra de tênis de hoje ( BCNF e o 3NF mais fraco, o que está implícito no BCNF)

Member Flag     Court     Start Time   End Time
-----------     -----     ----------   --------
Yes             1         09:30        10:30
Yes             1         11:00        12:00
No              1         14:00        15:30
No              2         10:00        11:30
No              2         11:30        13:30
Yes             2         15:00        16:30

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.)

AGéoCoder
fonte
6

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.

smartnut007
fonte
2
Por que não? Digamos que exista uma relação R (A, B, C, D, E) e (A, B) e (C, D) são chaves candidatas. Então AB-> D. Como AB é uma superchave de R, então R deve estar no BCNF, certo? (Só uma pergunta, tentando entender isso.)
peteykun
3

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 dependentes: vemos que eles devem depender de uma chave candidata completa. Isso é 2NF .
  • Quando não é dependente: não pode haver dependência ou dependência transitiva

    • Nem mesmo dependência transitiva: Não tenho certeza de qual teoria da normalização trata disso.
    • Quando dependente transitivamente: é considerado indesejável. Isso é 3NF .

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

KGhatak
fonte
3

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):

Teacher   | Date             | Room
----------|------------------|-----
Mr Smith  | 2018-12-18 18:15 | A12 
Mr Jones  | 2018-12-18 18:30 | B10 
Ms Doe    | 2018-12-18 18:45 | C21 
Ms Rogers | 2018-12-18 19:00 | A08 

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!):

Teacher  | Date             | Room
---------|------------------| ----
Mr Smith | 2019-03-19 18:15 | A12

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 Roomatributo depende do Teacheratributo (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:

Teacher   | Date
----------|-----------------
Mr Smith  | 2018-12-18 18:15
Mr Jones  | 2018-12-18 18:30
Ms Doe    | 2018-12-18 18:45
Ms Rogers | 2018-12-18 19:00

E

Teacher   | Room
----------|-----
Mr Smith  | A12
Mr Jones  | B10
Ms Doe    | C21
Ms Rogers | A08

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 Roomdepende Teacher, Roomdeve ser um subconjunto de Teacher(não é esse o caso) ou Teacherdeve 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:

  • na maioria dos casos, o BCNF é idêntico ao 3NF;
  • em outros casos, BCNF é o que você pensa / espera que seja 3NF.
jferard
fonte