浅谈MySQL中数据表设计三范式

数据表设计三范式

一.什么是设计范式

是设计数据表的依据,按照三大范式来设计,可以减少数据冗余,加快数据检索速度

二.三大范式

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

后续

当然我们在实际开发之中,还是需要灵活运用,以解决需求为主要目的,有时会为了执行速度而使得数据表冗余。

猜你喜欢

转载自blog.csdn.net/storm_55/article/details/107426354