我查看Decomposing a relation into BCNF个答案,并在我的作业上尝试过,但我没有得到正确的答案,所以我在BCNF分解中寻求帮助
考虑R=(ABCDEG)
& F={BG->CD, G->A, CD->AE, C->AG, A->D}
。
我开始选择A->D
现在我得到S=(AD), R'=(ABCEG).
我选择了G->A
现在我得到了S=(AD,AG) R'=(BCEG)
我选择C->G
。
现在我想我需要得到S=(AD,AG,CG)
和R'=(BCE)
,但答案到底是(AD,AG,CGE,BC)
。出了什么问题?或者,更好的算法?
答案 0 :(得分:4)
要将关系R
和一组功能依赖关系(FD's
)转换为3NF
,您可以使用 伯恩斯坦的综合 即可。申请伯恩斯坦的综合 -
FD's
是最小化 FD
设为自己的子架构。 例如 :
R = {A,B,C,D,E,G}
FD> s = {BG-> CD,G-> A,CD-> AE,C-> AG,A-> D}
首先我们检查FD's
是否为最小封面(单身右手边,没有无关的左侧属性,没有冗余的FD )
D
和CD->A
的LHS中删除CD->E
,因为此处D
是一个无关的属性(As我们可以从D
获得C
,因为C-> A和A-> D )。因此,我们现在具有{BG-> C,BG-> D,G-> A,C-> A,C-> E,C-> G,A-> D} 第二我们使每个FD
成为自己的子架构。所以现在我们有 - (每个关系的键都是粗体)
[R <子> 1 子> = {的 B,G 强>,C}
[R <子> 2 子> = {<强“G 下,A}
[R <子> 3 子> = {<强> C 强>,E}
[R <子> 4 子> = {<强> C 强>,G}
[R <子> 5 子> = {的 A 下,d}
第三我们看到是否可以组合任何子模式。我们看到 R 3 和 R 4 可以组合,因为它们具有相同的密钥。所以现在我们有 -
S 1 = {B,G,C}
S 2 = {A,G}
S 3 = {C,E,G}
S 4 = {A,D}
这是 3NF 。现在检查 BCNF ,我们检查是否有任何这些关系(S 1 ,S 2 ,S 3 , S 4 )违反 BCNF 的条件(即每个功能依赖X->Y
左侧({{ 1}})必须 超级键 )。在这种情况下,这些都不会违反 BCNF ,因此它也会被分解为 BCNF 。
注意我上面的最终答案是X
。您期望的解决方案是(AD,AG,CGE,BCG)
,但这是错误的。这里的最后一个关系(S 1 )也应该具有(AD,AG,CGE,BC)
属性,如上所示。
答案 1 :(得分:1)
给出输入:关系R0与FD的S0的设置(最小)。
输出:将R分解为关系集合,所有关系都在BCNF中
ALGO: R&lt; -R0,S&lt; -S0 重复直到R在BCNF中。 如果有FD X - >是违反BCNF条件的。 计算{X} +,并选择{X} +作为一个关系作为R1,和 另一个R2为{(R - X +)U X} 映射FD在R1和R2上设置S(确定R1和R2上的FD)。 在R1和R2上递归重复算法。
规则: 1.应该保持属性。 2.应该是无损的 3.应该是FD保存
实施例:
R(xyz)FD xy -> z; key : xy
z-> y;
解: Z-&GT;是紫罗兰的BCNF状况。
分解关系R.
{z}+= yz;
R1(yz) where key is z
and R2(xz) key is x