无事实事实表

无事实事实表不存数值度量,只记录发生过或满足条件的关系:活动参与、内容浏览、覆盖清单;统计时对行数计数即可,常用于覆盖率与去重用户分析。

无事实事实表是什么

无事实事实表(factless fact table)是不存放数值度量的事实表,只有一组维度外键,用来记录“发生过”或“满足条件”的关系:谁参加了哪场活动、谁看过哪篇内容、哪些实体命中哪些规则。统计时对行数或去重主体计数即可,因此它天然适合覆盖率、参与度与圈选命中分析。它的粒度声明尤其重要:一行代表一次参与关系还是一人一次,决定了后面能不能直接 COUNT。

基本信息

结构只含维度外键,不含度量列
用途计数、覆盖、参与关系、命中分析
变体条件覆盖表:一行一种条件与实体的组合
计数要点按业务主体去重,避免一人多次被重复计数
实现位置通常在 DWD 或 DWS 层沉淀

典型使用场景

  • 活动参与:记录用户参加了哪场活动,用于计算参与率与覆盖人数
  • 内容浏览:记录用户看过哪些内容,支撑覆盖率与触达分析
  • 规则命中:记录每个用户命中哪些标签或圈选条件,用于投放效果评估
  • 商品与类目可见性:某商品被哪些门店上架,用于铺货覆盖分析
  • 权限与授权关系:谁被授予了哪些数据表权限,用于合规核查

活动参与记录

活动参与记录
-- 一行代表一次参与关系
CREATE TABLE fact_event_attend (
  event_sk INT, user_sk BIGINT, date_sk INT
) PARTITIONED BY (dt STRING);

-- 参与人次(按行计数)
SELECT COUNT(1) FROM fact_event_attend WHERE event_sk = 1001 AND dt = '2026-10-11';

-- 参与人数(按主体去重)
SELECT COUNT(DISTINCT user_sk) FROM fact_event_attend
WHERE event_sk = 1001 AND dt = '2026-10-11';

-- 条件覆盖表:一行一种条件与实体
-- SELECT condition_id, COUNT(DISTINCT user_sk) FROM fact_user_condition_hit GROUP BY condition_id;

两类无事实表对照

类型行表示什么典型指标注意点
事件参与型一次参与关系参与人次、参与人数区分人次与人数
条件覆盖型一个实体命中的一种条件命中人数、覆盖率条件变化需重算历史
可见性型一个实体与渠道的组合铺货率、可见商品数注意与主数据同步
无事实事实表也可以承载条件覆盖语义:如每个用户每天满足哪些标签条件,用于圈选与命中分析,比在宽表里堆布尔列更容易扩展。
直接 COUNT(*) 统计人数时,同一用户多次参与会被重复计数;先明确一行代表什么,再决定是用 COUNT 还是 COUNT DISTINCT。
无事实表同样要好维护:条件集合变化后历史覆盖结果无法自动回溯,需要在口径文档里写明重算方式与生效日期。

易错点

  • 直接 COUNT(*) 统计人数,同一用户多次参与被重复计数,参与率被高估
  • 把可加度量后来塞进无事实表(如补一个金额列),粒度与口径立刻变得混乱
  • 一行代表什么没有写进表说明,下游对同一张表算出两种人数
  • 条件覆盖表更新后不回刷历史,看板上覆盖人数出现无法解释的跳变

数据来源与参考

  • Kimball《The Data Warehouse Toolkit》无事实事实表
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌