首页/数据/数据工程与 ETL 速查/维度建模基础(事实与维度)

维度建模基础(事实与维度)

维度建模把业务抽象成两类表:事实表存可度量的业务事件(数值加外键),维度表存描述性属性(谁、什么、哪里、何时);查询时事实与维度连接,结构直观、聚合友好。

维度建模是什么

维度建模(Kimball 体系)把业务抽象成两类表:事实表记录可度量的业务事件,每行一个事件,由外键加度量组成,行多列少;维度表记录「谁、什么、哪里、何时」这类描述性属性,行少列多。查询时把事实与维度连接,既直观又对聚合友好。它不追求范式化,而是适度冗余换取查询简洁——这也是它与传统三范式建模最主要的取舍差别。

基本信息

事实表外键加度量,行多列少
维度表主键加描述属性,行少列多
核心决策顺序先定粒度,再定维度与度量
适用场景分析型查询、BI 报表、指标体系
常见变体星型模型、雪花模型、星座模型
维度变化处理缓慢变化维(SCD)类型 1/2/3 策略

结构示意

结构示意
-- 事实表:一行一个订单
fact_order(order_sk, date_sk, user_sk, product_sk, amount, qty)
-- 维度表:一行一个用户(当前版本)
dim_user(user_sk, user_id, name, city, level)

典型使用场景

  • 指标口径统一:度量定义在事实表里,避免每张报表各写一遍
  • 多维分析:同一份事实按日期、地域、商品等维度自由下钻
  • 缓慢变化维:用户等级、所属城市变化时用拉链维度保留历史
  • 跨主题复用:一致性维度让不同事实表可以按同一口径对比
  • 报表性能:预连接好的宽表比每次多表关联快得多

两类表对比

维度事实表维度表
内容业务事件与度量实体描述属性
规模行数增长快行数相对稳定
宽度列少列多
更新方式按分区追加或覆盖缓慢变化维策略决定
典型字段金额、数量、外键名称、分类、状态
维度建模不追求范式化,适度冗余换取查询简洁;是否冗余以是否显著增加维护成本为准。
建模的第一步永远是确定粒度:一行事实代表什么?粒度定错之后再加维度,只会得到一份无法复用、越改越乱的表。

易错点

  • 先写 SQL 再补模型,容易得到一堆无法复用的表
  • 把明细属性全塞进事实表,事实表越来越宽、维度复用消失
  • 粒度没定清就加维度,出现一行既不是订单也不是订单商品的情况
  • 缓慢变化维不做历史保留,回溯报表时无法还原当时的维度属性
  • 用业务主键而不是代理键做维度关联,源系统主键变更时整条链路受影响

数据来源与参考

  • Kimball《The Data Warehouse Toolkit》第 1-2 章
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌