3NF和BCNF有什么区别



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

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

3NF

定义

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

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

给定以下关系:

EMP_DEPT(名字、员工编号、出生日期、地址、部门编号、部门名称)

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

候选键是 employeeNumber

请考虑以下功能依赖关系:

  1. 员工编号 ⟶ 名字、出生日期、地址、部门编号
  2. 部门编号 ⟶ 部门名称

根据上述定义,可以得出结论,关系EMP_DEPT不在 3NF 中,因为第二个功能依赖关系不满足 3NF 的两个条件中的任何一个:

  1. 部门编号不是EMP_DEPT中的键或超键
  2. 部门名称不是EMP_DEPT的主要属性

BCNF

定义

如果关系 R 在 3NF 中,则关系 R

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

给定以下关系:

STUDENT_COURSE(学生号码、社会安全号码、课程号码)

一个学生可以

协助许多课程,在一门课程中可以有很多学生。

候选键为:

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

请考虑以下功能依赖关系:

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

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

最新更新