【问题标题】:What happens when functional dependency is circular?当函数依赖是循环的时会发生什么?
【发布时间】:2012-02-23 17:39:14
【问题描述】:

我正在尝试将以下关系分解为 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 让我失望。

【问题讨论】:

标签: database 3nf canonical-form


【解决方案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分解保持不变。

如您所见,循环依赖没有问题。

【讨论】:

  • 如果我错了,请纠正我。我认为在 BC -> E 中,B 而不是 C 是无关紧要的。设F表示原覆盖,根据无关消除算法,C->E在F的闭包中,但B->E不在;因此 B 是无关的。
猜你喜欢
  • 1970-01-01
  • 2013-03-24
  • 2020-05-16
  • 2016-03-23
  • 2020-12-04
  • 2011-02-24
  • 1970-01-01
相关资源
最近更新 更多