前言
- 什么是数据库范式?
是数据库表的设计依据,教我们怎么进行数据库表的设计。
(按照下文中的范式进行数据库表的设计,不会造成数据冗余,空间浪费。)
- 范式分类
- 第一范式:
要求每一张表都有主键(primary key),且每个字段都是原子的,不可再分的。- 第二范式:
建立在第一范式的基础上,要求所有的非主键字段完全依赖于主键字段,不能有部分依赖的情况。- 第三范式:
建立在第二范式的基础上,要求所有的非主键字段直接依赖于主键字段,不能有间接依赖的情况。
1. 第一范式
最核心,也是最重要的范式,所有的表的设计必须要满足第一范式。
必须要有主键(pk),所有的字段都是原子不可再分的
- 举例:学生表(如下)
分析:
上表(学生表)不符合第一范式。因为:
- 没有主键;
- 联系方式还可以分为电话号码、邮箱。
改一下:
2. 第二范式
建立在第一范式的基础上,要求所有的非主键字段必须完全依赖于主键,不能出现部分依赖。
- 举例:学生老师关系表(如下)
- 分析一:
- 学生老师关系表明显是一个多对多的关系,即一个老师可以对应多个学生,一个学生也可以对应多个老师;
- 上表不符合第一范式,因为没有设置主键(pk)
–>现在设置复合主键,使该表满足第一范式:
create table stu_tea(
stu_id int comment '学生编号',
tea_id int comment '老师编号',
stu_name varchar(225) comment '学生姓名',
tea_name varchar(225) comment '老师姓名',
#设置复合主键
primary key(stu_id,tea_id)
);
- 分析二:
- 上表添加了复合主键后,满足了第一范式;
- 但是不满足第二范式,因为:tea_name依赖于tea_id, stu_name依赖于stu_id,出现了部分依赖。
- 改一下:
多对多,三个表,关系表,两外键!!!
学生表:
老师表:
学生老师关系表:
3. 第三范式
建立在第二范式的基础上,要求所有的非主键字段必须直接依赖于主键字段,不能出现间接依赖。
- 举例:学生班级关系表(如下)
- 分析
- 学生与班级的关系明显是一对多的关系,即一个班级对应多个学生;
- 上表(学生班级关系表)满足第一范式,第二范式;
- 但不满足第三范式,因为:class_name 依赖于 class_no,class_no 依赖于 stu_id,出现了间接依赖。
- 改一下:
一对多,两张表,多的那个加外键!!!
班级表:
学生表: