订阅更新

双时态数仓怎么建模?如何还原当时看到的数据?

面试问 226 约 3 分钟读完

本文目录
  1. 面试怎么回答
  2. 一个日期回答不了两个不同的问题
  3. 两组区间各自承担一个职责
  4. 更正历史时,保留旧认知的可见范围
  5. 一个典型场景:历史报表复现不了
  6. 查询接口必须显式暴露两种时间
  7. 参考资料

面试怎么回答

双时态把业务有效时间和系统记录时间分开。前者说明事实何时成立,后者说明平台何时知道这个版本。迟到更正时保留旧认知区间并发布新版本,查询同时指定两个时点,分别支持最新认知下的历史分析和原报告复现。我会检查区间唯一性、来源批次和更正原因;只需固定报告审计时,也会评估快照方案。

先把这段讲顺;面试官追问时,再展开下面的原理和细节。

详细讲解

客户今天补录了一条上个月就生效的合同变更。业务希望历史分析按正确合同重算,审计又要求还原月底出报表时看到的旧合同。这两个要求需要模型同时保留两条时间线。

业务有效时间记录事实何时成立,系统记录时间记录何时获知;双时态查询同时指定两种时点,才能区分历史真值与历史认知。

一个日期回答不了两个不同的问题

假设合同费率在八月一日生效,数据平台到八月十日才收到更正。询问八月五日应该采用的费率,与询问八月五日出报表时采用的费率,答案可能不同。

普通有效期模型能够表达业务历史,但如果修正时覆盖旧记录,就无法还原平台曾经知道什么。双时态为每个业务版本补充系统记录区间,让迟到、更正和历史审计有明确的位置。

同一个业务日,两种查询视角

两组区间各自承担一个职责

可以用 valid_from、valid_to 表示业务有效区间,用 recorded_from、recorded_to 表示系统认为该版本成立的区间。两组区间都采用左闭右开,减少相邻版本在边界时刻重复命中。

记录时间通常由受控入仓流程产生,不能简单借用可能被业务改写的 update_time。每次更正还应保留来源版本、批次和更正原因,明确一次处理多条变化时的先后关系。字段名可以不同,语义必须固定。

更正历史时,保留旧认知的可见范围

收到迟到变更后,关闭旧认知版本的记录时间区间,再新增系统当前认可的业务有效区间。更正如果只影响原区间的一段,通常还要把受影响区间拆开,保留不受影响的前后部分。

这不是简单把历史所有行再复制一遍。要按业务键和两个时间维度检查:给定一个有效时点与一个记录时点,应该至多命中一个符合业务定义的版本。区间交叠和缺口都应在发布前发现。

迟到更正的版本处理顺序

一个典型场景:历史报表复现不了

比如团队把合同做成普通拉链表,更正后重新出具上月收入,管理分析数字正确了,但无法解释最初报表为什么采用另一费率。最初怀疑代码版本没保存,最后发现旧的历史区间已被直接修改。

原质量检查只校验当前拉链区间无重叠,没有保留系统当时的认知。改造后,审计按原报告的有效日期和数据截止时点查询,分析按同一有效日期与最新记录时点查询。两类结果可以并存,并通过更正记录解释差额。

查询接口必须显式暴露两种时间

历史查询条件同时包含 valid_from ≤ 业务时点 < valid_to,以及 recorded_from ≤ 认知时点 < recorded_to。只给一个日期时,应由接口明确默认查询最新认知,避免调用者自行猜测。

双时态增加存储、区间维护和查询成本。只需要恢复已经发布的固定报表时,保存报告快照及其输入批次也可能足够;需要任意时点追溯与多次追溯更正时,再评估双时态。模型复杂度应对应真实的查询要求。

参考资料

刷题进度保存在当前浏览器