总的来说, 数据库范式就是逐渐消除数据冗余的过程.
1NF: 字段不可分
- 属性的原子性约束
一个数据库中字段不能包含多个可分的字段
- 比如说不能把手机和邮箱记录在同一个字段中
- 同理, 把多个手机记录在同一个字段中也是不合适的
2NF: 非主键字段完全依赖于主键 (消除部分子函数依赖)
- 记录的惟一性约束
- 消除了主键组合字段之间的依赖
反例: 两个独立的组合主键 (K1, K2) -> (V1, V2) | (K1) -> (V1), (K2) -> (V2), (K1) -> (K2)
- 修改为: (K1) -> (V1), (K2) -> (V2), (K1) -> (K2)
3NF: 非主键字段不依赖于其它非主键字段 (消除传递依赖)
- 字段冗余性的约束
- 消除了非主键字段之间的依赖
- 不存在非主键字段对任一候选主键的传递函数依赖
数据冗余: V1依赖于V2, 导致多个重复V1时, V2也发生重复 (K1) -> (V1, V2) | (V1) -> (V2)
- 修改为: (K1) -> (V1), (V1) -> (V2)
BCNF: 任何字段不依赖于其他字段 (消除传递依赖)
- 字段冗余性的约束
- 消除了所有字段之间的依赖(
- 不存在任何字段对任一候选主键的传递函数依赖
主键依赖主键: (K1, K2) -> (V1) | (K1) -> (K2)
- 修改为: (K1) -> (V1), (K1) -> (K2)
- 与3NF的主要区别是: 3NF只考虑了非主键字段之间的依赖, 而没有考虑主键组合字段之间的依赖, BCNF是一种更严格的3NF