数据库规范——三大范式
数据库规范化,是数据库设计过程中的一系列原理和技术,以减少数据库的数据冗余,增进数据的一致性。共包括:
目前数据库设计最多满足第三范式,范式过高,虽然对数据有更好的约束性,但是会导致关系表增加,令IO操作频繁,尤其是在多表查询的时候,会降低查询效率。
1. 第一范式(1NF):排除重复组的出现,要求数据库的每个列的值域都由原子值组成,每个字段的值只能是单一值。
- 同一个字段不能出现多个值,每个字段的值只能是单一的
- 必须包含主键:否则无法区分两条数据
- 单一字段不能存放多个有意义的值
名字 | 喜欢的水果 |
---|
jack | 苹果,梨子,香蕉 |
petter | 葡萄,西瓜 |
- 同一张表格里面不能出现多个字段表示同一个意思
名字 | 喜欢的水果1 | 喜欢的水果2 | 喜欢的水果3 |
---|
jack | 苹果 | 梨子 | 香蕉 |
petter | 葡萄 | 西瓜 | |
2. 第二范式(2NF):要求数据表中的所有数据都要和该数据表的键(主键或者候选键)有完全依赖关系:如果那些键只和键的一部分有关,和另外的键无关,就需要把它独立出来成为另外一个数据表。
补充:
候选键:主键+外键
- 下表每个字段都是单一值,符合第一范式,此表的键有ID和供应商ID,价格和两个键都有关系,不同组件,不同供应商会有不同的价格,但是供应商名称和组件ID无关,只与供应商ID有关,供应商地址同上,所以此表不符合第二范式,需要将其独立出一张表
组件ID | 价格 | 供应商ID | 供应商名称 | 供应商地址 |
---|
1 | 19.99 | 1 | Stylized Parts | VA |
2 | 20.99 | 1 | Stylized Parts | VA |
3 | 30.99 | 2 | ACME Industries | CA |
==>转化为如下
组件ID | 价格 | 供应商ID |
---|
1 | 19.99 | 1 |
2 | 20.99 | 1 |
3 | 30.99 | 2 |
供应商ID | 供应商名称 | 供应商地址 |
---|
1 | Stylized Parts | VA |
2 | ACME Industries | CA |
3. 第三范式(3NF):所有非键属性只与候选键相关,非键属性间是独立无关的
- 下列表格中的字段小计与字段单价和数量相关,不满足第三范式
订单编号 | 客户名称 | 单价 | 数量 | 小计 |
---|
1000 | peter | ¥35 | 4 | ¥140 |
1001 | jack | ¥30 | 5 | ¥150 |
参考:维基百科