550 字
3 分钟
数据库范式与反范式如何取舍
规范化通过拆分具有独立依赖关系的数据,减少重复存储和更新异常。以订单和商品为例,商品名称依赖商品 ID,不应在每一张订单行里被无控制地重复维护;可把商品信息放商品表,订单行保存商品 ID、成交时名称快照和价格等订单事实。第三范式等范式是分析依赖关系的工具,不是见到重复字段就必须拆表的机械规则。
反范式是在明确业务需求后有意冗余,例如订单行保留成交时商品名称和价格,以保证历史单据可还原;报表表预先存聚合结果以降低昂贵查询。冗余带来更新一致性责任:要定义写入事务、回填、修复和校验机制。若一个字段存在多个事实来源,数据就容易漂移。
设计先确定数据语义与约束,再根据查询频率、延迟目标、写入成本决定是否冗余。不要用反范式掩盖缺少索引或糟糕查询,也不要在没有测量读瓶颈前复制整张表。
拆分表也会增加 JOIN、事务和应用模型复杂度,尤其跨分片后关联可能无法在单个数据库内完成。反过来,保留适度冗余可能让核心查询更简单。评审时可以逐字段问:该值描述哪个实体、由什么键决定、变化频率如何、需要历史快照还是当前值、冗余是否有可验证的一致性维护办法。这比背诵“第三范式一定最佳”更能说明设计理由。
追问
- 范式的主要收益是什么? 减少不必要重复,降低插入、更新和删除异常,明确数据依赖。
- 订单为什么常保存成交价格快照? 商品当前价格会变化,订单需要保留交易发生时的事实。
- 反范式之后如何保持一致? 明确唯一事实来源、事务更新流程、补偿修复和定期校验。
目录