数据库设计三范式(数据库规范化)

第一范式(1NF)

第一范式是为了要排除 重复组 的出现,强调列的原子性并且不可再拆分, 如果列可能会出现重复的属性,比如一张表的字段为(姓名,性别,电话), 其中联系电话可能会有多个,那么应该拆分出新建实体,与原实体之间的关系为一对多, 另外为了排除重复组的出现,要求必须要有主键

第二范式(2NF)

首先包含1NF, 要求主键和候选键有完全依赖关系,而不能只依赖主键的一部分, 不符合 2NF 的设计容易产生冗余数据

比如有一张表为:

零件来源表

零件 ID (主键) 价格 供应商ID (主键) 供应商名称 供应商住址

以上字段都是单一值符合1NF范式, 但是同一个零件可能会有不同的供应商(相反,多个零件也可能属于同一个供应商),所以并不属于完全依赖,
另外供应商名称和供应商住址只和供应商ID有关(部分依赖),所以应该抽离出来,修改后如下:

供应商表

供应商ID (主键) 供应商名称 供应商住址

零件来源表

零件 ID (主键) 价格 供应商ID (主键)

第三范式(3NF)

要求所有非主键属性都只和候选键有相关性,也就是说非主键属性之间应该是独立无关的。

如下表,如果要符合第三范式, 应该将小计删除, 小计可以由单价乘以数量得出(但是删除后统计查询将稍微复杂)

订单ID 商品ID 单价 数量 小计 (Total)

总结

综上所述,三范式在具体需求场景下并不是一定要严格遵守, 但是必须要考虑在内, 特别是第一范式和第二范式, 错误的设计会导致后期的数据结构变动或更新数据困难, 还有大量冗余问题.