数据库相关笔记④
闭包 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 |