在数据库设计中,范式是确保数据库表中数据完整性和减少数据冗余的基本规则。数据库范式由E.F. Codd在1970年代提出,它们定义了数据库设计中的“好”数据模型。下面,我们将详细介绍数据库的几个基本范式,并通过例题解析来帮助读者轻松掌握。
第一范式(1NF)
定义
第一范式(1NF)是数据库设计的最低标准,它要求表中的所有字段都是不可分割的原子值,也就是说,表中不能有重复组。
例题
假设我们有一个学生信息表,如下所示:
| 学号 | 姓名 | 年龄 | 地址 | 地址 |
|---|---|---|---|---|
| 1 | 张三 | 20 | 北京 | 北京市 |
| 2 | 李四 | 22 | 上海 | 上海市 |
解析
这个表违反了第一范式,因为“地址”列中有重复的值。正确的做法是将地址信息拆分成一个新的表:
| 学号 | 姓名 | 年龄 | 地址ID |
|---|---|---|---|
| 1 | 张三 | 20 | 1 |
| 2 | 李四 | 22 | 2 |
| 地址ID | 地址 |
|---|---|
| 1 | 北京市 |
| 2 | 上海市 |
第二范式(2NF)
定义
第二范式(2NF)在满足第一范式的基础上,要求表中的非主属性完全依赖于主键。
例题
假设我们有一个学生选课信息表,如下所示:
| 学号 | 课程名 | 教师名 | 年龄 | 姓名 |
|---|---|---|---|---|
| 1 | 高等数学 | 张老师 | 40 | 张三 |
| 2 | 高等数学 | 李老师 | 38 | 李四 |
| 3 | 线性代数 | 王老师 | 42 | 王五 |
解析
这个表违反了第二范式,因为“年龄”和“姓名”依赖于“学号”,而不是主键“学号+课程名”。正确的做法是将学生信息和教师信息拆分成两个表:
| 学号 | 课程名 | 教师ID |
|---|---|---|
| 1 | 高等数学 | 1 |
| 2 | 高等数学 | 2 |
| 3 | 线性代数 | 3 |
| 教师ID | 教师名 | 年龄 |
|---|---|---|
| 1 | 张老师 | 40 |
| 2 | 李老师 | 38 |
| 3 | 王老师 | 42 |
第三范式(3NF)
定义
第三范式(3NF)在满足第二范式的基础上,要求表中的非主属性不仅完全依赖于主键,而且不传递依赖于其他非主属性。
例题
假设我们有一个学生选课信息表,如下所示:
| 学号 | 课程名 | 教师名 | 教师ID | 教师年龄 | 专业 |
|---|---|---|---|---|---|
| 1 | 高等数学 | 张老师 | 1 | 40 | 计算机科学与技术 |
| 2 | 高等数学 | 李老师 | 2 | 38 | 电子信息工程 |
| 3 | 线性代数 | 王老师 | 3 | 42 | 自动化 |
解析
这个表违反了第三范式,因为“专业”依赖于“教师ID”,而不是主键“学号+课程名”。正确的做法是将学生信息、教师信息和专业信息拆分成三个表:
| 学号 | 课程名 | 教师ID |
|---|---|---|
| 1 | 高等数学 | 1 |
| 2 | 高等数学 | 2 |
| 3 | 线性代数 | 3 |
| 教师ID | 教师名 | 年龄 | 专业 |
|---|---|---|---|
| 1 | 张老师 | 40 | 计算机科学与技术 |
| 2 | 李老师 | 38 | 电子信息工程 |
| 3 | 王老师 | 42 | 自动化 |
通过以上例题解析,相信读者对数据库范式有了更深入的了解。在实际应用中,合理运用数据库范式可以有效地提高数据库的性能和数据的完整性。
