3NF和BCNF有啥区别?

Posted

技术标签:

【中文标题】3NF和BCNF有啥区别?【英文标题】:What is the difference between 3NF and BCNF?3NF和BCNF有什么区别? 【发布时间】:2013-11-14 00:29:24 【问题描述】:

谁能给我解释一下 3NF 和 BCNF 的区别?如果您还可以提供一些示例,那就太好了。谢谢。

【问题讨论】:

【参考方案1】:

3NF 和 BCNF 的区别很微妙。

3NF

定义

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

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

示例

给定以下关系:

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

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

候选键是employeeNumber

考虑以下函数依赖:

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

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

    departmentNumber 不是 EMP_DEPT 中的键或超级键 departmentName 不是 EMP_DEPT 中的主要属性

BCNF

定义

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

示例

给定以下关系:

STUDENT_COURSE(studentNumber, socialSecurityNumber, courseNumber)

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

候选键是:

    socialSecurityNumbercourseNumber studentNumbercourseNumber

考虑以下函数依赖:

    studentNumber ⟶ socialSecurityNumber socialSecurityNumber ⟶ studentNumber

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

【讨论】:

谢谢!!很好的解释。 如何修改这两个例子,使它们分别是 3NF 和 BCNF? 从第一个表中删除(拆分为另一个表)departmentNumber ⟶ departmentName,这将使其成为 3NF 和 BCNF。在第二个中,两者是等价的,所以删除任何一个属性 studentNumber 或 sSnumber 它将在 BCNF 中 这是我总是感到困惑的地方——当只提到“键”时,它是主键还是所有候选键或候选键之一? @user 和 Mosty Mostacho PK 与规范化无关。在这个答案中,“key”表示 CK。提到“PK”的第一句话re 3NF是错误的。否则,考虑考虑所有 CK 的答案很明确。

以上是关于3NF和BCNF有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

3NF 与BCNF 有啥区别? 求举个例子说明下~谢谢

3NF 与BCNF 有啥区别? 求举个例子说明下~谢谢

求证BCNF是3NF

还在为理解关系数据库的三范式而困惑,这篇文章用实例场景带你快速了解1NF 2NF 3NF BCNF的特点和区别

数据库范式(1NF 2NF 3NF BCNF)

如何将关系模式分解到BCNF(3NF)