数据库三范式
数据库三范式
第一范式:要求任何一张表必须有主键,每一个字段原子性不可再分。
第二范式:建立在第一范式的基础之上,要求所有非主键字段完全依赖主键,不要产生部分部分依赖。
第三范式:建立在第二范式的基础至上,要求所有非主键字段直接依赖主键。
目的:避免表中数据的冗余,空间的浪费。
第一范式
每张表有主键就好了。
第二范式
在满足第一范式的基础上再满足第二范式。
stu_id | tea_id | stu_name | tea_name |
---|---|---|---|
1001 | 001 | 王老师 | 张三 |
1002 | 002 | 赵老师 | 李四 |
1003 | 001 | 贾雨村 | 林黛玉 |
为满足第一范式我们将stu_id
和tea_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 |
一对多设计:
一对多,两张表,多的表加外键。
除了多对多设计和一对多设计外还有一个一对一设计。
一对一设计
一对一,外键唯一。
Author: xun
Link: http://blog.fooo.in/2022/07/12/database/normalization/
License:
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。