数据库相关笔记④
闭包 Closure
例如,假设我们有以下函数依赖性:
A -> B
B -> C
那么,属性集合 {A} 的闭包就是 {A, B, C},因为 A 可以决定 B,B 可以决定 C。
闭包的概念在数据库设计(特别是在进行范式分解)中非常重要,因为它可以帮助我们理解和使用函数依赖性。
范式
1NF (第一范式)
第一范式要求数据库表的每一列都是不可分割的原子数据项。换句话说,每一列都应该是最小的数据单位,不能再被分割。
例如,一个违反第一范式的表可能如下:
| ID | Name |
|---|---|
| 1 | 张三, 李四 |
在这个例子中,“Name” 列包含了两个名字,违反了第一范式。应该将其分割为两行:
| ID | Name |
|---|---|
| 1 | 张三 |
| 2 | 李四 |
2NF (第二范式)
第二范式要求数据库表满足第一范式的基础上,非主键列完全依赖于主键(如果主键是组合键,则必须完全依赖于整个组合键)。
例如,一个违反第二范式的表可能如下:
| ID | Course | Teacher |
|---|---|---|
| 1 | Math | 张三 |
| 1 | English | 李四 |
在这个例子中,“Teacher” 列只依赖于 “Course” 列,而不是整个主键 “ID, Course”,违反了第二范式。应该将其分割为两个表:
学生表:
| ID | Course |
|---|---|
| 1 | Math |
| 1 | English |
课程表:
| Course | Teacher |
|---|---|
| Math | 张三 |
| English | 李四 |
3NF (第三范式)
第三范式要求数据库表满足第二范式的基础上,非主键列必须直接依赖于主键,不能存在传递依赖。
例如,一个违反第三范式的表可能如下:
| ID | Course | Teacher | Teacher_Age |
|---|---|---|---|
| 1 | Math | 张三 | 40 |
| 2 | English | 李四 | 35 |
在这个例子中,“Teacher_Age” 列依赖于 “Teacher” 列,存在传递依赖,违反了第三范式。应该将其分割为两个表:
学生表:
| ID | Course | Teacher |
|---|---|---|
| 1 | Math | 张三 |
| 2 | English | 李四 |
教师表:
| Teacher | Age |
|---|---|
| 张三 | 40 |
| 李四 | 35 |
BCNF (博伊斯-科德第四范式)
BCNF 要求数据库表满足第三范式的基础上,对任何的决定因素 X,X 必须是候选键。
例如,一个违反 BCNF 的表可能如下:
| ID | Course | Teacher |
|---|---|---|
| 1 | Math | 张三 |
| 2 | Math | 李四 |
在这个例子中,“Teacher” 列是 “Course” 列的决定因素,但 “Course” 列不是候选键,违反了 BCNF。应该将其分割为两个表:
学生表:
| ID | Course |
|---|---|
| 1 | Math |
| 2 | Math |
教师表:
| Course | Teacher |
|---|---|
| Math | 张三 |
| Math | 李四 |
4NF (第四范式)
第四范式要求数据库表满足 BCNF 的基础上,表中不能存在多值依赖。
例如,一个违反第四范式的表可能如下:
| ID | Course | Hobby |
|---|---|---|
| 1 | Math | Reading |
| 1 | Math | Swimming |
在这个例子中,“Course” 和 “Hobby” 列存在多值依赖,违反了第四范式。应该将其分割为两个表:
学生表:
| ID | Course |
|---|---|
| 1 | Math |
兴趣表:
| ID | Hobby |
|---|---|
| 1 | Reading |
| 1 | Swimming |


