数据建模
维度建模、星型/雪花、缓慢变化维。
30 分钟
数据建模
维度建模让分析师用一致的表结构做 JOIN 与聚合。星型 schema、缓慢变化维(SCD)是数仓面试与实战的高频题。
学习目标
- 区分事实表与维度表
- 理解星型模型与雪花模型
- 掌握 SCD Type 1 / 2 的适用场景
事实 vs 维度
| 类型 | 存什么 | CodeRoadMap 示例 |
|---|---|---|
| 事实表 | 可度量的业务过程 | 用户完课事件、页面访问 |
| 维度表 | 描述性上下文 | 课程、用户、路线图、日期 |
fct_lesson_complete
├── track_key → dim_track
├── user_key → dim_user
└── date_key → dim_date
度量(measure):duration_seconds、progress_pct。维度属性:track.title、user.region。
星型 vs 雪花
| 模型 | 结构 | 优缺点 |
|---|---|---|
| 星型 | 维度宽表,少 JOIN | 查询简单,冗余可接受 |
| 雪花 | 维度规范化多级 | 省存储,JOIN 多 |
分析 mart 优先 星型;dim_track 直接含 category、level,不必再 JOIN dim_category 除非维度极大。
缓慢变化维(SCD)
源表 cf_track.title 会改 slug 不变时:
| 类型 | 行为 | 适用 |
|---|---|---|
| SCD1 | 覆盖旧值,无历史 | 纠错、不重要属性 |
| SCD2 | 新行 + valid_from/to | 需历史分析(价格、状态) |
| SCD3 | 保留有限历史列 | 较少用 |
SCD2 表示例:
-- dim_track 当前有效行
SELECT * FROM dim_track
WHERE track_id = 42 AND is_current = TRUE;
命名与 grain
Grain(粒度) 是事实表一行代表什么:
fct_daily_track_views:每 track 每天一行fct_lesson_complete:每次完课事件一行
grain 错了,指标永远对不齐——与分析师对齐的第一件事。
与路线图的关系
- /roadmaps/data-engineer — Data Modeling 节点
- de-storage — 分层落地