我正在尝试将以下关系分解为 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
让我失望的事实。
我正在尝试将以下关系分解为 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
让我失望的事实。
给定
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 分解保持不变。
如您所见,循环依赖没有问题。