Eu entendo que para converter para BCNF, precisamos levar em consideração todas as violações e decompor conforme necessário com cada FD.
Por exemplo, se tivéssemos R(A,B,C,D) com FD's AB->C, B->D, C->A. Podemos calcular os fechamentos de cada um, {AB}+ = ABCD, {B}+ = BD, {C}+ = CA.
E depois de passar pelo algoritmo, uma decomposição válida em BCNF seria R1(B,D), R2(C,A), R3(B,C).
Onde estou confuso é que, embora essa decomposição pareça correta seguindo o algoritmo, como pode estar correta se a primeira dependência funcional AB-> C não parece ser satisfeita?
A decomposição que você produziu está de fato correta, no sentido de que os esquemas decompostos estão em BCNF.
No entanto, como você já observou, ele não preserva as dependências, em particular a dependência
AB → C
é perdida.Então você redescobriu um ponto importante sobre a decomposição em BCNF: sempre se pode decompor uma relação em BCNF, mas às vezes ao preço de perder uma ou mais dependências.
O que isso significa na prática? Podemos perder (possivelmente importantes) restrições. Nesse caso, por exemplo, a restrição de que para cada par de valores
AB
há sempre um único valor deC
não pode ser imposta no esquema resultante.Podemos fazer algo para isso? Bem, poderíamos decompor em vez disso em 3NF, porque o algoritmo de síntese usado para 3NF é garantido para produzir sempre decomposições sem perda e preservação de dependência funcional. Neste caso, por exemplo, produzirá a decomposição
R1(A B C)
eR2(B D)
, que mantém todas as dependências.Mas, espere um momento! temos agora uma decomposição que não elimina todas as redundâncias eliminadas com o algoritmo BCNF, pois, devido à dependência
C → A
, teremos o mesmo valor deA
cada vez que tivermos um determinado valor paraC
.Então, temos agora um dilema: devemos preferir a 3NF que preserva as dependências à custa de manter alguma redundância, ou devemos preferir a BCNF que reduz as redundâncias à custa de perder algum “significado” dos dados?
A opinião de muitos é que devemos escolher o 3NF, pois o significado dos dados é considerado mais importante que a redundância dos dados (e não apenas isso, mas porque o algoritmo 3NF é um algoritmo polinomial, enquanto o algoritmo BCNF é exponencial).