标准答案

  1. 高频读路径需要避免多表 JOIN、远程聚合或重复计算时,可以冗余展示字段、汇总值或预计算结果。
  2. 订单中的商品名称、成交价和收货地址通常要保存历史快照,不能在读取时回查会变化的商品或用户资料。
  3. 每个冗余字段都应说明唯一事实源、写入时机、更新方式和允许的延迟。
  4. 同步写入适合必须立即一致的小范围数据;异步投影适合可接受短暂延迟的大规模读模型。
  5. 需要定期做对账、修复和可重复构建,确保异步失败或历史 bug 不会永久留下脏数据。

题目解析

反范式化不是“为了快多存几份”。真正的问题是读请求是否在稳定地承担不该有的成本,例如每次商品列表都去聚合十张表,或者每个请求都跨服务查相同资料。此时可以把读模型设计成面向查询的结构。

失真通常来自没有所有权:A 服务和 B 服务都能改同一个冗余字段,或者消息漏投后没有补偿。明确单一写入者和可重放的数据来源,才能把冗余从隐患变成受控设计。

常见误区

  • 把订单历史价格直接关联到商品现价,价格变更后历史订单被悄悄改写。
  • 异步同步失败后没有可重放事件和对账任务,只能人工逐条修复。

作者信息