流量域事实建模要点
流量域通常拆成两张事实表:会话事实以一次访问为粒度,一行为一个 session,记录来源渠道、设备、落地页与停留时长;事件事实以页面或点击为粒度,一行为一次行为,用于漏斗与路径分析。两张表通过 session_id 关联,但不要合并成一张宽表,因为粒度差异会导致跳出率、人均访问页数等指标被重复计数。会话切分规则(常见是静默 30 分钟算新会话)属于口径,必须写进模型文档。
基本信息
| 会话事实粒度 | 一行 = 一次访问会话(session_id) |
|---|---|
| 事件事实粒度 | 一行 = 一次页面浏览或点击事件 |
| 常用维度 | 日期、渠道、设备、页面、地域 |
| 关联字段 | session_id 连接会话与事件 |
| 关键口径 | 会话超时切分规则,需写入文档 |
典型使用场景
- 渠道效果评估:按来源渠道汇总会话数与转化数,判断投放质量
- 转化漏斗:以事件事实逐层统计曝光点击下单,观察每层流失
- 跳出率统计:会话事实中单页会话占比即跳出率,粒度必须正确
- 设备与地域分析:会话维度切片,定位体验问题集中的终端类型
- 路径分析:按 session_id 串联事件顺序,还原典型访问路径
两张事实表结构
两张事实表结构
-- 会话事实:一次访问一行
-- fact_session(session_id, user_sk, channel_sk, device_sk,
-- landing_page_sk, start_time, duration, pv_cnt)
SELECT c.channel_name, -- 渠道维度
count(1) AS session_cnt, -- 会话数
avg(s.duration) AS avg_dur, -- 平均停留时长(秒)
sum(s.pv_cnt) * 1.0 / count(1) AS pv_per_session
FROM fact_session s
JOIN dim_channel c ON s.channel_sk = c.channel_sk
WHERE s.dt = '2026-10-12'
GROUP BY 1;
-- 事件事实:页面或点击级,用于漏斗与路径分析
-- fact_event(session_id, event_type, page_sk, event_time)指标与粒度对照
| 指标 | 应使用 | 用错粒度的后果 |
|---|---|---|
| 会话数 | 会话事实计数 | 用事件计数,会话数被页面数替代 |
| 跳出率 | 会话事实单页会话占比 | 事件表计算得出数值偏大 |
| 页面浏览量 | 事件事实按浏览事件过滤 | 会话表 pv_cnt 无法按页面拆分 |
| 平均停留时长 | 会话事实 duration 求平均 | 事件时间差累加,口径不可比 |
会话切分规则不统一是流量域最容易出现的口径问题:一个系统按 30 分钟,另一个按 30 分钟跨天重置,两套数据放在同一张报表里根本无法比较。
埋点事件缺失页面编码时不要直接丢弃,先落未知成员键并纳入监控,否则漏斗上层数字会静默变小。