# 数据库三范式

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

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

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

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

# 第一范式

每张表有主键就好了。

# 第二范式

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

stu_idtea_idstu_nametea_name
1001001王老师张三
1002002赵老师李四
1003001贾雨村林黛玉

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

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

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

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

学生表:

stu_idstu_name
1001张三
1002李四
1003林黛玉

教师表:

tea_idtea_name
001王老师
002赵老师
003贾雨村

学生教师关系表:

idstu_id(外键)tea_id(外键)
11001001
21002002
31003003

# 多对多设计:

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

# 第三范式

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

stu_idstu_nameclass_idclass_name
1001张三01一年一班
1002李四02一年二班
1003林黛玉03一年三班

满足第一、第二范式。

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

设计一对多:
班级表:一

class_idclass_name
01一年一班
02一年二班
03一年三班

学生表:多

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

# 一对多设计:

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

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

# 一对一设计

一对一,外键唯一。