第一范式(1NF)
定义:数据库表中的每一列都是不可分割的原子值,即同一列中不能包含多个值或重复属性。
核心要求:
每一列都是单一数据项,例如电话号码字段不能存储多个号码(需拆分为单独记录)。
示例:
原始表(违反1NF):
问题:【选课】列包含多个值,违反了原子性。也就是选课列的值是可以拆分的:数学, 英语, 物理可以拆分成【数学】、【英语】、【物理】
修正后(满足1NF):
效果:拆分多值字段为独立记录,确保原子性。
第二范式(2NF)
定义:在满足1NF的基础上,非主属性完全依赖于主键,而非主键的一部分(针对复合主键)。
核心要求:
消除部分依赖,例如订单详情表中商品名称仅依赖【商品ID】,而非主键【订单ID+商品ID】。
示例:
原始表(违反2NF):
问题:【商品名称】仅依赖商品ID(部分依赖主键)
修正后(满足2NF):
订单详情表:
商品表:
修改后,商品属性信息单独成表,订单表只保留商品id。这样做的目的是减少冗余。
第三范式(3NF)
定义:在满足2NF的基础上,非主属性不传递依赖于主键,即非主键字段之间无依赖关系。
核心要求:
消除传递依赖,例如员工表中部门名称通过部门ID间接依赖员工ID。
示例:
原始表(违反3NF):
问题:部门名称
通过部门ID
传递依赖员工ID。
修正后(满足3NF):
效果:消除传递依赖,数据一致性更高
员工表:
部门表:
总结
注意:实际开发中,过度规范化可能影响性能,需根据业务需求灵。