📜  DBMS中3NF和BCNF的区别(1)

📅  最后修改于: 2023-12-03 14:40:39.924000             🧑  作者: Mango

DBMS中3NF和BCNF的区别

在数据库管理系统 (DBMS) 中,第三范式 (3NF) 和巴斯-科德范式 (BCNF) 是两个常用的范式. 以下是它们之间的区别:

第三范式 (3NF)

第三范式是一个数据库范式,它是在第二范式(2NF)的基础上发展而来的. 3NF 强制一个表中每个非主属性都完全依赖于主键,并且不存在传递依赖。

一个表符合 3NF,当且仅当:

  • 它已经在 2NF 上
  • 不存在基于非主键列的传递依赖关系
例子

假设有一个表格,其中每个学生使用 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)

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 |

现在我们可以看到,学生和选课之间的表格中再也没有冗余的数据.