BCNF,全称为 Boyce-Codd Normal Form(博伊斯-科德范式),是关系数据库中的一种规范化形式。BCNF 是 3NF(第三范式)的强化版本,用于消除数据库表中的冗余数据,并确保数据的一致性和完整性。它由 Codd 的同事 Raymond Boyce 和 Codd 本人提出。
BCNF 的定义
一个关系 R 满足 BCNF,如果对于关系中的每一个非平凡的函数依赖 X -> Y,X 都是一个超键(superkey)。
- 函数依赖(Functional Dependency):对于关系 R 中的任意属性集 X 和 Y,如果对每一个合法的元组 t1 和 t2,有 t1[X] = t2[X] 就蕴含 t1[Y] = t2[Y],那么称 X -> Y 是关系 R 上的一个函数依赖。
 - 超键(Superkey):关系 R 的一个属性集 X,如果 X 能唯一地标识关系 R 中的每一个元组,那么 X 就是一个超键。
 
BCNF 和 3NF 的区别
- 3NF(第三范式):一个关系 R 满足 3NF,如果对于关系中的每一个非平凡的函数依赖 X -> Y,要么 X 是一个超键,要么 Y 是一个主属性(即属于某个候选键的属性)。
 - BCNF(博伊斯-科德范式):一个关系 R 满足 BCNF,如果对于关系中的每一个非平凡的函数依赖 X -> Y,X 都是一个超键。
 
BCNF 是 3NF 的强化版本,因为它要求对于每一个函数依赖 X -> Y,X 必须是超键,而不仅仅是允许 Y 是主属性。
BCNF 示例
考虑以下关系:
| 学生课程表: | 学生ID (StudentID) | 课程 (Course) | 教师 (Teacher) | 
|---|---|---|---|
| 1 | 数学 | 张老师 | |
| 2 | 物理 | 李老师 | |
| 3 | 化学 | 王老师 | |
| 1 | 物理 | 李老师 | 
不满足 BCNF 的关系
假设有以下函数依赖:
- StudentID -> Course, Teacher
 - Course -> Teacher
 
在上述关系中,Course -> Teacher 违反了 BCNF,因为 Course 不是一个超键(它不能唯一地标识关系中的每一行)。因此,该关系不满足 BCNF。
满足 BCNF 的分解
为了使关系满足 BCNF,可以将其分解为两个关系:
| 学生课程表: | 学生ID (StudentID) | 课程 (Course) | 
|---|---|---|
| 1 | 数学 | |
| 2 | 物理 | |
| 3 | 化学 | |
| 1 | 物理 | 
| 课程教师表: | 课程 (Course) | 教师 (Teacher) | 
|---|---|---|
| 数学 | 张老师 | |
| 物理 | 李老师 | |
| 化学 | 王老师 | 
现在,学生课程表 和 课程教师表 都满足 BCNF:
- 在 
学生课程表中,没有任何非平凡的函数依赖(StudentID是超键)。 - 在 
课程教师表中,Course是超键。 
总结
BCNF 是一种关系数据库规范化形式,用于消除冗余数据,确保数据一致性。通过将关系分解为满足 BCNF 的子关系,可以避免冗余数据和更新异常,从而提高数据库的性能和数据完整性。