重叠键的例子揭示了差异;具有谓词[P] 和匹配约束(c x.y)。
[P] 员工EMP,电子邮件EMAIL,在YR 年参加了CRS 课程。
(c 1.1) 对于每个员工和课程;该员工最多上过一次该课程;可能不止一名员工参加了该课程。
(c 1.2) 对于每个员工和每个课程;那位员工在整整一年的时间里完成了这门课程。
(c 1.3) 对于每个员工和年份;该员工可能在那一年参加了不止一门课程。
(c 1.4) 对于每个课程和年份;那一年有可能不止一名员工参加了该课程。
(c 2.1) 对于每位员工,该员工只有一封电子邮件。
(c 2.2) 对于每封电子邮件,只有一名员工拥有该电子邮件。
(c 3.1) 对于每封电子邮件和课程;拥有该电子邮件的员工最多上过一次该课程;有可能不止一名员工收到了该电子邮件。
(c 3.2) 对于每封电子邮件和每门课程;收到那封电子邮件的员工正好在一年内完成了该课程。
(c 3.3) 对于每个电子邮件和年份;收到该电子邮件的员工可能在那一年参加了不止一门课程。
(c 3.4) 对于每个课程和年份;那一年有可能不止一名员工拥有特定的电子邮件地址。
注意语言化约束如何直观地揭示问题。看看约束 c 3.x 如何匹配(重复)c1.x 由于 c 2.x。
R {EMP, EMAIL, CRS, YR}
KEY {EMP, CRS}
KEY {EMAIL, CRS}
为此的FD是
FD {EMP, CRS} --> {YR}
FD {EMAIL, CRS} --> {YR}
FD {EMP} --> {EMAIL}
FD {EMAIL} --> {EMP}
因此,将这些中的每一个视为FD X --> Y,它认为任一,
因此R 在第三个 NF 中。
对于 BCNF,要求是对于 R 中的任何重要的 FD X --> Y,X 是超级键。
这是 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
现在我们可以将R 分解为:
{EMP, EMAIL} {EMP, CRS, YR}
OR
{EMP, EMAIL} {EMAIL, CRS, YR}
这消除了这两个 FD 到子键。
最后,请注意,在分解为{EMP, EMAIL} {EMP, CRS, YR} 或{EMP, EMAIL} {EMAIL, CRS, YR} 之后,这些表现在全部在5NF 中——实际上在6NF 中,但这现在并不重要。重要的是要观察到有可能进入5NF——因此进入:(4, BCNF, ..., 1)——只需使用逻辑、语言化谓词和约束。换句话说,对于开发人员:
即使您不知道所有这些术语的含义,您的表格也可能很高 NF。