我有一个理论问题。我有关系 R(A,B,C,D) 和依赖关系 B->C, B->D。我如何检查是否在 BCNF 中,如果不是,我如何将其分解为 BCNF?这个问题来自一本书。我了解基本原理,但是我没有成功,有人可以向我解释一下吗?
问问题
331 次
1 回答
0
首先计算 的闭包集R
。
- {A} = {A}
- {B} = {B、C、D}
- {C} = {C}
- {D} = {D}
- {A,B} = {A,B,C,D} (这是一个键,
R
因此我们不必再计算任何包含该键的闭包集AB
。 - {A,C} = {A,C}
- {A,D} = {A,D}
- {B,C} = {B,C,D}
- {B,D} = {B,C,D}
- {C,D} = {C,D}
- {A,C,D} = {A,B,C,D} (也是一个键,因为它包含
R
闭包中的所有属性)。 - {B,C,D} = {B,C,D}
像 {A,B,C} 这样的集合没有被计算为 {A,B}(一个键)是一个子集。接下来我们必须确定新的 FD(功能依赖)。我不会解释这个过程,因为我相信你的教科书会描述它。依赖项是:
- B -> C
- B -> D
- AB -> C
- AB -> D
- 公元前-> D
- BD -> C
- ACD -> B
现在,每个左侧没有超级密钥的 FD 都是违反 BCNF 的。我们可以使用这种违规来拆分关系R
。我们违反的 FD 是 B -> C, B -> D, BC -> D 和 BD -> C。我们可以在 FD B -> C 上拆分关系。拆分关系的前“一半”将包含所有闭包元素在 FD 左侧的属性,在本例中为属性B
。所以我们的第一个关系将是R11(B, C, D)
。我们的第二个关系将包含 FD() 的左侧B
和不在 B 闭包中的属性,即属性A
。所以我们得到了关系R12(A,B)
。现在让我们看看:关系R12
肯定在 BCNF 中,因为它只包含两个属性。现在让我们检查一下关系R11
。这种关系的一个新关键是B
因为闭包B
包含 的所有属性R11
。没有对R11
导致违规的关系有效的 FD,因为它们都包含B
在它们的左侧。所以这两种关系都在 BCNF 中。我希望这对你来说已经足够清楚了。
编辑:现在才注意到这篇文章是 4 个月前的......好吧,我希望它仍然有用(也许对于其他搜索该主题的成员)。
于 2016-06-08T21:31:42.467 回答