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 的关系

假设有以下函数依赖:

  1. StudentID -> Course, Teacher
  2. Course -> Teacher

在上述关系中,Course -> Teacher 违反了 BCNF,因为 Course 不是一个超键(它不能唯一地标识关系中的每一行)。因此,该关系不满足 BCNF。

满足 BCNF 的分解

为了使关系满足 BCNF,可以将其分解为两个关系:

学生课程表 学生ID (StudentID) 课程 (Course)
1 数学
2 物理
3 化学
1 物理
课程教师表 课程 (Course) 教师 (Teacher)
数学 张老师
物理 李老师
化学 王老师

现在,学生课程表课程教师表 都满足 BCNF:

  • 学生课程表 中,没有任何非平凡的函数依赖(StudentID 是超键)。
  • 课程教师表 中,Course 是超键。

总结

BCNF 是一种关系数据库规范化形式,用于消除冗余数据,确保数据一致性。通过将关系分解为满足 BCNF 的子关系,可以避免冗余数据和更新异常,从而提高数据库的性能和数据完整性。