BCNF分解算法说明

时间:2015-12-15 16:15:58

标签: database functional-dependencies decomposition bcnf

我查看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)。出了什么问题?或者,更好的算法?

2 个答案:

答案 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

  • Singleton RHS:因此我们可以将我们的FD编写为{BG-> C,BG-> D,G-> A,CD-> A,CD - > E,C-> A,C-> G,A-> D}。
  • 没有多余的LHS属性:我们可以从DCD->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:我们注意到这里有很多冗余依赖项。除去它们我们有{BG-> C,G-> 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