一个关系模式 R 属于 BCNF(Boyce-Codd Normal Form),当且仅当对于每一个非平凡的函数依赖 X → A:
X 必须是一个 超键(Superkey)
换句话说,只有当决定因素(X)是 候选键 时,才能有函数依赖。
特点
- BCNF 比 3NF 更严格。
- 在实际应用中,BCNF 能消除更多的更新异常。
- 不是所有关系都能分解为 BCNF 同时保持依赖(即可能无法做到既 BCNF 又保持所有函数依赖)。
示例
考虑关系:
CourseTeacher(course_id, teacher_id, office)
假设:
- course_id → teacher_id
- teacher_id → office
此时候选键是 course_id
,因为通过 course_id 可以唯一确定 teacher_id。
但是 teacher_id → office
,而 teacher_id 并不是候选键,因此不符合 BCNF。
解决方法是将其分解为:
- CourseTeacher(course_id, teacher_id)
- TeacherOffice(teacher_id, office)
这两个关系都满足 BCNF。
分解为 BCNF
将一个不属于 BCNF 的关系模式 R 分解为满足 BCNF 的形式,可以按照以下步骤进行:
- 找出一个违反 BCNF 的函数依赖(FD)X → Y。如果 X 不是 R 的 超键,且该函数依赖是非平凡的,则它违反了 BCNF。
- 在 R 所满足的所有函数依赖的集合下,计算 X 的 闭包(记作 )。
- 用两个新的关系模式替换 R:
- 第一个模式 R1,包含 中的所有属性。
- 第二个模式 R2,包含 R 中的所有属性,但去掉那些属于 但不属于 X 的属性。这可以表示为 。
- 将原始的函数依赖集分别投影到新的关系 R1 和 R2 上。
- 对 R1 和 R2 递归地应用上述分解过程,直到所有生成的关系模式都满足 BCNF。
这个过程确保了每个新关系要么已经满足 BCNF,要么可以进一步分解,直到满足 BCNF 的要求。
指向原始笔记的链接