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都是用来评估关系数据库设计是否符合范式,符合设计规范的数据库可以减少数据冗余,提高数据库性能,提高数据质量。