16、设计三范式(重要)
三范式总结:
有主键,字段原子性不可再分,不能部分依赖,不能传递依赖。
按照三方式设计的表不会冗余。
实际开发中,会适当用冗余换取执行效率。
第一范式:任何一张表都应该有主键,并且每一个字段原子性不可再分。

问题:学生编号101重复了,没有主键。联系方式可以再分,不是原子性。
解决:增加主键 拆分字段
| sno(pk) | sname | email | phone(unique) |
---------------------------------------------------------
| 101 | 张三 | 102512@qq.com | 52656899997
| 102 | 李四 | 525253@qq.com | 15635124568
| 103 | 王五 | 364557@qq.com | 85858855244
第二范式:所有非主键字段必须依赖主键,不能产生部分依赖(基于第一范式之上)

问题:主键是联合主键,冗余了 '学生姓名' 和 '教师姓名' 两个字段。
学生依赖于联合主键中的学生编号,而不依赖于老师编号,冗余了学生姓名,产生了部分依赖。
教师依赖于联合主键中的教师编号,而不依赖于学生编号,冗余了教师姓名,产生了部分依赖。
解决方案:
典型的多对多关系(一个学生有多个老师,一个老师有多个学生)
口诀:多对多 三张表 关系表两个外键
1、学生表 t_student
----------------------
学生编号 姓名
sno(pk) sname
100 张三
101 李四
102 王五、
----------------------
2、老师表 t_teacher
----------------------
老师编号 姓名
tno(pk) tname
10 张老师
11 李老师
12 郝老师
----------------------
3、两者关系表 t_stadunt_teacher
--------------------------------
主键 学生编号 老师编号
id(pk) sno(fk) tno(fk)
1 100 10
2 100 12
3 101 11
4 101 10
5 102 10
6 102 12
外键到学生表 外键到老师表
第三范式:所有非主键字段直接依赖主键,不能产生传递依赖。( 基于第二范式之上 )

问题:班级名称字段存在冗余,因为班级名称没有直接依赖于主键,而是依赖于班级编号,班级编号依赖学生编号,班级名称通过班级编号依赖主键,这就产生了传递依赖。
解决方法:将冗余字段单独建表。
分析:班级和学生的关系就是一对多。
一对多的口诀:一对多 两张表 多的表 加外键
1、班级表 t_class | cno | cname | ------------------- | 101 | 五年一班 | | 102 | 五年二班 | ------------------- 2、学生表 t_class id(pk) sno sname class_no(fk)加外键 ---------------------------------------- 1 1100 张三 1 2 1101 李四 2

浙公网安备 33010602011771号