白话版三大属性:
第一范式:每个属性只能有一个值
第二范式:非主键要完全依赖于主键,联合主键(多个主键)的情况下,非主键要全都依赖
第三范式:消除传递依赖
每个范式都要在其前面范式成立的情况下
1. 第一范式(1NF)
定义
第一范式要求数据库表中的每一列都是原子的,即每个字段都不能再分割。每个字段只能存储单一的数据元素。
示例
假设我们有一个学生成绩表,存储学生的姓名、学号和课程成绩:
学号 | 姓名 | 课程成绩 |
---|---|---|
1 | 张三 | 数学:85, 英语:90 |
2 | 李四 | 数学:78, 英语:82 |
在这个表中,课程成绩
列存储了多个值,不符合第一范式。我们可以将其拆分为多个列,使每个字段都是原子的:
学号 | 姓名 | 课程 | 成绩 |
---|---|---|---|
1 | 张三 | 数学 | 85 |
1 | 张三 | 英语 | 90 |
2 | 李四 | 数学 | 78 |
2 | 李四 | 英语 | 82 |
分析
通过将 课程成绩
列拆分为 课程
和 成绩
两列,我们确保每个字段都是不可再分的最小单元,从而满足了第一范式。
2. 第二范式(2NF)
定义
第二范式在满足第一范式的基础上,要求非主属性完全依赖于主键(即消除部分依赖)。如果一个表的主键是由多个列组成的联合主键,则所有非主属性必须完全依赖于整个主键,而不能只依赖于其中的一部分。
示例
假设我们有一个学生选课表,存储学生的学号、姓名、课程和成绩:
学号 | 姓名 | 课程 | 成绩 |
---|---|---|---|
1 | 张三 | 数学 | 85 |
1 | 张三 | 英语 | 90 |
2 | 李四 | 数学 | 78 |
2 | 李四 | 英语 | 82 |
在这个表中,联合主键是 学号
和 课程
,但 姓名
只依赖于 学号
,而不是整个联合主键。这不符合第二范式。我们可以将其拆分为两个表,即变成单主键:
学生表:
学号 | 姓名 |
---|---|
1 | 张三 |
2 | 李四 |
成绩表:
学号 | 课程 | 成绩 |
---|---|---|
1 | 数学 | 85 |
1 | 英语 | 90 |
2 | 数学 | 78 |
2 | 英语 | 82 |
分析
通过将学生信息和成绩信息分开存储,我们确保了所有非主属性完全依赖于主键,从而满足了第二范式。
3. 第三范式(3NF)
定义
第三范式在满足第二范式的基础上,要求非主属性不依赖于其他非主属性(即消除传递依赖)。换句话说,一个非主属性不能依赖于另一个非主属性。
示例
假设我们有一个课程表,存储课程编号、课程名称和教师信息:
课程编号 | 课程名称 | 教师编号 | 教师姓名 |
---|---|---|---|
101 | 数学 | T01 | 王老师 |
102 | 英语 | T02 | 李老师 |
在这个表中,教师姓名
依赖于 教师编号
,而 教师编号
又依赖于 课程编号
。这存在传递依赖,不符合第三范式。我们可以将其拆分为两个表:
课程表:
课程编号 | 课程名称 | 教师编号 |
---|---|---|
101 | 数学 | T01 |
102 | 英语 | T02 |
教师表:
教师编号 | 教师姓名 |
---|---|
T01 | 王老师 |
T02 | 李老师 |
分析
通过将教师信息独立存储在一个表中,我们消除了传递依赖,从而满足了第三范式。