3NF和BCNF有什么区别?

时间:2013-11-03 04:47:29

标签: database-design relational-database database-normalization 3nf bcnf

有人可以向我解释3NF和BCNF之间的区别吗?如果您还可以提供一些示例,那将会很棒。感谢。

1 个答案:

答案 0 :(得分:44)

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

3NF

定义

如果它在2NF中,则关系在3NF中,并且非主要属性不会过渡地依赖于主键。换句话说,如果对于R中的每个函数依赖关系X⟶A,则关系R在3NF中,满足以下条件中的至少一个:

  1. X是R
  2. 中的密钥或超级密钥
  3. A是R
  4. 中的主要属性

    实施例

    鉴于以下关系:

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

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

    候选键是 employeeNumber

    考虑以下功能依赖性:

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

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

        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
        3. 考虑以下功能依赖性:

          1. studentNumber⟶socialSecurityNumber
          2. socialSecurityNumber⟶studentNumber
          3. 根据上面的定义,可以得出结论,STUDENT_COURSE不在BCNF中,因为至少studentNumber不是STUDENT_COURSE中的键或超级键。