数据库的三大范式
第一范式1NF
确保数据库表字段的原子性
Bad Case
用户表 | |
userId | userInfo |
1 | 广东省 10086 |
2 | 福建省 12321 |
Good Case
用户表 | ||
userId | userInfo | userTel |
1 | 广东省 | 10086 |
2 | 福建省 | 12321 |
Bad Case中把用户所属地区,和用户的电话融合在一起了,没有保证每个字段的原子性
第二范式2NF
在满足第一范式的基础下:
- 一个表必须有一个主键
- 非主键列必须完全依赖于主键,而不能只依赖于主键的一个部分
Bad Case
选课关系表 | |||||
stuId | stuName | age | courseName | grade | credit |
1 | 张三 | 18 | 计算机组成原理 | 2023 | 4 |
1 | 张三 | 18 | 计算机网络 | 2023 | 3 |
2 | 李四 | 19 | 机器学习 | 2022 | 2 |
在Bad Case中,主键为\(<studId,courseName>\),其中\(credit\)完全依赖于\(courseName\),\(stuName,age\)完全依赖于\(stuId\),不符合第二范式,会产生以下问题:
- 数据冗余:一个学生选\(n\)门课,学生名字和学号就会重复\(n\)次
- 插入异常:插入一门新的课,因为还没有学生选修,无法保存这一门课到表中
第三范式3NF
在满足第二范式的基础下:
- 非主键列必须直接依赖于主键,不能存在传递依赖
Bad Case
学生关系表 | ||||
stuId | stuName | age | academyId | academyTel |
1 | 张三 | 18 | 6 | 10086 |
2 | 李四 | 19 | 6 | 10086 |
3 | 王五 | 18 | 21 | 12321 |
在Bad Case中,主键为\(stuId\),其中\(academyId\)依赖于\(stuId\),而\(academyTel\)依赖于\(academyId\),存在传递依赖,不符合第三范式