第一范式(1NF)
第一范式需要满足下面两个条件:1
- 仅包含原子值
- 不能有重复的群组出现
原子值意味着不可被拆分,在下表中的颜色一栏中,[红色、绿色]
可以拆分为红色和绿色,因此不满足1NF
编号 | 颜色 | 价格 |
---|---|---|
1 | 红色、绿色 | 15.99 |
2 | 黄色 | 23.99 |
3 | 绿色 | 17.50 |
4 | 黄色、蓝色 | 9.99 |
5 | 红色 | 29.99 |
重复的群组意味着在一个表中有2个或以上的属性之间的关系十分紧密,在下表中[作者1、作者2、作者3]
是重复的属性,因此不满足1NF
书名 | 作者1 | 作者2 | 作者3 |
---|
对于第一张表,我们可以做如下修改,使其满足1NF
编号 | 价格 |
---|---|
1 | 15.99 |
2 | 23.99 |
3 | 17.50 |
4 | 9.99 |
5 | 29.99 |
编号 | 颜色 |
---|---|
1 | 红色 |
1 | 绿色 |
2 | 黄色 |
3 | 绿色 |
4 | 黄色 |
4 | 蓝色 |
5 | 红色 |
第二范式(2NF)
第二范式要满足一下两个条件2
- 要满足1NF
- 属性的值完全依赖于主键
消费者 | 商店 | 地点 |
---|---|---|
1 | 1 | 北京 |
1 | 3 | 上海 |
2 | 1 | 北京 |
3 | 2 | 郑州 |
4 | 3 | 上海 |
复合主键为[消费者、商店]
,而地点仅仅完全依赖于商店
这个主键,而不是完全依赖于复合主键
因此,可以把它拆分成两个表
消费者 | 商店 |
---|---|
1 | 1 |
1 | 3 |
2 | 1 |
3 | 2 |
4 | 3 |
商店 | 地点 |
---|---|
1 | 北京 |
2 | 郑州 |
3 | 上海 |
这样地点就完全依赖于商店这个主键
第三范式(3NF)
第三范式要满足以下两个条件3
- 满足2NF
- 非键的属性之间是相互独立的
课程代码 | 上课教室代码 | 上课教室 |
---|---|---|
1 | CS01 | 计院01 |
2 | CS06 | 计院06 |
3 | CS07 | 计院07 |
4 | CS10 | 计院10 |
主键为课程代码
,它满足2NF,但是不满足3NF的第二个条件,上课教室代码完全依赖于课程代码,而上课教程完全依赖于上课教室代码,非键属性之间不是相互独立的
上课教室代码-> 上课教室
修改后:
课程代码 | 上课教室代码 |
---|---|
1 | CS01 |
2 | CS06 |
3 | CS07 |
4 | CS10 |
上课教室代码 | 上课教室 |
---|---|
CS01 | 计院01 |
CS06 | 计院06 |
CS07 | 计院07 |
CS10 | 计院10 |
修正表
日期 | 错误信息 |
---|---|
2019-1-6 | 3NF定义错误 |
资料来源