理解范式理论并能在实际业务中合理“破坏范式”
1NF:要求表中每一列都是不可再分的原子值,没有重复的列组。
反例:在订单表中用一个字段 product_ids 存多个商品 ID,如 "1,2,3",违反 1NF。
2NF:在满足 1NF 的基础上,要求非主属性完全函数依赖于主键,不能只依赖主键的一部分。
主要解决复合主键下的部分依赖问题,避免字段既依赖于整个主键又依赖于主键的一部分。
实际 OLTP 项目中通常保证到 3NF,然后根据性能需求做适当反范式处理。
原表:Student(id, name, class_id, class_name, college_name)
非主属性 college_name 通过 class_id 间接依赖主键 id,属于传递依赖,违反 3NF。
拆分:
反范式:为了性能或易用性,有意识地引入冗余,牺牲一定的更新成本来减少关联查询。
典型场景:
在订单表中保留 user_name、phone 等冗余字段:
更新异常多来自重复数据:一处更新,其他地方忘记更新。
删除异常多来自一行承担多重含义:删除一个概念时误删了另一个。
通过 2NF/3NF 把重复数据拆到独立表,用主外键关联,可以在更新/删除时减少这类问题。
实践中通常:
基础表:
可选反范式:
author_name,提升列表页展示性能。可按以下步骤描述:
可以按照: