分解为BCNF和超级密钥集

时间:2016-02-27 01:59:41

标签: database functional-dependencies bcnf

所以我有这套关系

AB-> CDEF

G-> H,I

ABJ-> k

C-→1

我该如何分解?我感到很困惑。我应该先找到超级密钥集吗?

1 个答案:

答案 0 :(得分:1)

我们可以先将关系R转换为3NF然后转换为BCNF。

要将关系R和一组功能依赖关系(FD's)转换为3NF,您可以使用 伯恩斯坦的综合 。申请伯恩斯坦的综合 - 左

  • 首先我们确保给定的一组FD's最小化
  • 第二次我们会将每个FD设为自己的子架构。
  • 第三次我们尝试合并这些子架构
在您的情况下

例如

R = {A,B,C,D,E,F,G,H,I,J,K,L}
FD's = {AB-> CDEF,G-> HI,ABJ-> K,C-> L}

首先我们检查FD's是否为最小封面(单身右手边,没有无关的左侧属性,没有冗余的FD

  • Singleton RHS:我们用单例RHS编写FD。所以现在我们将FD作为{AB-> C,AB-> D,AB-> E,AB-> F,G-> H,G-> I,ABJ-> K,C - →1}
  • 没有多余的LHS属性:我们删除无关的LHS属性(如果有的话)。这里没有无关的LHS属性。
  • 没有冗余FD:我们删除冗余依赖项(如果有的话)。现在FD是{AB-> C,AB-> D,AB-> E,AB-> F,G-> H,G-> I,ABJ-> K,C-> L}

第二我们使每个FD成为自己的子架构。所以现在我们有 - (每个关系的键都是粗体

[R <子> 1 = {的 A,B ,C}
[R <子> 2 = {的 A,B 下,d}
[R <子> 3 = {的 A,B ,E}
[R <子> 4 = {的 A,B 下,F}
[R <子> 5 = {<强“G
下,H}
[R <子> 6 = {<强“G
下,I}
[R <子> 7 = {的 A,B,J ,K}
[R <子> 8 = {<强> C
下,L}

第三我们将所有子模式与相同的LHS组合在一起。所以现在我们有 -

S 1 = { A,B ,C,D,E,F}
S 2 = { G ,H,I}
S 3 = { A,B,J ,K}
S 4 = { C ,L}

由于上述分解关系中没有一个包含 R 的键,因此我们需要创建一个包含 R 键形式的属性的附加关系模式。这是为了确保保留依赖关系的无损连接分解。所以我们添加 -

S 5 = { A,B,G,J }

ABGJ是原始关系R

的关键

这是 3NF 。现在检查 BCNF ,我们检查是否有任何这些关系(S 1 ,S 2 ,S 3 , S 4 ,S 5 )违反 BCNF 的条件(每个功能依赖{{ 1}}左侧(X->Y必须 超级键 )。在这种情况下,这些都不会违反 BCNF ,因此它也会被分解为 BCNF

注意 - 在此示例中,某些步骤的重要性可能并不明确。请查看其他示例herehere