你能给我提供一篇文章,给出一个在3NF但不在BCNF中的DB设计的例子,然后说明如何将其转换为BCNF?我看到的所有试图解释BCNF的文章都给出了1NF中的表的示例,然后将它们转换为BCNF。这并没有让我看到3NF和BCNF之间的区别。
提前感谢
发布于 2017-01-02 22:39:21
一个具有重叠键的示例揭示了不同之处;具有谓词[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)每个课程和年份;在该年,可能有超过一名员工使用特定的电子邮件参加了该课程。
注意用语言描述约束是如何直观地揭示问题的。看看constraints
c 3.x如何匹配(重复)由于c 2.x的c1.x。
R {EMP, EMAIL, CRS, YR}
KEY {EMP, CRS}
KEY {EMAIL, CRS}这方面的FDs是
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状态。
https://stackoverflow.com/questions/41426477
复制相似问题