第3课_数据库范式
热度🔥:69 免费课程
授课语音
数据库的范式与反范式(1NF、2NF、3NF、BCNF)
在数据库设计中,范式是用于规范化数据库表结构的一套规则。通过这些规则,可以减少冗余数据、避免数据异常,确保数据库的高效性与可维护性。范式的每一层级都是建立在前一层的基础之上,每一层范式都比上一层更加严格。
1. 第一范式(1NF)
第一范式要求数据库中的每个字段只能包含一个值,也就是说,表中的每一列都必须是原子性的。原子性是指列中不能包含多个值或重复的字段。例如,假设一个学生表包含一个“课程”字段,值是一个包含多个课程名称的列表,那么这个字段就不满足第一范式。
1.1 例子说明
假设有以下的学生表,里面的“课程”字段包含多个课程:
学生表:
| 学号 | 姓名 | 课程 |
|------|-------|----------------------|
| 1 | 张三 | 数学, 英语, 物理 |
| 2 | 李四 | 化学, 生物 |
这个表不符合第一范式,因为“课程”字段中有多个值。
1.2 规范化为第一范式
我们需要将“课程”列拆分成单一的课程记录,这样每个字段都只有一个值:
学生表(第一范式):
| 学号 | 姓名 | 课程 |
|------|-------|--------|
| 1 | 张三 | 数学 |
| 1 | 张三 | 英语 |
| 1 | 张三 | 物理 |
| 2 | 李四 | 化学 |
| 2 | 李四 | 生物 |
2. 第二范式(2NF)
第二范式是在第一范式的基础上,要求消除部分依赖。部分依赖是指在一个复合主键表中,某些非主键属性只依赖于主键的一部分,而不是依赖于整个主键。为了符合第二范式,表中的所有非主键字段都必须完全依赖于整个主键。
2.1 例子说明
假设有以下的表,其中“学号”和“课程”共同构成了主键:
学生课程表:
| 学号 | 课程 | 教师 | 教室 |
|------|--------|--------|------|
| 1 | 数学 | 王老师 | A101 |
| 1 | 英语 | 李老师 | A102 |
| 2 | 化学 | 张老师 | A103 |
| 2 | 物理 | 王老师 | A101 |
在这个表中,“教师”和“教室”只依赖于“课程”,而不依赖于整个复合主键“学号”和“课程”。因此,这个表不符合第二范式。
2.2 规范化为第二范式
我们需要将“教师”和“教室”信息移到另一个表中,这样它们就完全依赖于“课程”而不是“学号”和“课程”:
学生课程表:
| 学号 | 课程 |
|------|--------|
| 1 | 数学 |
| 1 | 英语 |
| 2 | 化学 |
| 2 | 物理 |
课程信息表:
| 课程 | 教师 | 教室 |
|--------|--------|------|
| 数学 | 王老师 | A101 |
| 英语 | 李老师 | A102 |
| 化学 | 张老师 | A103 |
| 物理 | 王老师 | A101 |
3. 第三范式(3NF)
第三范式要求消除传递依赖。传递依赖是指一个非主键字段通过其他非主键字段间接依赖于主键。为了符合第三范式,表中的非主键字段必须直接依赖于主键,不能通过其他非主键字段依赖。
3.1 例子说明
假设有以下的表,其中“学号”是主键,“课程”和“教师”是非主键字段,而“教室”依赖于“教师”:
学生课程表:
| 学号 | 课程 | 教师 | 教室 |
|------|--------|--------|--------|
| 1 | 数学 | 王老师 | A101 |
| 1 | 英语 | 李老师 | A102 |
| 2 | 化学 | 张老师 | A103 |
| 2 | 物理 | 王老师 | A101 |
在这个表中,“教室”字段依赖于“教师”,而“教师”又依赖于主键“学号”和“课程”,因此“教室”间接地依赖于主键,形成了传递依赖。
3.2 规范化为第三范式
我们需要将“教师”和“教室”移到另一个表中,使得“教室”字段直接依赖于“教师”,而“教师”依赖于“课程”:
学生课程表:
| 学号 | 课程 | 教师 |
|------|--------|--------|
| 1 | 数学 | 王老师 |
| 1 | 英语 | 李老师 |
| 2 | 化学 | 张老师 |
| 2 | 物理 | 王老师 |
教师教室表:
| 教师 | 教室 |
|--------|--------|
| 王老师 | A101 |
| 李老师 | A102 |
| 张老师 | A103 |
4. 博茨-科德范式(BCNF)
博茨-科德范式(BCNF)是第三范式的加强版。BCNF要求每个决定因素都必须是候选键。换句话说,表中的每个非主键字段都必须完全依赖于候选键,不能依赖于其他非主键字段。
4.1 例子说明
假设有以下的表,其中“课程”和“学号”共同构成主键,而“教师”依赖于“课程”,同时“教室”依赖于“教师”:
学生课程表:
| 学号 | 课程 | 教师 | 教室 |
|------|--------|--------|--------|
| 1 | 数学 | 王老师 | A101 |
| 1 | 英语 | 李老师 | A102 |
| 2 | 化学 | 张老师 | A103 |
| 2 | 物理 | 王老师 | A101 |
在这个表中,“教师”依赖于“课程”,而“课程”是候选键的一部分。因此,表不符合BCNF。
4.2 规范化为BCNF
我们需要将“教师”和“教室”移到另一个表中,并且确保所有的决定因素都是候选键:
学生课程表:
| 学号 | 课程 |
|------|--------|
| 1 | 数学 |
| 1 | 英语 |
| 2 | 化学 |
| 2 | 物理 |
课程教师表:
| 课程 | 教师 |
|--------|--------|
| 数学 | 王老师 |
| 英语 | 李老师 |
| 化学 | 张老师 |
| 物理 | 王老师 |
教师教室表:
| 教师 | 教室 |
|--------|--------|
| 王老师 | A101 |
| 李老师 | A102 |
| 张老师 | A103 |
通过这种方式,我们将表格规范化到了BCNF,从而避免了任何违反范式的依赖关系。
总结
通过将数据库表规范化到不同的范式(如1NF、2NF、3NF和BCNF),我们可以确保数据的完整性,避免冗余和异常,提高数据库的效率和可维护性。每一范式的应用都是在减少不必要的依赖关系,使数据结构更加清晰和简洁。