数据库的三大范式
目录
1NF
每个字段的数据保持原子性,不可再分割
示例:
不符合第一范式的表结构
学生ID | 学生信息 |
---|---|
1 | 张三,男,18岁,计算机科学 |
2 | 李四,女,19岁,物理学 |
3 | 王五,男,20岁,数学 |
符合第一范式的表结构
学生ID | 姓名 | 性别 | 年龄 | 专业 |
---|---|---|---|---|
1 | 张三 | 男 | 18 | 计算机科学 |
2 | 李四 | 女 | 19 | 物理学 |
'学生信息'包含了多种属性,因此不符合第一范式,需要将其拆分为多个独立的列
2NF
在满足第一范式的基础上,要求表中每个非主键字段必须完全依赖于主键,而不是主键的一部分
示例:
不符合第二范式的表结构
学生ID | 课程ID | 课程名称 | 成绩 | 讲师姓名 |
---|---|---|---|---|
001 | C001 | 数学 | 90 | 张老师 |
符合第二范式的表结构
学生ID | 课程ID | 成绩 |
---|---|---|
001 | C001 | 90 |
课程ID | 课程名称 | 讲师姓名 |
---|---|---|
C001 | 数学 | 张老师 |
课程名称和讲师姓名并没有完全依赖于学生id ,因此在这种情况下我们应该与课程相关的字段拆分到新的课程表中,然后将课程id字段作为外键存储在学生表
3NF
在满足第二范式的基础上,要求非主键字段之间不存在传递依赖,也就是一个非主键列不能依赖于另一个非主键列
示例:
不满足第三范式的表结构
学生ID | 学生姓名 | 系主任姓名 | 系主任办公室 |
---|---|---|---|
001 | 张三 | 李老师 | 201室 |
满足第三范式的表结构
学生ID | 学生姓名 | 系主任ID |
---|---|---|
001 | 张三 | 01 |
系主任ID | 系主任姓名 | 系主任办公室 |
---|---|---|
01 | 李老师 | 201室 |
与第二范式类似,系主任办公室并不依赖于学生id而是依赖于系主任姓名,因此要将整个系主任字段拆分到系主任表中