BCNF正常化

时间:2017-01-02 12:02:00

标签: database database-design database-normalization

您能否请我提供一篇文章,其中提供了3NF但不在BCNF中的数据库设计示例,然后说明如何将其转换为BCNF?我看到的所有试图解释BCNF的文章给出了1NF中表格的例子,然后将它们转换为BCNF。这不让我看到3NF和BCNF之间的区别。

提前致谢

1 个答案:

答案 0 :(得分:0)

具有谓词和匹配约束。

| 员工(EMP_ID),电子邮件(EMAIL),参加年度(YR)课程(CRS_ID)。

每位员工和课程;该员工最多参加一次该课程,有可能不止一名员工参加该课程。

对于每位员工,该员工只有一封电子邮件。

对于每封电子邮件,只有一位员工拥有该电子邮件。

每位员工和课程;该员工在一年内完成了该课程。

每位员工和年份;该员工有可能在那一年参加过多门课程。

每个课程和年份;那一年可能有多名员工参加了该课程。

R {EMP_ID, EMAIL, CRS_ID, YR}

KEY {EMP_ID, CRS_ID}
KEY {EMAIL,  CRS_ID}

这个的FD是

FD {EMP_ID,  CRS_ID} --> {YR}

FD {EMAIL, CRS_ID} --> {YR}

FD {EMP_ID} --> {EMAIL}

FD {EMAIL} --> {EMP_ID}

因此,考虑到FD X --> Y中的每一个都认为

  • X是超级钥匙
  • Y是一个子项

,因此R位于第3个NF。

对于BCNF,要求是FD X --> Y中的任何非平凡R,X都是超级密钥。

所以,现在我们可以将其分解为

{EMP_ID, EMAIL} {EMP_ID, CRS_ID, YR}

OR

{EMP_ID, EMAIL} {EMAIL,  CRS_ID, YR}

将消除这两个FD到子键。

以下是2NF到BCNF的检查清单

---------------------------------------
For each nontrivial |        NF
    FD X --> Y      |
at least one holds  | 2nd   3rd   BCNF
---------------------------------------
X is a superkey        ✔     ✔     ✔

Y is a subkey          ✔     ✔

X is not a subkey      ✔
---------------------------------------

FD X --> Y is trivial iff Y ⊆ X