550 字
3 分钟
数据库范式与反范式如何取舍
  1. 1MySQL 面试复习导读:知识地图与阅读路线
  2. 2MySQL 存储引擎怎么选:InnoDB、MyISAM 与 MEMORY
  3. 3MySQL 索引类型与 B+ 树:结构、分类和失效场景
  4. 4MySQL B+ 树查询全过程:从根节点到页目录
  5. 5InnoDB 聚簇索引与二级索引:什么是回表
  6. 6MySQL 覆盖索引:如何避免回表
  7. 7MySQL 联合索引的最左前缀匹配原则
  8. 8MySQL 索引下推:把过滤提前到存储引擎
  9. 9MySQL 事务异常读:脏读、不可重复读与幻读
  10. 10MySQL 四种事务隔离级别与选型取舍
  11. 11MySQL MVCC:Undo Log、版本链与 ReadView
  12. 12MySQL InnoDB 锁的分类:行锁、表锁与意向锁
  13. 13MySQL 乐观锁与悲观锁:冲突少时重试,冲突多时排队
  14. 14MySQL 发生死锁怎么办:检测、定位与处理
  15. 15MySQL 事务的 ACID 特性分别是什么
  16. 16InnoDB Redo Log 如何保证崩溃恢复
  17. 17InnoDB Undo Log 的回滚与 MVCC 作用
  18. 18MySQL Binlog 是什么,和 Redo Log 有什么区别
  19. 19一条 MySQL 查询从连接到返回结果经历什么
  20. 20如何用 EXPLAIN 读懂 MySQL 执行计划
  21. 21MySQL 为什么需要 Redo Log 与 Binlog 两阶段提交
  22. 22MySQL 崩溃后如何恢复已提交事务
  23. 23InnoDB Buffer Pool 如何提升查询与写入性能
  24. 24联合索引应该如何设计
  25. 25InnoDB 快照读与当前读如何处理幻读
  26. 26联合索引范围条件之后的列还能使用吗
  27. 27MySQL 索引看起来失效了,如何判断优化器的选择
  28. 28MySQL 8.0 如何定位并处理 InnoDB 死锁
  29. 29MySQL 慢查询如何定位和优化
  30. 30MySQL 的 ORDER BY、GROUP BY 与 filesort
  31. 31MySQL 普通索引和唯一索引如何选择
  32. 32MySQL 主从复制的基本流程是什么
  33. 33MySQL 主从延迟和读写分离如何处理
  34. 34MySQL 深分页为什么慢,如何改写
  35. 35InnoDB 主键应该如何设计
  36. 36MySQL 字符集与排序规则有什么区别
  37. 37数据库范式与反范式如何取舍本文

规范化通过拆分具有独立依赖关系的数据,减少重复存储和更新异常。以订单和商品为例,商品名称依赖商品 ID,不应在每一张订单行里被无控制地重复维护;可把商品信息放商品表,订单行保存商品 ID、成交时名称快照和价格等订单事实。第三范式等范式是分析依赖关系的工具,不是见到重复字段就必须拆表的机械规则。

反范式是在明确业务需求后有意冗余,例如订单行保留成交时商品名称和价格,以保证历史单据可还原;报表表预先存聚合结果以降低昂贵查询。冗余带来更新一致性责任:要定义写入事务、回填、修复和校验机制。若一个字段存在多个事实来源,数据就容易漂移。

设计先确定数据语义与约束,再根据查询频率、延迟目标、写入成本决定是否冗余。不要用反范式掩盖缺少索引或糟糕查询,也不要在没有测量读瓶颈前复制整张表。

拆分表也会增加 JOIN、事务和应用模型复杂度,尤其跨分片后关联可能无法在单个数据库内完成。反过来,保留适度冗余可能让核心查询更简单。评审时可以逐字段问:该值描述哪个实体、由什么键决定、变化频率如何、需要历史快照还是当前值、冗余是否有可验证的一致性维护办法。这比背诵“第三范式一定最佳”更能说明设计理由。

追问#

  1. 范式的主要收益是什么? 减少不必要重复,降低插入、更新和删除异常,明确数据依赖。
  2. 订单为什么常保存成交价格快照? 商品当前价格会变化,订单需要保留交易发生时的事实。
  3. 反范式之后如何保持一致? 明确唯一事实来源、事务更新流程、补偿修复和定期校验。
数据库范式与反范式如何取舍
https://blog.xqcherry.top/posts/interview/mysql/normalization-and-denormalization/
作者
xqcherry
发布于
2026-10-12
许可协议
CC BY-NC-SA 4.0