确定BCNF违规行为

时间:2017-03-31 20:19:22

标签: database functional-dependencies bcnf

所以我有一个与FD的关系模式,如下所示:

R(A,B,C,D): AB -> C, B -> D, CD -> A, AD -> B

现在我试图查找所有BCNF违规,然后分解表格。我计算了所有FD的左侧,发现了这个:

AB+ = {A, B, C, D}
B+ = {B, D} <- violation
CD+ = {C, D, A, B}
AD+ = {A, D, B, C}

所以我将表分解为这样:

R1 (B, D)
R2 (A, B, C)

唯一的问题是,我不确定在分解表格时是否需要做这些事情,或者我是否需要做更多事情。我主要对AB,CD和AD部分感到困惑。

1 个答案:

答案 0 :(得分:0)

在您的示例中,B → D实际上是唯一违反BCNF的依赖项,因为在所有其他依赖项中,左侧是一个键(实际上该关系的所有键都是(A D)(A B)(B C)(C D))。

因此,您可以通过拆分包含R的{​​{1}}中的原始关系R1,进行分解,B+BD,包含{{1}你正确找到的那就是R2

然后,如果在任何分解关系中存在违反BCNF的某些依赖性,则应该再次应用此过程。但事实并非如此,因为R - B+ + B中唯一的依赖项是ABC,其中B是唯一的密钥,R1B → D中的依赖项AB → C },包含密钥BC → AR2

此时可以终止该过程,因为ABBC都在BCNF中。但我们还应该注意,此分解不会保留依赖关系,因为R1R2已丢失。