数据库三范式

第一范式:要求任何一张表必须有主键,每一个字段原子性不可再分。

第二范式:建立在第一范式的基础之上,要求所有非主键字段完全依赖主键,不要产生部分部分依赖。

第三范式:建立在第二范式的基础至上,要求所有非主键字段直接依赖主键。

目的:避免表中数据的冗余,空间的浪费。

第一范式

每张表有主键就好了。

第二范式

在满足第一范式的基础上再满足第二范式。

stu_id tea_id stu_name tea_name
1001 001 王老师 张三
1002 002 赵老师 李四
1003 001 贾雨村 林黛玉

为满足第一范式我们将stu_idtea_id这两个字段联合做主键,复合主键。但是这满足第二范式吗?

不满足,“张三” 依赖 “1001”,“王老师” 依赖 “001”,显然产生了部份依赖(部分依赖就是这个意思)。

部分依赖的缺点:数据冗余。空间浪费。“张三” 重复了,"王老师"重复了。

为了符合第二范式,我们需要使用三张表来满足多对多的关系。

学生表:

stu_id stu_name
1001 张三
1002 李四
1003 林黛玉

教师表:

tea_id tea_name
001 王老师
002 赵老师
003 贾雨村

学生教师关系表:

id stu_id(外键) tea_id(外键)
1 1001 001
2 1002 002
3 1003 003

多对多设计:

多对多,三张表,关系表两个外键。

第三范式

建立在第二范式的基础之上。

stu_id stu_name class_id class_name
1001 张三 01 一年一班
1002 李四 02 一年二班
1003 林黛玉 03 一年三班

满足第一、第二范式。

但是,一年一班依赖01,01依赖1001,产生了传递依赖。不符合第三范式,产生了数据冗余。

设计一对多:
班级表:一

class_id class_name
01 一年一班
02 一年二班
03 一年三班

学生表:多

stu_id stu_name class_id(外键)
1001 张三 01
1002 李四 02
1003 林黛玉 03

一对多设计:

一对多,两张表,多的表加外键。

除了多对多设计和一对多设计外还有一个一对一设计。

一对一设计

一对一,外键唯一。