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 的子关系,可以避免冗余数据和更新异常,从而提高数据库的性能和数据完整性。