日期:2026-07-12
标签:#面试 #八股 #后端 #数据库 #数据建模 #场景题
一句话答案
关联表强调规范化、关系约束和独立演进,适合多对多及关系本身有属性;冗余字段减少 Join、提升读性能和可用性,但会增加更新一致性与存储成本。
面试口语版
我会先看关系基数和读写模式。一对多通常在“多”的一侧保存外键;多对多一般用关联表,例如用户角色表,还能保存创建时间、状态和来源。关联表数据规范、约束清晰、更新单点,但查询多一次 Join。冗余字段适合读多写少、跨服务或历史快照场景,例如订单保存下单时商品名和价格,避免商品变更影响历史订单。它能减少 Join 和远程依赖,但必须定义事实源,通过本地事务、事件或 CDC 同步,并准备对账修复。
方案对比
| 维度 | 关联表 | 冗余字段 |
|---|---|---|
| 一致性 | 事实单一、约束清晰 | 多副本,需同步与对账 |
| 查询 | 可能需要 Join | 读取直接、延迟低 |
| 更新 | 集中修改 | 写放大、可能短暂不一致 |
| 适用 | 多对多、关系有属性 | 快照、读模型、跨服务查询 |
关键细节
- 冗余不是复制所有字段,只复制高频、稳定且收益明确的数据。
- 历史快照字段不应随源数据更新,普通缓存字段则需要同步。
- 大文本或高频变化字段冗余会带来明显写放大。
- 跨微服务不建议直接 Join 对方数据库,可构建本地读模型。
面试官追问
- 冗余字段如何保证一致性?
- 多对多为什么更适合关联表?
- 什么时候应该保留历史快照而不是同步最新值?
面试官追问参考答案
1. 冗余字段如何保证一致性?
明确唯一事实源,同库更新可放入一个事务;跨服务使用 Outbox/CDC 发布变更,消费者按版本幂等更新。再通过周期性对账比较源数据与冗余副本,修复漏消息和乱序覆盖。
2. 多对多为什么更适合关联表?
一条关系对应独立记录,能对两端 ID 建联合唯一索引,并保存状态、创建人和时间等关系属性。把多个 ID 塞进逗号字符串会破坏约束、索引和增删查询能力。
3. 什么时候应该保留历史快照而不是同步最新值?
订单价格、收货地址、合同条款等需要反映业务发生当时的事实,应保存不可变快照。展示型昵称等若要求最新状态,可维护冗余读模型;二者语义不能混淆。
学习清单
- 能按关系基数和访问模式选模型。
- 理解事实源、快照与冗余读模型。