首页/数据/数仓建模速查/星型模型 Star Schema
建模基础69 条

星型模型 Star Schema

星型模型由中心事实表与外围维度表组成,维度直接连事实、不做多级范式拆分;查询 join 层数少,对 BI 与分析引擎友好。

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

星型模型是什么

星型模型是维度建模的默认形态:中心一张事实表,外围若干维度表,维度只与事实直接相连,不做多级范式拆分。代价是维度属性存在冗余,比如类目名称在商品维度里直接存一份;收益是查询 join 层数少、表关系一眼可见,BI 工具与各类分析引擎都对其友好。需要压缩冗余时才会引入雪花,那是针对特定场景的取舍,而不是为了让模型『更规范』。

基本信息

结构1 张事实表 + N 张维度表
关联方式维度只连事实,维度之间不互连
优点join 少、易理解、扫描列少、BI 友好
代价维度存在冗余存储,调整属性需重刷维表
适配引擎列存与云数仓均适用,压缩可摊薄冗余成本

典型使用场景

  • 新建集市:不确定该不该雪花时先落星型,把复杂度留在可优化的一侧
  • 自助分析:业务方拖拽维度做透视,两层结构不必解释多级 join 路径
  • BI 报表性能调优:减少 join 层级直接降低查询耗时与错连风险
  • 指标口径治理:维度属性只在维表维护一处,避免多份副本慢慢漂移
  • 教学与交接:看 ER 图即可复述模型结构,沟通成本最低

星型查询示例

星型查询示例
-- 事实表存维度代理键,查询时按需 join 维度
SELECT d.day_name,              -- 日期维度属性
       p.category_l1,           -- 商品维度一级类目
       sum(f.qty) AS qty,       -- 度量:销售数量
       sum(f.amt) AS amt        -- 度量:销售金额
FROM fact_sale f
JOIN dim_date d    ON f.date_key = d.date_key
JOIN dim_product p ON f.product_sk = p.product_sk
GROUP BY 1, 2;                  -- 只需两层 join 即可出报表

星型与雪花取舍

判断维度倾向星型倾向雪花
查询复杂度自助分析、SQL 由业务方编写固定报表,路径由开发维护
维度变更频率类目层级稳定层级频繁调整且共享面广
存储压力可接受冗余维度极大且重复率高
引擎特性列存压缩后冗余成本低宽维表显著影响 join 与 shuffle
星型的冗余是设计选择而不是失误。真正需要警惕的是维表之间互相引用形成链路,那会让自助分析里的 join 路径变得不可预测,使用者很难判断该连哪张表。
围绕同一个事实表的一圈维度通常控制在十张以内较好落地;维度过多时先确认是否把同一概念的多个角色拆成了不同表,那类情况往往该用角色扮演而不是新增维表。

易错点

  • 把星型当铁律:不看场景硬套,遇到超大共享维度也不肯雪花,查询成本长期偏高
  • 把维度冗余当成设计缺陷反复重构:每次都要全量重刷历史,收益远小于成本
  • 维表之间互加引用:表面还是星型,实际形成雪花链路,BI 里 join 关系混乱
  • 事实表之间直接 join:多对多放大,金额被重复累计且难以察觉

数据来源与参考

  • Kimball 方法论:星型模型
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌