3NF和BCNF有什么区别?

cac*_*oat 33 database-design relational-database 3nf database-normalization bcnf

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

Mos*_*cho 45

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. departmentNumber⟶departmentName

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

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

BCNF

定义

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

鉴于以下关系:

STUDENT_COURSE(studentNumber,socialSecurityNumber,courseNumber)

学生可以协助许多课程,在课程中可以有很多学生.

候选键是:

  1. socialSecurityNumber,courseNumber
  2. studentNumber,courseNumber

考虑以下功能依赖性:

  1. studentNumber⟶socialSecurityNumber
  2. socialSecurityNumber⟶schoolNumber

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

  • 谢谢!!很好的解释. (9认同)