数据库范式
简介
源自英文 Normal Form,简称NF。
不同的范式对关系约束不同,越高的NF数据库冗余越小。
高等级范式在低级范式基础上更近一步,是低级范式的子集。
Start
假如我们有下面的需求:
存储用户的地址信息,每个用户都只有一个地址
初始设计
用户 | 地址 |
---|---|
张三 | 北京市朝阳区xx街道 |
1NF
要求每列都是不可再分的数据单元。
如果业务上要求地址区分省市区街道,那么只有一个地址字段就不满足1NF。将地址拆分为多个字段满足1NF。
原始设计,不满足1NF,拆分地址字段后满足1NF
用户 | 省 | 市 | 区 | 街道 |
---|---|---|---|---|
张三 | 北京 | 北京 | 朝阳区 | xx街道 |
2NF
2NF要求数据的每列都要与主键有关。
加入主键字段(id) 后满足2NF,可以区分同名同地址的用户了。
id | 用户 | 省 | 市 | 区 | 街道 |
---|---|---|---|---|---|
1 | 张三 | 北京 | 北京 | 朝阳区 | xx街道 |
3NF
3NF要求每列数据与主键直接相关。
例如 有部门表和员工表,员工表只能存储部门表的id,不能冗余部门表的其他字段(名称。等)。
BCNF
防止主键的某一列依赖主键的其他列。单列主键不存在这个问题。
反范式
适当的冗余字段,可以减少join操作,提高查询性能,但会提高数据维护成本。