# 数据库设计三大范式-白话版
# 第一范式(1NF)
确保每个字段都是不可再分的原子值
想象一下你的数据库表格,每一个格子(字段)里只能有一个值,不能有一组值或一个列表。比如,你有一个表格记录学生的联系方式,联系方式这一栏里只能有一个电话号码,不能写多个电话号码。
例子:
不符合1NF:
| 学生ID | 姓名 | 电话号码 |
|-------|------|----------------|
| 1 | 张三 | 123456, 789012 |
符合1NF:
| 学生ID | 姓名 | 电话号码 |
|-------|------|--------|
| 1 | 张三 | 123456 |
| 1 | 张三 | 789012 |
# 第二范式(2NF)
消除部分依赖
第二范式在第一范式的基础上,确保每个非主键字段完全依赖于主键。也就是说,不能有字段只依赖于主键的一部分,而必须依赖于整个主键。
例子: 如果我们有一个学生选课的表格,主键是由“学生ID”和“课程ID”共同组成的,那么每个非主键字段(比如成绩)必须依赖于这两个字段的组合,而不能只依赖于其中一个。
不符合2NF:
| 学生ID | 课程ID | 学生姓名 | 课程名 | 成绩 |
|-------|--------|--------|------|-----|
| 1 | 101 | 张三 | 数学 | 90 |
这里的“学生姓名”和“课程名”只依赖于“学生ID”和“课程ID”的一部分,不是组合依赖。
符合2NF: 将表分解为两个表:
学生表:
| 学生ID | 学生姓名 |
|-------|--------|
| 1 | 张三 |
课程表:
| 课程ID | 课程名 |
|-------|------|
| 101 | 数学 |
成绩表:
| 学生ID | 课程ID | 成绩 |
|-------|--------|-----|
| 1 | 101 | 90 |
# 第三范式(3NF)
消除传递依赖
第三范式在第二范式的基础上,确保每个非主键字段只依赖于主键,而不依赖于其他非主键字段。就是说,非主键字段之间不能有依赖关系。
例子: 如果我们有一个表格记录学生信息,包含学号、姓名、系别、系主任,那么系主任信息应该直接依赖于系别,而不是学号。
不符合3NF:
| 学号 | 姓名 | 系别 | 系主任 |
|-------|------|------|-------|
| 1 | 张三 | 计算机 | 王教授 |
这里的“系主任”依赖于“系别”,而“系别”又依赖于“学号”。
符合3NF: 将表分解为两个表:
学生表:
| 学号 | 姓名 | 系别 |
|-------|------|------|
| 1 | 张三 | 计算机 |
系别表:
| 系别 | 系主任 |
|------|-------|
| 计算机 | 王教授 |
通过应用这些范式,可以使数据库设计更加合理,减少数据冗余,提高数据一致性和可维护性。