DBMS中BCNF和4NF的区别

  • Post category:database

BCNF(Boyce-Codd Normal Form)和4NF(Fourth Normal Form)都是关系型数据库设计中的范式,用来评估数据表是否符合设计规范。

BCNF是指满足第三范式(3NF)且对于任意一个非平凡函数依赖 X → Y(在实际应用中Y不属于候选键)都满足X的超键包含 Y 的候选键,这个范式的设计就是为了消除数据表中的传递依赖关系。一个表达式 X → Y 是指如果给定 X 的值,那么唯一确定 Y 的那个关系模式。如果存在多个依赖关系,那么就存在冗余数据,会导致数据的不一致性,所以采用BCNF可以有效地避免这种冗余。

例如,一个酒店提供的房间预订服务可以用如下的表来模拟。

Room ID Room type Room size Price Checked in? Checked out?

其中,Room ID是主键,Room type指房间的类型(例如单人房、双人房)、Room size是房间的大小、Price是房间的价格。此外,如果房客已经入住,将 Checked in ? 的值设置为 1,如果房客已经退房,将 Checked out? 的值设置为 1。

我们来对此表进行判断:

  • Room type → Price 和 Room ID → Price 都是一个只有1个属性决定Price的函数依赖关系,符合2NF(ZCNC)的定义;
  • Room ID → Checked in? 和 Checked out? 这两个属性之间是决定关系,符合2NF的要求。

但是我们发现Room type → Room size,Room type → Checked in? 和 Checked in? -> Checked out? 这三种依赖都不是键的传递依赖关系。也就是说,我们可以在 Room type 和 Checked in? 的表中分别包含 Room size 和 Checked out? 属性, 使每个表满足BCNF条件, 概括如下:

Room Type Price
Single 30
Double 50
Checked in ? Room ID
1 101
0 102
Checked out? Room ID
0 101
1 102

4NF(Fourth Normal Form)是比3NF和BCNF更严格的数据库设计规范,如果一个表符合4NF,那么这个表中的任何多值依赖关系都被消除。多值依赖是指,当一个表中存在A列和B列的值之间的多个依赖关系时,也就是说,一列可以有多个值和多种类型的A和B相关联。例如,在建立“书籍类别&书籍作者”的表时,书籍分类和书籍作者之间的多值依赖关系就比较明显。

例如,我们如果创建了一张书籍的表,里面包含书籍的一些基本信息,比如书籍 ID、书籍名称、作者、类别等等,此外还存在多个作者和多个类别的多值依赖关系,设计如下:

Book ID Book Name Author Category
1 Book 1 Author 1,Author 2 Category 1,Category 2

这样的设计有一个比较明显的问题,就是作者和类别之间的多值依赖关系。我们采用4NF的设计方法,将其进行表分解,即 新建一张AuthorCategory表来解决多值依赖关系,才能满足设计的要求。

Book ID Book Name
1 Book 1
Book ID Author
1 Author 1
1 Author 2
Book ID Category
1 Category 1
1 Category 2

综上所述,BCNF和4NF都是用来评估关系数据库设计是否符合范式,符合设计规范的数据库可以减少数据冗余,提高数据库性能,提高数据质量。