一致性维度与一致性事实是什么
一致性维度指多个事实表共用同一套维度键与属性定义,例如全公司统一的日期、商品、用户维度:同样的代理键、同样的属性编码、同样的层级关系。一致性事实指同名指标在不同报表中口径、单位一致。两者合起来就是 Kimball 总线架构的核心——事实表可以各自建设,但维度与指标口径必须共享,否则跨主题的分析只能靠文本匹配或各自重算,这也是同一个指标出现多个数的常见来源。
基本信息
| 一致性维度 | 同键、同属性、同编码,被多个事实表共用 |
|---|---|
| 一致性事实 | 同名指标口径一致、单位一致、粒度一致 |
| 建设前提 | 维度在公共层统一建设与发布,主题层不私自扩展 |
| 发布方式 | 维度表作为公共资产,变更走评审与通知 |
| 收益 | 支持跨主题钻取、拼接与对比,指标可对账 |
| 代价 | 公共维度变更影响面大,需配套回归与版本管理 |
典型使用场景
- 跨主题分析:订单与退款共用用户维度,才能按同一用户口径对比
- 指标对账:两个报表的销售额能对在一起,前提是口径与维度一致
- 新建主题复用:新业务主题直接引用既有公共维度,避免重复建设
- 维度变更评估:公共维度加属性前,先评估所有引用方的影响
- 数据地图建设:标注维度的共享范围与负责人
跨主题拼接
跨主题拼接
-- 两个事实表共享 dim_user 与 dim_date,才能按同一维度汇总对比
SELECT d.year_month,
SUM(o.pay_amount) AS order_amt,
SUM(r.refund_amount) AS refund_amt
FROM fact_order o
JOIN fact_refund r ON o.user_sk = r.user_sk AND o.date_sk = r.date_sk
JOIN dim_date d ON d.date_sk = o.date_sk
GROUP BY d.year_month;验证维度是否真的一致
验证维度是否真的一致
-- 同一代理键在两个事实表中应指向同一实体的同一属性值
SELECT COUNT(1) AS mismatch_cnt
FROM fact_order o
JOIN fact_refund r ON o.user_sk = r.user_sk
JOIN dim_user u ON u.user_sk = o.user_sk
WHERE o.user_id <> r.user_id; -- 正常应为 0 行
-- 检查是否存在同自然键的多份版本同时生效
SELECT user_id, COUNT(1) AS v
FROM dim_user
WHERE is_current = 1
GROUP BY user_id HAVING COUNT(1) > 1
LIMIT 20;不一致的常见表现
| 表现 | 原因 | 后果 |
|---|---|---|
| 同名指标两个数 | 各主题各算一套口径 | 业务对报表失去信任 |
| 维表各建一份 | 主题自行维护用户或商品维度 | 跨主题拼接失真或无法拼接 |
| 属性编码不同 | 编码规则未统一(省市区、渠道码) | 分组结果对不上 |
| 层级深浅不一 | 一个主题三层类目、另一个五层 | 汇总口径无法对齐 |
没有一致性维度时,跨主题分析只能靠文本匹配或各自重算,这是同一指标出现多个数字的主要来源;治理顺序通常是先统一维度,再统一指标口径。
公共维度被单个主题私自扩展属性,下游会误以为拿到了统一口径:任何属性新增都应走公共维度的发布流程,并同步通知所有引用方。