前提:关系型数据库
三大范式
1. 第一范式(1NF)
关系中的每个属性必须是不可再分的原子项,不能是属性组合。
比如数据库中有一个地址的字段,其中某一行存的值为江苏省常州市天宁区XXX公寓
,但经常要单独取这个字段中天宁区这个值,那么这个表就不满足第一范式。应把地址拆分为省份,城市,辖区,详细地址等。
2. 第二范式(2NF)
在第一范式的基础上,确保每列都和主键列相关。
主要针对联合主键。具体例子可以自己百度一下
个人感觉,设计数据库的时候如果都用唯一标识符id的话就不会违反第二范式。
3. 第三范式(3NF)
在第二范式的基础上,确保每列都和主键列直接相关,而不是间接相关。
如果一个关系满足2NF,并且除主键外的其他列都不传递依赖于该主键。
举例:一个订单表,主键是订单号,字段有商品名称,商品数量和商品分类。
那么商品名称和订单号有直接联系,但是商品分类没有直接联系,属于间接联系,所以不满足第三范式。
简单总结:
第一范式是不可拆分
第二范式是完全依赖
第三范式是消除依赖传递
BCNF范式:在第三范式的基础上,数据库表中如果不存在任何字段对任一候选关键字段的传递函数依赖则符合第三范式。
这个有点难理解。我查了一下网上的其他讲解。举的例子是:
仓库管理表有(仓库id,存储物品id,管理员id,数量)四个字段。
其中一个管理员只在一个仓库,管理员管理仓库中的物品,一个仓库可以存多个物品。那么就有如下决定关系:
(仓库id,存储物品id)à(管理员id,数量)
(管理员id,存储物品id)à(仓库id,数量)
但是,就存在如下关系:
(仓库id)à(管理员id)
(管理员id)à(仓库id)
也就是产生关键字段决定关键字段的情况。
会出现(1)删除异常 (2)插入异常(3)更新异常
解决办法:拆分为两个表。仓库管理表和仓库表。这样才符合BCNF