数据库关系规范化到BCNF

时间:2016-01-29 20:13:26

标签: database-design relational-database database-normalization functional-dependencies bcnf

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

1 个答案:

答案 0 :(得分: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}
  • B - > ç
  • B - > d
  • AB - > ç
  • AB - > d
  • BC - > d
  • BD - > ç
  • ACD - >乙

现在,每个在左侧没有超级密钥的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在左侧都包含B,因此不存在导致违规的getURL(url="ftp://n5eil01u.ecs.nsidc.org/SAN/MOST/MOD10A2.005/") 有效的FD。所以这两种关系都在BCNF。我希望这对你来说已经足够清楚了。

编辑:现在才注意到这篇文章是4个月前...好吧我希望它仍然有用(也许是其他会员搜索主题)。