一个关系模式 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 的形式,可以按照以下步骤进行:

  1. 找出一个违反 BCNF 的函数依赖(FD)X → Y。如果 X 不是 R 的 超键,且该函数依赖是非平凡的,则它违反了 BCNF。
  2. 在 R 所满足的所有函数依赖的集合下,计算 X 的 闭包(记作 )。
  3. 用两个新的关系模式替换 R:
    • 第一个模式 R1,包含 中的所有属性。
    • 第二个模式 R2,包含 R 中的所有属性,但去掉那些属于 但不属于 X 的属性。这可以表示为
  4. 将原始的函数依赖集分别投影到新的关系 R1 和 R2 上。
  5. 对 R1 和 R2 递归地应用上述分解过程,直到所有生成的关系模式都满足 BCNF。

这个过程确保了每个新关系要么已经满足 BCNF,要么可以进一步分解,直到满足 BCNF 的要求。

指向原始笔记的链接