首页/数据/数仓建模速查/模型演进与重构策略
建模基础69 条

模型演进与重构策略

模型演进遵循兼容优先:新增字段先行、新旧并行、灰度切换、下线旧路径;重构要有迁移计划与对账方案。

数仓建模速查数据更新于 2026-10-13

模型演进是什么

模型演进指已上线的事实表、维度表在业务变化后做结构或语义调整的受控过程:加字段、修口径、改粒度、换分区策略都算。它遵循兼容优先的次序——新增字段先行、新旧并行、灰度切换、确认对账一致后再下线旧路径,而不是直接修改线上表定义。对下游而言模型就是一份接口契约:字段名、粒度、单位一旦发布,任何改动都会传导到所有引用方,所以每次变更都要有迁移窗口和回滚方案。

基本信息

常见变更类型加列 / 改语义 / 改粒度 / 改分区
风险排序加列最低,改语义与改粒度最高
实施方式新旧并行双跑 + 对账
必备产出迁移说明、对账报告、回滚脚本

典型使用场景

  • 业务新增属性:源系统加了字段,先在事实表末尾加可空列,老查询不受影响
  • 口径修正:GMV 从「含运费」改成「不含运费」,必须新增列而不是原地改语义
  • 粒度升级:订单粒度不够用,需要下钻到订单行,只能新建事实表
  • 分区治理:由按到达时间分区改为按业务时间分区,需要重刷历史并切换调度
  • 引擎迁移:Hive 表迁到 Doris 或湖表,物理实现变但逻辑模型与字段语义保持不变
  • 模型合并:两张同粒度事实表合并为一张带来源维度的表,需要安排下游切换引用

演进四步加列示例

演进四步加列示例
-- 第 1 步:在表末尾加可空列,保证老查询不受影响
ALTER TABLE fact_order ADD COLUMNS (coupon_amt decimal(18,2) COMMENT '优惠金额(元)');
-- 第 2 步:新旧两条链路并行跑批,逐日做差异对账
SELECT dt, abs(old_amt - new_amt) AS diff FROM recon_order_day WHERE diff > 0.01;
-- 第 3 步:连续双跑差异为零后,通知下游把引用改指新表
-- 第 4 步:旧路径转只读,保留观察期后归档下线并登记台账

变更类型与策略

变更风险表现推荐策略
新增可空列下游 select * 会多列低风险,直接加并写列注释
修改列语义下游静默错数新增列 + 双跑 + 切换,禁止原地改义
修改粒度统计口径整体变化建新表,旧表转只读保留
更换分区键历史数据需重刷重刷历史 + 调度切换 + 回滚预案
把切换前置条件提前写死:差异条数为零、金额差异在阈值内、下游任务全部改指新表、回滚脚本演练通过,四项齐了才允许切换,否则继续并行。
给已上线的列改语义是最隐蔽的事故源:SQL 不报错,报表数字整体偏移,往往到月结对账才被发现,此时历史数据已被污染。

易错点

  • 直接改列语义而不新增列:下游 SQL 不报错但数字整体偏移,问题拖到月结才暴露
  • 新旧并行没有明确的切换与下线标准:两套口径长期并存,报表口径各自为政
  • 改粒度时在原表上硬加行:一张表混了两种粒度,所有聚合都重复计数
  • 变更不通知下游就直接上下线:引用方任务批量报错,故障影响面失控
  • 回滚方案只写在文档里没有演练:真出事时旧路径已被覆盖,退不回去

数据来源与参考

  • 数仓工程实践:模型演进
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌