关于数据库范式的一点浅显的理解
因为看不懂复杂的定义和概念,只能写几个小例子记录下来。作者纯小白,如果有错误还请指正~
- 1NF 原子项,不可再分
- 2NF 非主键要绝对依赖主键,消除部分依赖
- 3NF 不包含其它表中的非主键信息
1 NF
每一个属性都是原子项,不能再分割。下面这个例子中,联系方式可再分为email和tel,所以不满足1NF
| ID | 姓名 | 年龄 | 联系方式 |
|---|---|---|---|
| 1 | asdf | 18 | email:[email protected]; tel:183000 |
| 2 | qwerty | 24 | email:[email protected]; tel:183111 |
2 NF
非主键要依赖于主键。下面举个反例
| ID | 教师名 | 课程 | 教材 |
|---|---|---|---|
| 1 | asdf | java | 《java从入门到放弃》 |
| 2 | qwerty | python | 《python实战》 |
| 3 | zxcv | 树莓派 | 《树莓派蓝图权威宝典》 |
在这个表中,主键是ID,但是教材不依赖于主键,而是依赖与课程。也就是说,主键ID不能唯一地决定教材,所以说教材部分依赖于主键。2NF就是要消除这个部分依赖。
应当把课程和教材拿出来单独成立一个表
| 课程 | 教材 |
|---|---|
| java | 《java从入门到放弃》 |
| python | 《python实战》 |
| 树莓派 | 《树莓派蓝图权威宝典》 |
3 NF
数据表中不能包含其它表的非主键信息。
表1:
| 部门ID | 部门名 | 部门简介 |
|---|---|---|
| … | … | … |
表2:
| 员工ID | 部门ID | 部门名 | 部门简介 |
|---|---|---|---|
| … | … | … | … |
表2中,就包含了表1中的非主键信息:部门名、部门简介。