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

 

posted @ 2020-11-24 22:28  棉花糖88  阅读(101)  评论(0)    收藏  举报