我正在尝试生成模式的3NF和BCNF分解。我一直在研究算法,但我对如何做到这一点非常困惑。
如果我的最小封面说:F' = {A->F, A->G, CF->A, BG->C)
并且我已经确定了该关系的一个候选键,则说它是A
。那到底我该怎么办?
我一直在看例子,其中包含以下内容:
F = {A → AB,A → AC,A → B,A → C,B → BC}
最小封面:F′ = {A → B,B → C}
最终结果是:(AB,A → B), (BC,B → C)
。他们是怎么做到的?
答案 0 :(得分:1)
如果我有我的最小封面说:F'= {A-> F,A-> G,CF-> A,BG-> C)和I 已经确定了该关系的一个候选关键字,比如它是A.然后 我究竟该怎么做?
F'不是最小限度:你必须将A-> F和A-> G组合成A-> FG
即使值得A也不能是给定F'的候选键,因为B不属于A的闭包。可能的候选键是AB。
对于3NF,您首先要为F'中的每个依赖项创建表,即
R1(A,F,G) R2(A,C,F) R3(B,C,G)
接下来,检查其中一个表是否包含候选键。由于B仅出现在依赖项的左侧,因此B应始终是候选键的一部分。唯一带有B的表是R3,它不包含候选键(检查它!)。因此,我们添加一个带有候选键的新表R4作为属性
R4(A,B)
最后,我们检查其中一个表的属性集是否包含在另一个表的属性集中。对于我们的运行示例,情况并非如此。
因此,我们的3NF分解是
R1(A,F,G) R2(A,C,F) R3(B,C,G) R4(A,B)
对于BCNF,你从R(A,B,C,F,G)开始,寻找BCNF违规行为。
例如A-> FG违反了BCNF,因为这种依赖性不是微不足道的,A不是超级密钥。因此我们将R分成
R1(A,F,G) and R2(A,B,C)
获得的所有关系都不包含BCNF违规,因此此过程将在此处停止。