首页/数据/数仓建模速查/一致性维度的落地方式
维度与事实设计149 条

一致性维度的落地方式

一致性维度作为独立 DIM 层资产构建并共享,而不是每张事实各自 join 临时维表;总线矩阵的交叉点就是共享契约。

数仓建模速查数据更新于 2026-10-13

一致性维度怎么落地

一致性维度指多个事实表共用同一张维度表、同一套代理键与属性口径,它是总线矩阵每个交叉点的实际形态。落地方式是把它当作独立的 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 层表口径统一,可跨事实对账绝大多数业务维度
事实内私有维表口径封闭,跨事实对不上仅限该事实独有的属性
维表视图包装上游一致但无实体治理过渡期临时使用
多份维表副本实现省事不推荐,口径必然分叉
一致性维度的难点不在建模,而在治理:谁定义、谁发布、属性口径变更怎么通知下游。缺少负责人时,维表会被各业务组按需加列,几个月后同一属性出现三种含义。把它当产品资产管理,比反复重构模型有效。

易错点

  • 每张事实配一份私有维表:同一实体同名不同码,跨事实汇总直接对不上
  • 公共维表无人负责:属性口径各写各的,新增列从不通知下游
  • 代理键分配不统一:不同事实对同一实体的代理键不同,无法 join
  • 改属性语义不评估影响面:下游过滤条件静默失效,指标整体偏移
  • 把一致性维度做成大宽表:拉进大量低频属性,更新成本高且易冲突

数据来源与参考

  • 数据仓库工具箱:一致性维度
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌