数据表设计三范式
一.什么是设计范式
是设计数据表的依据,按照三大范式来设计,可以减少数据冗余,加快数据检索速度
二.三大范式
2.1第一范式
任何一张表都应该有主键,并且每一个字段都不能再进行细分
id | name | contact |
---|---|---|
1001 | zhangsan | [email protected],12345 |
1002 | lisi | [email protected] |
1003 | wangwu | [email protected] |
上表违背了第一范式:
1)没有主键
2)contact字段可以再分割
解决方式
id(primary key) | name | e_mail | phone |
---|---|---|---|
1001 | zhangsan | [email protected] | 12345 |
1002 | lisi | [email protected] | 67890 |
1003 | wangwu | [email protected] | 45678 |
2.2第二范式
建立在第一范式的基础之上,所有的非主键字段必须完全依赖主键,不能产生部分依赖
s_id(primary key) | t_id(primary_key) | s_name | t_name |
---|---|---|---|
1 | 1 | zhangsan | t_zhang |
1 | 2 | zhangsan | t_li |
2 | 2 | lisi | t_li |
2 | 3 | lisi | t_wang |
3 | 1 | wangwu | t_zhang |
3 | 3 | wangwu | t_wang |
上表为多对多关系,并且学生编号和教师编号形成了联合主键,并且每一列都不可再分,满足了第一范式,但是学生姓名s_name只依赖s_id,不依赖t_id,因此该表形成了部分依赖,不满足第二范式
解决办法
多对多,使用三张表,学生老师关系表关联外键
t_student学生表
s_id(primary key) | s_name |
---|---|
1 | zhangsan |
2 | lisi |
3 | wangwu |
t_teacher教师表
t_id(primary key) | t_name |
---|---|
1 | t_zhang |
2 | t_li |
3 | t_wang |
关系表
id(primary key) | s_id(foreign key) | t_id(foreign key) |
---|---|---|
1 | 1 | 1 |
2 | 1 | 3 |
3 | 2 | 1 |
4 | 2 | 2 |
5 | 3 | 2 |
6 | 3 | 3 |
2.3第三范式
建立在第二范式之上,所有非主键字段直接依赖主键,不能产生传递依赖
s_id(primary key) | s_name | c_id | c_name |
---|---|---|---|
1001 | zhangsan | 01 | class_one |
1002 | lisi | 01 | class_one |
1003 | wangwu | 02 | class_two |
1004 | zhaoliu | 02 | class_two |
该表满足第一,第二范式,但是c_name依赖于c_id,c_id又依赖于s_name,s_name依赖于s_id,产生了传递依赖,因此不满足第三范式
解决办法
一对多,两张表,多的表设置外键
班级表t_class
c_id(primary key) | c_name |
---|---|
01 | class_one |
02 | class_two |
学生表t_student
s_id(primary key) | s_name | c_id(foreign key) |
---|---|---|
1001 | zhangsan | 01 |
1002 | lisi | 01 |
1003 | wangwu | 02 |
1004 | zhaoliu | 02 |
后续
当然我们在实际开发之中,还是需要灵活运用,以解决需求为主要目的,有时会为了执行速度而使得数据表冗余。