类型 4 是什么
类型 4 把「最新值」与「历史变更」拆到两张表:主表只保留每个实体的当前属性(覆盖式更新,一个实体一行),另建历史表追加记录每次变更。主表体积小、查询快,适合绝大多数只看最新值的场景;需要追溯时再查历史表。与拉链表(类型 2)的关键差别是不把版本行堆在同一张表里,因此主表查询不需要 is_current 过滤。
基本信息
| 结构 | 主表(最新)+ 历史表(变更流水) |
|---|---|
| 主表更新 | 覆盖式,一个实体一行 |
| 历史表更新 | 只追加,含变更前后值与变更时间 |
| 查询方式 | 最新值查主表,追溯按需关联历史表 |
| 与类型 2 差别 | 版本行分表存放,主表无需当前标志 |
典型使用场景
- 主数据同步:客户、商品等维度日常只需最新属性,主表即可满足
- 审计与追溯:合规或客服场景要看某个属性历史被改过几次
- 高频查询优化:主表无版本行,join 不需要过滤当前标志,性能稳定
- 变更分析:历史表天然支持「本月有多少商品调整过价格」这类统计
- 渐进式改造:已有主表先补一张历史表,避免一次性重构成拉链
- 权限与口径并行:业务查主表,审计查历史表,互不影响
两表结构与查询
两表结构与查询
-- 主表:一个实体一行,覆盖式更新
dim_user -- user_sk, user_id, name, city, tier
-- 历史表:每次变更追加一行
dim_user_hist -- user_id, attr_name, old_value, new_value, changed_at
-- 日常查最新属性:只查主表,无需过滤当前标志
SELECT user_id, name, tier FROM dim_user WHERE user_id = 'U10086';
-- 追溯某个属性的变更轨迹
SELECT changed_at, old_value, new_value
FROM dim_user_hist
WHERE user_id = 'U10086' AND attr_name = 'tier'
ORDER BY changed_at;类型 4 与类型 2 对比
| 对比项 | 类型 4 | 类型 2 拉链 |
|---|---|---|
| 存放方式 | 最新与历史分两张表 | 版本行在同一张表 |
| 最新值查询 | 直接查主表 | 需过滤当前标志或取最大版本 |
| 历史查询 | 查历史表或按需关联 | 同表按生效区间过滤 |
| 表体积 | 主表小、历史表持续增长 | 单表持续增长,索引压力大 |
| 更新复杂度 | 两表需同步更新,一致性要保证 | 需先关闭旧版本再写入新版本 |
| 回看任意时点 | 需按变更流水重演 | 直接按时间区间筛选 |
类型 4 与迷你维度思路相近,区别在于迷你维度面向高频离散属性的组合枚举,用更少的行承载组合变化;类型 4 关注的是把历史与最新拆开存放。两表更新必须在同一事务或同一调度步骤完成,否则会出现主表已改、历史表没记的断链。