前言
数据库课本上都把范式写到五范式了,但是实际应用中,满足三范式已经足够了,五范式太多余了。
三种范式是条件递增的联系(即后一个范式是在前一个条件满足的情况下引入新的条件)。
例如
|
范式 |
满足条件 |
|
一范式(1NF) |
条件a |
|
二范式(2NF) |
条件a,条件b |
|
三范式(3NF) |
条件a,条件b,条件c |
下面详细解释一下
第一范式(1nf)
满足条件:
- 原子性,即数据库表里的字段都是不可分割的
例如下面学生表的设计明显不满足要求,年级专业是可以再分的,就不能偷懒放在一块
|
学号 |
姓名 |
年龄 |
年级专业 |
|
201511216776 |
王玉伟 |
20 |
15级软工 |
符合第一范式的做法为
|
学号 |
姓名 |
年龄 |
年级 |
专业 |
|
201511216776 |
王玉伟 |
20 |
15级 |
软工 |
第二范式(2nf)
满足条件:
- 原子性,即数据库表里的字段都是不可分割的
- 表中必须有主键
- 其他非主属性必须完全依赖主键(不能依赖主键一部分,这是针对联合主键说的)
针对条件三解释一下(假设学号为主键)
我们以学号为主键的时候,确保该学生别的字段都完全依赖学号,不能出现下面这种课程名不依赖学号而依赖课程号的设计。
|
学号 |
姓名 |
年龄 |
课程名 |
课程号 |
|
201511216776 |
王玉伟 |
20 |
英语 |
20003 |
符合第二范式的做法
|
学号 |
姓名 |
年龄 |
|
201511216776 |
王玉伟 |
20 |
|
课程名 |
课程号 |
|
英语 |
20003 |
解释一下联合主键中的要求
下面是我之前设计的一个表,学号sno与课程号cno做联合主键,而第二范式要求的完全依赖,下表并没有做到从这个表中可以看出,姓名依赖学号,课程名依赖课程号,但是这都是依赖了一部分,只有成绩对学号和课程号都依赖,因此是不符合第二范式的

符合第二范式的设计为(即拆成三个表,只展示一下表的字段)
|
Sno |
Cno |
grade |
|
Cno |
cname |
|
Sno |
sname |
第三范式(3nf)
满足条件:
- 原子性,即数据库表里的字段都是不可分割的
- 表中必须有主键
- 其他非主属性必须完全依赖主键(不能依赖主键一部分,这是针对联合主键说的)
- 非表中主键字段完全直接依赖主键,不能是传递依赖
例如下表,学院依赖于主键学号,但是学院地址 依赖于学院,这样对主键就是不是直接依赖(这里可能会有人疑问地址也是能拆成省市区的字段,这里不拆也是可以的,因为表示的就是地址字段)
|
学号 |
姓名 |
年龄 |
年级 |
学院 |
学院地址 |
|
201511216776 |
王玉伟 |
20 |
15级 |
计算机学院 |
内蒙古呼和浩特市赛罕区 |
符合第三范式的做法(删去有间接依赖的字段)
|
学号 |
姓名 |
年龄 |
年级 |
学院 |
|
201511216776 |
王玉伟 |
20 |
15级 |
计算机学院 |
1299





