0

我有一个理论问题。我有关系 R(A,B,C,D) 和依赖关系 B->C, B->D。我如何检查是否在 BCNF 中,如果不是,我如何将其分解为 BCNF?这个问题来自一本书。我了解基本原理,但是我没有成功,有人可以向我解释一下吗?

4

1 回答 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 回答