首页/数据/数据工程与 ETL 速查/一致性维度与一致性事实

一致性维度与一致性事实

一致性维度指多个事实表共用同一套维度键与属性定义(如全公司统一的日期、商品、用户维度),是跨主题拼接分析的前提;一致性事实指同名指标在不同报表中口径一致。

一致性维度与一致性事实是什么

一致性维度指多个事实表共用同一套维度键与属性定义,例如全公司统一的日期、商品、用户维度:同样的代理键、同样的属性编码、同样的层级关系。一致性事实指同名指标在不同报表中口径、单位一致。两者合起来就是 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;

不一致的常见表现

表现原因后果
同名指标两个数各主题各算一套口径业务对报表失去信任
维表各建一份主题自行维护用户或商品维度跨主题拼接失真或无法拼接
属性编码不同编码规则未统一(省市区、渠道码)分组结果对不上
层级深浅不一一个主题三层类目、另一个五层汇总口径无法对齐
没有一致性维度时,跨主题分析只能靠文本匹配或各自重算,这是同一指标出现多个数字的主要来源;治理顺序通常是先统一维度,再统一指标口径。
公共维度被单个主题私自扩展属性,下游会误以为拿到了统一口径:任何属性新增都应走公共维度的发布流程,并同步通知所有引用方。

易错点

  • 各主题各建用户维度,会员等级口径不同导致对比失真
  • 新主题私自扩展维度属性,下游误以为拿到了统一口径
  • 维度键在不同主题中用不同类型或编码,连接即丢行且不报错
  • 无生效标记或版本管理,同一自然键出现多份「当前版本」
  • 一致性事实只统一名字不统一单位与粒度,数字对不上仍无法解释

数据来源与参考

  • Kimball《The Data Warehouse Toolkit》一致性维度与总线架构
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌