雪花模型是什么
雪花模型把维度表进一步做范式化拆分:商品维度只留商品自身属性,类目信息拆到类目维度,类目再拆到一级类目,形成多层子维。存储更省、层次表达更清晰,代价是查询 join 层数增加,ETL 与血缘也更复杂。
基本信息
| 结构 | 事实表 + 维度表 + 维度再拆出的子维度表 |
|---|---|
| 优点 | 减少维度冗余,层次关系规范化,单表体积小 |
| 代价 | join 层数增加,查询与血缘复杂度上升 |
| 适用 | 维度层次深且被广泛共享、维度属性变更频繁 |
| 常见形态 | 主体星型 + 局部雪花化子维,而非全库雪花 |
典型使用场景
- 类目体系层级深(三级以上)且经常调整,独立成维度便于集中维护
- 组织架构维度被大量事实表引用,单独维护可避免各表重复冗余
- 维度表属性极宽,重复存储成本显著,需要拆分瘦身
- 源系统本身已规范化,直接对齐可减少转换工作量
- 合规要求层次关系可追溯,需要显式表达父子结构
多级层次查询
多级层次查询
-- 商品 -> 二级类 -> 一级类,逐层 join 获取层次名称
SELECT c1.cat_name AS cat_l1,
sum(f.amount) AS amt
FROM fact_sale f
JOIN dim_product p ON f.product_sk = p.product_sk -- 事实关联商品
JOIN dim_cat c ON p.cat_key = c.cat_key -- 商品关联二级类
JOIN dim_cat c1 ON c.parent_key = c1.cat_key -- 二级类关联一级类
WHERE f.dt = '2026-10-12'
GROUP BY c1.cat_name; -- 按一级类汇总雪花化的判断表
| 情形 | 建议 | 原因 |
|---|---|---|
| 维度需被 5 个以上事实表引用 | 可拆为独立维度 | 共享度高,独立维护比多表冗余更省 |
| 层次深度固定且不常变 | 倾向在维表内冗余层级列 | 避免为固定层次反复 join |
| 层次频繁调整 | 独立成维度并物化路径 | 集中改一处,影响面可控 |
| 维度属性宽但查询只取少数列 | 考虑缩小维度 | 减少扫描宽度,兼顾可读性 |
现代数仓更多是折中形态:事实表周围保持星型,只把层次深、共享广的部分雪花化。全库雪花化把查询复杂度转嫁给所有下游使用者,收益往往抵不过协作成本。
雪花层次变深时,BI 自助分析的成本上升明显。如果使用者需要自己串联三四层 join 才能拿到一级类目,说明应该在语义层或上游做好层级拼平。