授课语音

数据库的范式与反范式(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),我们可以确保数据的完整性,避免冗余和异常,提高数据库的效率和可维护性。每一范式的应用都是在减少不必要的依赖关系,使数据结构更加清晰和简洁。

去1:1私密咨询

系列课程: