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
- Um atributo principal é um atributo encontrado em uma chave candidata e
- Uma chave candidata é uma superchave mínima para essa relação e
- 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.)