星型模型(Star Schema) 和 雪花模型(Snowflake Schema) 是数据仓库中两种经典的维度建模(Dimensional Modeling) 结构,用于组织事实表和维度表,以支持高效、直观的业务分析。
它们的核心区别在于维度表是否被规范化(Normalization)。
一、星型模型(Star Schema)
✅ 定义
- 以一个事实表为中心,多个去规范化的维度表直接连接到事实表,形成类似“星星”的结构。
- 维度表不拆分,所有属性都冗余存储在一张宽表中。
✅ 特点
| 优点 | 缺点 |
|---|---|
| 查询性能高:只需1次JOIN(事实表 ↔ 维度表) | 存储冗余:维度属性重复存储(如“手机”类目在每个商品记录中都存一遍) |
| 结构简单直观:易于理解,适合业务人员和BI工具 | 维度表可能很宽:属性多时,表字段数量庞大 |
| ETL逻辑简单:维度处理逻辑集中 | 更新维度属性时需更新整张表(对Type 1 SCD) |
✅ 示例结构
+------------------+
| fact_sales |
+------------------+
| order_id |
| product_id ─────┼───┐
| user_id ─────┼─┐ │
| date_id ─────┼─┼─┼──→ +------------------+
| sales_amount | │ │ | dim_product |
+------------------+ │ │ +------------------+
│ │ | product_id (PK) |
│ │ | product_name |
│ │ | category_name | ← 所有类目信息直接存在这里
│ │ | brand |
│ │ +------------------+
│ │
│ └──→ +------------------+
│ | dim_user |
│ +------------------+
│ | user_id (PK) |
│ | user_name |
│ | city |
│ | province | ← 省/市信息直接存在这里
│ +------------------+
│
└────→ +------------------+
| dim_date |
+------------------+
| date_id (PK) |
| year, month, day |
| is_holiday |
+------------------+
💡 适用场景:绝大多数BI分析、报表、即席查询。是维度建模的首选推荐模型。
二、雪花模型(Snowflake Schema)
✅ 定义
- 是星型模型的规范化扩展。
- 维度表被进一步拆分成多个关联的子维度表,形成“雪花”状的层次结构。
✅ 特点
| 优点 | 缺点 |
|---|---|
| 节省存储空间:消除维度属性的冗余(如类目名称只存一次) | 查询性能较低:需要多次JOIN(事实表 → 商品表 → 类目表) |
| 数据一致性好:维度属性集中管理,更新只需改一处 | 结构复杂:对业务人员和SQL编写者不友好 |
| 适合高规范化要求的场景 | BI工具配置复杂,可能影响自助分析 |
✅ 示例结构(对比星型模型)
+------------------+
| fact_sales |
+------------------+
| product_id ─────┼───→ +------------------+
| ... | | dim_product |
+------------------+ +------------------+
| product_id (PK) |
| product_name |
| category_id ─────┼──→ +------------------+
| brand | | dim_category |
+------------------+ +------------------+
| category_id (PK) |
| category_name | ← 类目单独成表
+------------------+
+------------------+
| dim_user |
+------------------+
| user_id (PK) |
| user_name |
| city_id ─────────┼──→ +------------------+
+------------------+ | dim_city |
+------------------+
| city_id (PK) |
| city_name |
| province_id ─────┼──→ +------------------+
+------------------+ | dim_province |
+------------------+
| province_id (PK) |
| province_name |
+------------------+
💡 适用场景:
- 存储成本极其敏感(如超大规模数据)
- 维度属性层级极深且变化频繁(如多级组织架构)
- 底层使用支持高效多表JOIN的MPP数据库(如Redshift, Snowflake)
三、核心对比总结
| 特性 | 星型模型(Star Schema) | 雪花模型(Snowflake Schema) |
|---|---|---|
| 维度表结构 | 去规范化(宽表) | 规范化(拆分成多表) |
| JOIN次数 | 少(通常1次) | 多(2次或以上) |
| 查询性能 | ⭐⭐⭐⭐⭐ 高 | ⭐⭐☆ 较低 |
| 存储空间 | 较大(有冗余) | 较小(无冗余) |
| 模型复杂度 | 简单直观 | 复杂 |
| 维护难度 | 低 | 高 |
| BI工具友好度 | 非常友好 | 一般 |
| 推荐程度 | ✅ 首选 | ⚠️ 谨慎使用 |
四、如何选择?
-
90%以上的场景,选择星型模型。
因为现代数据仓库(如Hive, ClickHouse, Doris, Snowflake)存储成本已大幅降低,而查询性能和开发效率更重要。 -
仅在以下情况考虑雪花模型:
- 维度属性存在严重的重复(如一个类目被百万商品引用)
- 有严格的数据库规范化要求
- 使用的查询引擎对多表JOIN优化极好,且存储成本是瓶颈
✅ 终极建议:
“先建星型,再看是否需要雪花化。”
从星型模型开始,保持简单高效。只有当出现明确的存储或维护问题时,才局部将某些维度“雪花化”,而非全盘采用雪花模型。
4752

被折叠的 条评论
为什么被折叠?



