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

第一范式(1NF)

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

第二范式(2NF)

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

比如有一张表为:

零件来源表

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

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

供应商表

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

零件来源表

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

第三范式(3NF)

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

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

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

总结

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

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注