当函数依赖是循环时会发生什么?

时间:2012-02-23 17:39:15

标签: database 3nf canonical-form

我正在尝试将以下关系分解为3NF:

A -> BCD
BC -> DE
C -> D
D -> A

所以我取消了冗余以获得规范的封面:

A -> BC
B -> E
C -> D
D -> A

现在我正试图将其分解为3NF。

我应该分解成r1(A, B, C) r2(B, D), r3(C, D)。那我该如何处理D -> A

A -> B -> D -> A让我失望的事实。

1 个答案:

答案 0 :(得分:1)

鉴于

A -> BCD
BC -> DE
C -> D
D -> A

要获得规范封面,我们首先从BC-> DE中删除D:

A -> BC
BC -> E
C -> D
D -> A

接下来,我们观察到C-> D,D-> A,A-> BC,如果我们知道B-> E,那么我们也知道C-> E.因此,

A -> BC
B -> E
C -> D
D -> A

3NF分解的工作原理如下:

1)为规范封面中的每个依赖关系创建表

R1(A,B,C) R2(B,E) R3(C,D) R4(A,D)

2)确定R的候选键。如果步骤1的表中没有包含候选键,则添加一个仅包含候选键属性的新表。

此处A是候选键,它包含在R1(和R4)中,因此不应添加新表。

3)如果有一个表使其属性是另一个表的属性的子集,则删除“包含”表。

这不适用,因此3NF分解保持不变。

如您所见,循环依赖性不存在问题。