总结:
- 1NF 列的原子性
- 2NF 包含1NF,且非主键列依赖主键所有内容
- 3NF 包含 2NF,且非主键列直接依赖主键,不能间接依赖
第一范式(1NF)
强调列的原子性,即列不能够再分成其他几列。
考虑有这样一个表:【联系人】(姓名、性别、电话)
如果在实际场景中,一个联系人有家庭电话和公司电话,那么这种表结构就不符合1NF,应把电话列拆分成家庭电话和公司电话。
第二范式(2NF)
首先是1NF,另外还有两部分内容。
1. 一个表必须有一个主键。
2. 不在主键里的列必须依赖主键的所有内容,而不能只依赖主键的一部分。
例如有一个【选课系统表】:
学号 | 学生 | 课程 | 教材 | 上课地点 |
---|---|---|---|---|
001 | 张三 | 高等数学 | 高等数学(第七版) | 701 |
001 | 张三 | 大学英语 | 大学英语(第一版) | 702 |
001 | 张三 | 大学物理 | 大学物理第二版 | 703 |
002 | 李四 | 高等数学 | 高等数学(第七版) | 704 |
只考虑同一门课只用一本教材的情况
主键为【学号】【学生】【课程】,上课地点完全依赖于【学号】【学生】【课程】,但【教材】列中的只依赖于课程,所以不符合2NF。易产生数据冗余。
应把数据库拆分成【选课系统】(学号、学生、课程)和【课程教材】(课程、教材)。来消除教材多次重复的情况。
表1
学号 | 学生 | 课程 | 上课地点 |
---|---|---|---|
001 | 张三 | 高等数学 | 701 |
001 | 张三 | 大学英语 | 702 |
001 | 张三 | 大学物理 | 703 |
002 | 李四 | 高等数学 | 704 |
表2
课程 | 教材 |
---|---|
高等数学 | 高等数学(第七版) |
大学英语 | 大学英语(第一版) |
大学物理 | 大学物理(第二版) |
不符合 2NF 的情况只会出现在主键由超过一个字段构成的表中,因为对单单主键不存在部分依赖问题。
第三范式(3NF)
首先是2NF。另外非主键必须直接依赖于主键,不能存在传递依赖。即不能存在:非主键A依赖于非主键B,非主键B依赖于主键的情况。
订单号 | 购买日期 | 顾客ID | 顾客姓名 | 消费地点 | 顾客住址 |
---|---|---|---|---|---|
00001 | 20170409 | 1001 | 张三 | 深圳 | 上海 |
00002 | 20170501 | 1003 | 李四 | 广州 | 深圳 |
00003 | 20170502 | 1009 | 王五 | 香港 | 北京 |
00004 | 20170505 | 1003 | 李四 | 新加坡 | 深圳 |
上述表格中,主键为订单号,其他列完全依赖于订单号,符合第二范式。但是顾客姓名和顾客住址直接依赖顾客ID(非主键列),而不是直接依赖于主键,所以不符合3NF。应把该表拆分成:
表1
订单号 | 购买日期 | 顾客ID | 消费地点 |
---|---|---|---|
00001 | 20170409 | 1001 | 深圳 |
00002 | 20170501 | 1003 | 广州 |
00003 | 20170505 | 1009 | 香港 |
00004 | 20170505 | 1003 | 新加坡 |
表2
顾客ID | 顾客姓名 | 顾客住址 |
---|---|---|
1001 | 张三 | 上海 |
1003 | 李四 | 深圳 |
1009 | 王五 | 北京 |
- 总结:第二范式和第三范式的区别在于:
- 2NF 要求非主键列依赖于主键的所有列,而不能只依赖于主键的一部分。
- 3NF 要求非主键列直接依赖于主键列,而不是直接依赖于非主键列。