首页/数据/数仓建模速查/无事实事实表
维度与事实设计149 条

无事实事实表

只记录维度键的组合(可带计数或权重常量),描述「发生过的关系」,如促销覆盖记录、用户订阅关系。

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

无事实事实表是什么

无事实事实表只记录维度键的组合,用来描述「发生过的关系」:哪个促销覆盖了哪些商品、哪个用户订阅了哪些服务、谁报名了哪场活动。它通常不存业务度量,或只存一个常量 1、一个权重、一个计数,真正的指标由 count 现场算出来。它的价值在于让关系本身成为可被多维分析的对象,而不是只能查配置表。

基本信息

内容若干个维度键;可选一个常量或权重列
典型度量常量 1,或用 count 现算覆盖数、参与人数
例子促销 × 商品覆盖表、用户订阅关系表、活动报名表
用途覆盖分析、关系计数、参与度分析
粒度必须显式声明,如一个促销一个商品一天一行

典型使用场景

  • 促销覆盖分析:某场活动覆盖了哪些商品、多少个 SKU
  • 订阅关系:谁订阅了哪些服务,按服务维度统计订阅人数
  • 活动报名:报名名单与活动、渠道、时间维度组合
  • 权限与授权:角色与资源的授权关系,分析权限覆盖范围
  • 课程与学员:选课关系表,统计课程报名与学员分布
  • 名单类业务:白名单、推送名单,按渠道与人群维度统计规模

覆盖分析

覆盖分析
-- 每个促销覆盖多少个商品
SELECT p.promo_id, count(1) AS sku_cnt
FROM   fact_promo_sku p
WHERE  p.dt = '2026-10-11'
GROUP  BY p.promo_id;

-- 交叉覆盖:同时参加两场促销的商品
SELECT a.promo_id, b.promo_id, count(1) AS overlap_cnt
FROM   fact_promo_sku a
JOIN   fact_promo_sku b
  ON   a.sku_id = b.sku_id AND a.promo_id < b.promo_id
GROUP  BY a.promo_id, b.promo_id;

度量列怎么设计

做法适用注意
不设度量列关系本身即事实查询要 count,性能敏感时加预聚合
常量列恒为 1便于求和与 join 简化必须约束不可为 NULL
权重列一条关系代表多个单位权重含义要写进文档,否则被误当计数
计数列源端只给汇总数与明细并存时口径要对齐
无事实事实表与配置表的区别在于粒度与可分析性:它挂在日期、渠道、人群等维度上,能按时间切片看关系变化;配置表往往只有当前状态,无法回答「上周覆盖了多少」。粒度声明缺失时,覆盖数会因重复行而被高估。

易错点

  • 把可计算的度量也物理存储:同一口径两处维护,早晚对不上
  • 粒度声明缺失:下游按粒度假定去重,覆盖数被高估或低估
  • 重复关系未去重:同一促销同一商品多行,count 出来的 SKU 数虚高
  • 关系表只存当前状态不做历史:无法回答关系何时建立、何时解除
  • 权重列含义未写文档:使用方把它当计数求和,规模数据被放大数倍

数据来源与参考

  • 数据仓库工具箱:事实表类型
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌