📅  最后修改于: 2023-12-03 14:40:39.924000             🧑  作者: Mango
在数据库管理系统 (DBMS) 中,第三范式 (3NF) 和巴斯-科德范式 (BCNF) 是两个常用的范式. 以下是它们之间的区别:
第三范式是一个数据库范式,它是在第二范式(2NF)的基础上发展而来的. 3NF 强制一个表中每个非主属性都完全依赖于主键,并且不存在传递依赖。
一个表符合 3NF,当且仅当:
假设有一个表格,其中每个学生使用 ID 存储,同时出现他们的出生日期、地址、联系电话和 GPA. 可能会发生这种情况:地址具有州、市、街道编号和门牌号数据的层次结构.
ID | 出生日期 | 州 | 市 | 街道编号 | 门牌号 | 联系电话 | GPA --- | --- | --- | --- | --- | --- | --- | --- 001 | 12/1/1990 | CA | Los Angeles | 2457 | 6805 | 555-5555 | 3.7 002 | 5/5/1991 | NY | New York | 1234 | 1234 | 444-4444 | 3.9
这个表格违反了 3NF,因为它存在传递依赖。递归依赖是指在一个表中,非主键字段直接依赖于非主属性的属性.
实际上,由于地址具有为什么信息,因此我们可以将地址与表格分离以遵循 3NF:
ID | 出生日期 | 联系电话 | GPA | 地址 ID --- | --- | --- | --- | --- 001 | 12/1/1990 | 555-5555 | 3.7 | 111 002 | 5/5/1991 | 444-4444 | 3.9 | 112
地址 ID | 州 | 市 | 街道编号 | 门牌号 --- | --- | --- | --- | --- 111 | CA | Los Angeles | 2457 | 6805 112 | NY | New York | 1234 | 1234
BCNF是指一个关系模式R,对于R的每一个功能依赖 X → Y,X 都是一个超码。 换句话说,R 中的所有属性都应该完全取决于候选键,并且不存在不完全取决于候选键的属性集.
如果有一个关系满足第一、第二、第三范式,但还存在依赖于候选键的其他依赖,则必须使用BCNF. BCNF不会产生冗余数据.
假设我们正在创建一个关于某个学校的数据库. 学生可以选择创作和参加各种课程。 现在我们创建了一个表格,其中储存了学生和他们所选的课程.
| 学生ID | 学生姓名 | 选课ID | 选课名 | 课程裁判 | | ------ | ------ | ------ | ------ | ------ | | 1 | Amy | 101 | 拉丁语 | Mr. Smith | | 2 | Bob | 102 | 机器学习 | Dr. Lee | | 3 | Cat | 103 | 人工智能 | Dr. Jane |
该表格已经符合 3NF,没有传递依赖. 但它还可以进一步分解为符合 BCNF 的表格:
| 学生ID | 学生姓名 | |--|--| | 1 | Amy | | 2 | Bob | | 3 | Cat |
| 选课ID | 选课名 | 课程裁判 | |--|--|--| | 101 | 拉丁语 | Mr. Smith | | 102 | 机器学习 | Dr. Lee | | 103 | 人工智能 | Dr. Jane |
现在我们可以看到,学生和选课之间的表格中再也没有冗余的数据.