写在前面:
为了建立冗余较小,数据结构合理的数据库,设计数据库时,必须遵循一定的准则,这种规则就成为范式(Normal Form)。设计范式共有6种--第一范式(1NF ),第二范式(2NF ),第三范式(3NF ),巴斯-科德范式(BCNF ),第四范式(4NF ),第五范式(5NF完美范式)。
在实际开发中,常用的范式有3种。
(1)第一范式(1NF):
数据库表中的所有字段值是不可分割的原子值,而不能是数组,集合,记录非原子数据项。
例如:
姓名 | 性别 | 学校 |
A | 男 | 清华大学 |
B | 女 | 北京大学 |
在一张记录个人信息的表中,有---'姓名''性别''学校'等字段。由于第一范式要求,所有字段都是不可分割的原子值,'学校'这个字段有可能会分为---'初中','高中','大学'等,所以我们应该讲表中字段修改为----'姓名''性别''初中''高中''大学'。
(2)第二范式(2NF):
在第一范式的基础上,数据库表中的每一个实例和记录,必须被唯一的区分,选取一个能区分每个实体的属性作为唯一标识。且,实体的属性必须完全依赖于主关键字。
每张表只表达一个意思,表中的每个字段与主键有依赖关系,不能只根主键的一部分有关系(针对联合主键)。
例如:
订单编号 | 商品编号 | 订单地址 | 订单时间 |
0001 | 000A | 北京市朝阳区 | 2018.01.01 |
0002 | 000B | 辽宁省沈阳市 | 2018.02.01 |
一张订单表为的主键为联合主键{订单编号,商品编号},那么表中的其他属性{订单地址,订单时间}对订单编号为完全依赖,而对商品编号为部分依赖,那么为了符合第二范式,我们再列出一张表,记录商品编号,而将这张表记录为订单编号这一唯一主键。
(3)第三范式(3NF):
在第二范式的基础上,如果数据库表中不存在非关键字段对候选关键字段的传递函数依赖关系,则符合是第三范式。表中的主键之外的其他字段都和主键有直接依赖关系(不能是间接依赖关系)。
例如:
商品名称 | 分类 | 分类描述 |
柠檬 | 水果 | XXXXX |
牛排 | 肉类 | XXXXX |
一个商品表具有几个字段,'商品名称' '分类''分类描述','商品名称'为唯一主键,而'分类描述'这一字段实际上与主键'商品名称'的关系,为间接关系(通过'分类'-'商品名称'的传递函数才产生间接关系),所以不符合第三范式。