首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >BCNF归一化

BCNF归一化
EN

Stack Overflow用户
提问于 2017-01-02 20:02:00
回答 1查看 302关注 0票数 0

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

提前感谢

EN

回答 1

Stack Overflow用户

发布于 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.xc1.x

代码语言:javascript
复制
R {EMP, EMAIL, CRS, YR}

KEY {EMP,   CRS}
KEY {EMAIL, CRS}

这方面的FDs是

代码语言:javascript
复制
FD {EMP,  CRS} --> {YR}

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

FD {EMP} --> {EMAIL}

FD {EMAIL} --> {EMP}

因此,把它们中的每一个都看作是,FD X --> Y

  • X是一个超键,
  • Y是一个子键。

因此,R处于第三个NF中。

对于BCNF,要求是对于R中的任何非平凡的FD X --> Y,X都是一个超键。

以下是2NF到BCNF的检查表

代码语言:javascript
复制
---------------------------------------
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分解为:

代码语言:javascript
复制
{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状态。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41426477

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档