一致性维度怎么落地
一致性维度指多个事实表共用同一张维度表、同一套代理键与属性口径,它是总线矩阵每个交叉点的实际形态。落地方式是把它当作独立的 DIM 层资产来建设和发布,而不是让每张事实各自 join 自己的临时维表。判断标准很直接:同一个实体在任意两个事实里,键与属性取值完全一致,可以直接叠在一起做上钻下钻。
基本信息
| 形态 | 独立 DIM 层表,有唯一负责人与发布流程 |
|---|---|
| 共享范围 | 多张事实表引用同一代理键与属性 |
| 契约内容 | 自然键规则、代理键分配、属性口径与枚举 |
| 变更管理 | 属性新增向后兼容,改语义需走版本与通知 |
| 验收 | 跨事实按维度汇总结果可直接对账 |
典型使用场景
- 构建总线矩阵:确定哪些维度需要跨事实共享,作为建设顺序依据
- 订单与支付联合分析:两张事实都按同一用户维度汇总
- 跨域对账:销售口径与财务口径统一到同一客户、商品维度
- 指标平台:维度作为公共资产被指标定义引用,避免口径重写
- 新事实接入:先确认能挂到已有公共维度上,再决定是否新建
- 维度评审:新增属性要评估对已有事实的影响面
共享与一致性校验
共享与一致性校验
-- 订单与支付事实共用同一个维度键与属性
SELECT o.order_id, p.pay_id, d.user_name
FROM fact_order o
JOIN fact_pay p ON o.order_id = p.order_id
JOIN dim_user d ON o.user_sk = d.user_sk
WHERE d.is_current = 1;
-- 契约校验:同一自然键在维度里只能有一条当前行,且属性唯一
SELECT user_id, count(distinct user_name) AS name_cnt,
sum(case when is_current = 1 then 1 else 0 end) AS cur_cnt
FROM dim_user
GROUP BY user_id
HAVING count(distinct user_name) > 1 OR sum(case when is_current = 1 then 1 else 0 end) <> 1;共享与私有对比
| 做法 | 影响 | 适用 |
|---|---|---|
| 公共 DIM 层表 | 口径统一,可跨事实对账 | 绝大多数业务维度 |
| 事实内私有维表 | 口径封闭,跨事实对不上 | 仅限该事实独有的属性 |
| 维表视图包装 | 上游一致但无实体治理 | 过渡期临时使用 |
| 多份维表副本 | 实现省事 | 不推荐,口径必然分叉 |
一致性维度的难点不在建模,而在治理:谁定义、谁发布、属性口径变更怎么通知下游。缺少负责人时,维表会被各业务组按需加列,几个月后同一属性出现三种含义。把它当产品资产管理,比反复重构模型有效。