一、第一范式
第一范式是指:表中含有主键,且每个字段原子性不可再分。
学生表
学生编号 | 姓名 | 联系方式 |
---|---|---|
1 | 张三 | zs@qq.com,12345678911 |
2 | 李四 | ls@qq.com,12345678912 |
3 | 王五 | ww@qq.com,12345678913 |
在学生表中,联系方式字段可再分,联系方式可以拆分为邮箱、手机号,此时不满足第一范式。
修改后学生表
学生编号 | 姓名 | 邮箱 | 手机号 |
---|---|---|---|
1 | 张三 | zs@qq.com | 12345678911 |
2 | 李四 | ls@qq.com | 12345678912 |
3 | 王五 | ww@qq.com | 12345678913 |
此时满足第一范式,各个字段不可再分。
二、第二范式
第二范式是指:在第一范式的基础上,非主键字段必须完全依赖主键,不能存在部份依赖。
学生老师关系表
学号 | 学生姓名 | 老师编号 | 老师姓名 |
---|---|---|---|
101 | 张三 | 1001 | 王老师 |
102 | 李四 | 1002 | 陈老师 |
102 | 李四 | 1001 | 王老师 |
在学生老师关系表中是否满足第一范式?
答:不满足,表中不存在主键。
怎么修改才能使学生老师关系表满足第一范式?
答:将学号和老师编号进行复合,构成复合主键。
修改后的学生老师关系表
学号+老师编号 | 学生姓名 | 老师姓名 |
---|---|---|
101 1001 | 张三 | 王老师 |
102 1002 | 李四 | 陈老师 |
102 1001 | 李四 | 王老师 |
此时的学生老师关系表满足第一范式,但是满足第二范式吗?
答:不满足,因为学生姓名依赖于学号,老师姓名依赖老师编号,并不完全依赖主键,存在部份依赖。
怎么修改使学生老师关系表满足第二范式?
答:学生和老师之间是多对多关系,可以分成三个表,学生表、老师表、学生老师关系表(含两个外键)。
学生表
学号 | 学生姓名 |
---|---|
101 | 张三 |
102 | 李四 |
老师表
老师编号 | 学生姓名 |
---|---|
1001 | 王老师 |
1002 | 陈老师 |
学生老师关系表
id | 学号 | 老师编号 |
---|---|---|
1 | 101 | 1001 |
2 | 102 | 1002 |
3 | 102 | 1001 |
此时满足第二范式,不存在部份依赖。
三、第三范式
第三范式是指:在第二范式的基础上,非主键字段之间不存在传递依赖。
学生班级表
学号 | 学生姓名 | 班级编号 | 班级名称 |
---|---|---|---|
1 | 张三 | 1001 | 一班 |
2 | 李四 | 1001 | 一班 |
3 | 王五 | 1002 | 二班 |
学生班级表满足第三范式吗?
答:不满足,在表中主键为学号,而班级名称依赖班级编号,班级编号依赖学号,存在传递依赖。
怎么修改使学生班级表满足第三范式?
答:班级和学生之间是一对多关系,可以分成两个表,班级表和学生表,在学生表中加入外键。
班级表
班级编号 | 班级名称 |
---|---|
1001 | 一班 |
1002 | 二班 |
学号 | 学生姓名 | 班级编号 |
---|---|---|
1 | 张三 | 1001 |
2 | 李四 | 1001 |
3 | 王五 | 1002 |
此时满足第三范式,不存在传递依赖。
总结
第一范式:存在主键,各个字段原子性不可再分。
第二范式:在第一范式基础上,不存在部份依赖。
第三范式:在第二范式基础上,不存在传递依赖。(部份依赖和传递依赖都会造成冗余和空间浪费)
注意:三大范式是理论基础,但是在实际开发中,不一定要满足三大范式,以实际情况和客户需求为主。有时候会用冗余来换取速度,因为在SQL中表和表之间连接次数越多,效率越低。
因此在开发中如果表的设计不满足三大范式,也是合理的。