38

有人可以向我解释 3NF 和 BCNF 之间的区别吗?如果您还可以提供一些示例,那就太好了。谢谢。

4

1 回答 1

47

3NF 和 BCNF 之间的区别是微妙的。

3NF

定义

如果一个关系在 2NF 中并且没有非主属性可传递地依赖于主键,则该关系在 3NF 中。换句话说,如果对于 R 中的每个函数依赖 X ⟶ A,关系 R 在 3NF 中,则至少满足以下条件之一:

  1. X 是 R 中的键或超键
  2. A 是 R 中的主要属性

例子

给定以下关系:

EMP_DEPT(firstName, employeeNumber, dateOfBirth, address, departmentNumber, departmentName)

一个员工只能在一个部门工作,每个部门都有很多员工。

候选键是employeeNumber

考虑以下功能依赖关系:

  1. employeeNumber ⟶ firstName, dateOfBirth, address, departmentNumber
  2. 部门编号⟶部门名称

鉴于上述定义,可以得出关系 EMP_DEPT 不在 3NF 中的结论,因为第二个函数依赖不满足 3NF 的 2 个条件中的任何一个:

  1. departmentNumber 不是 EMP_DEPT 中的键或超键
  2. departmentName 不是 EMP_DEPT 中的主要属性

BCNF

定义

如果关系 R 在 3NF 中,则关系 R 在 BCNF 中,并且对于 R 中的每个函数依赖 X ⟶ A,X 是 R 中的键或超键。换句话说,3NF 和 BCNF 之间的唯一区别是在 BCNF 中它不存在3NF的第二个条件。这使得 BCNF 比 3NF 更严格,因为 BCNF 中的任何关系都将在 3NF 中,但不一定每个 3NF 中的关系都将在 BCNF 中。

例子

给定以下关系:

STUDENT_COURSE(studentNumber, socialSecurityNumber, courseNumber)

一个学生可以协助许多课程,一个课程可以有很多学生。

候选键是:

  1. 社会安全号码,课程号码
  2. 学生号,课程号

考虑以下功能依赖关系:

  1. 学生号⟶社会安全号
  2. 社会安全号码 ⟶ 学生号码

鉴于上述定义,可以得出结论 STUDENT_COURSE 不在 BCNF 中,因为至少 studentNumber 不是 STUDENT_COURSE 中的键或超键。

于 2013-11-03T06:29:53.683 回答