我如何指出BCNF的违规行为?

时间:2017-02-26 04:56:47

标签: database schema computer-science functional-dependencies bcnf

本周我有一个数据库中期,我在识别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。

1 个答案:

答案 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取决于AAD是候选键R5的子集。当提取到仅A作为候选键的R4时,依赖性不再是部分的。 R6的剩余部分变为{{1}},其中没有任何非平凡的FD。

你的最终答案应该是R1, R3 ,R5和R6。

PS。请注意,并非所有BCNF违规都可归类为部分或传递功能依赖。