首页/数据/数仓建模速查/多值维度的处理方式
建模基础69 条

多值维度的处理方式

多值维度三种处理:事实表存分隔串(不可取)、桥接表(可分摊)、反向事实表(一对多反转);按查询与分摊需求选择。

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

多值维度怎么处理

一个事实行对应维度的多个成员(一笔订单多张券、一篇文章多个标签)称为多值维度。常见三种处理:事实表存分隔串、桥接表、反向事实表。前者无法关联,后两者各有适用面,选择取决于是否需要分摊以及分析的主视角。

基本信息

桥接表保存关系与权重,支持分摊与去重统计
反向事实表以关联成员为主视角建事实表,用于覆盖统计
分隔串把多个值拼成一列,无法 join,除极简场景外不用
选择依据是否需要把度量分摊到每个成员
统计注意覆盖统计必须去重,否则同一实体被重复计数

典型使用场景

  • 促销分析:一笔订单多张券,需要按券分摊金额
  • 内容标签:一篇文章多个标签,需要统计每个标签覆盖的文章数
  • 商品多类目:同一商品挂在多个类目下,需要选定主类目或按权重分摊
  • 多部门协作:一个项目由多个部门参与,按投入比例分摊成本
  • 多触点归因:一次转化对应多个触点,需要按模型权重分配

两种口径的写法

两种口径的写法
-- 反向事实表:以标签为主视角,统计每个标签覆盖多少订单
SELECT tag_key,
       count(DISTINCT order_key) AS order_cnt    -- 必须去重
FROM fact_order_tag
GROUP BY tag_key;

-- 桥接表:把订单金额按权重分摊到每个标签
SELECT b.tag_key,
       sum(f.pay_amt * b.weight) AS share_amt    -- 分摊口径
FROM fact_order f
JOIN bridge_order_tag b ON f.order_key = b.order_key
GROUP BY b.tag_key;

-- 同一报表里不要把分摊值与覆盖数放在一起比较,口径不同

三种方式对比

方式能否分摊能否做覆盖统计使用难度
分隔串存值否只能模糊匹配,结果不可靠低但错误率高
桥接表是,带权重是,需 DISTINCT 去重中
反向事实表否是,天然以成员视角组织中,需另建一张事实表
先明确查询需求再选方案:要分摊就用桥接表,要统计覆盖关系就用反向事实表,两者需求都存在时通常两张都建,各自服务不同口径。
分隔串方式的问题不是不能存,而是存完无法参与维度关联:所有基于该成员的汇总只能靠字符串匹配,既无法走索引,也无法与维度表的口径变更联动。

易错点

  • 用逗号分隔串存多值,分析端只能模糊匹配,一旦出现包含关系的编码就统计错误
  • 分摊口径与覆盖口径混用在同一个指标里,同一实体既被拆开又被重复计数,结果无解释力
  • 桥接表权重缺失或不守恒,分摊后各成员之和与总额不等,对账无法通过
  • 覆盖统计忘记 DISTINCT,多标签订单在每个标签下都被计数,总量远超实际订单数

数据来源与参考

  • Kimball 方法论:多值维度
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌