本周我有一个数据库中期,我在识别BCNF违规方面遇到了麻烦。我知道如何分解关系并找到哪个是关键,哪些是超级密钥。我也可以写出暗示的FD。我正在观看以下视频:https://www.youtube.com/watch?v=hTFyG5o8-EA。
总而言之,这位女士解释开始将BCNF算法应用于以下关系(她使用学生示例,但我已将其转换为字母以简化它):
具有FD的R(A,B,C,D,E,F,G,H):A - > BCG,G - > H,D - > EF我知道关键是AD,因为它的关闭是AD + = ABCDEFGH。 她说,所有提供的FD都是违规行为,并开始应用该算法:
BCNF尝试#1:
R1 = D - > EF(D + = DEF) //没有违规,但为什么?这不仅仅是违规吗?
R2 = ABCDEFG - (DEF - D)= ABCDGH //违规,也为什么混淆?它包含两个键。
BCNF在R2上尝试#2:
R3 = G - > H(G + = GH) //没有违规,因为只有两个属性GH,我相信
R4 = ABCDG //违规,但我不知道原因。
BCNF在R4上尝试#3:
R5 = A - > BCG //没有违规(?)
R6 = AD //没有违规(?)
最终关系: R1,R2,R5,R6。
答案 0 :(得分:2)
R
中的违规是部分和传递的功能依赖。当这些FD被提取为单独的关系时,它们不再是部分或传递的。这就是我们正常化的原因,因此在隔离时它们不再是违规行为也就不足为奇了。
R1 / R2 :在R
中,EF
取决于D
,即候选键AD
的一个子集,因此它是&#39 ;部分依赖。当提取到仅R1
作为候选键的D
时,依赖性不再是部分的。 R
的剩余部分变为R2
,其中仍然包含部分FD(A -> BCG
)和传递FD(A -> G -> H
)。
R3 / R4 :在R2
中,A -> G -> H
因此G -> H
是传递FD。提取到R3
时,它不具有长传递性。 R2
的剩余部分变为R4
但仍包含部分FD(A -> BCG
)。
R5 / R6 :在R4
中,BCG
取决于A
,AD
是候选键R5
的子集。当提取到仅A
作为候选键的R4
时,依赖性不再是部分的。 R6
的剩余部分变为{{1}},其中没有任何非平凡的FD。
你的最终答案应该是R1, R3 ,R5和R6。
PS。请注意,并非所有BCNF违规都可归类为部分或传递功能依赖。