维度建模是什么
维度建模(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)典型使用场景
- 指标口径统一:度量定义在事实表里,避免每张报表各写一遍
- 多维分析:同一份事实按日期、地域、商品等维度自由下钻
- 缓慢变化维:用户等级、所属城市变化时用拉链维度保留历史
- 跨主题复用:一致性维度让不同事实表可以按同一口径对比
- 报表性能:预连接好的宽表比每次多表关联快得多
两类表对比
| 维度 | 事实表 | 维度表 |
|---|---|---|
| 内容 | 业务事件与度量 | 实体描述属性 |
| 规模 | 行数增长快 | 行数相对稳定 |
| 宽度 | 列少 | 列多 |
| 更新方式 | 按分区追加或覆盖 | 缓慢变化维策略决定 |
| 典型字段 | 金额、数量、外键 | 名称、分类、状态 |
维度建模不追求范式化,适度冗余换取查询简洁;是否冗余以是否显著增加维护成本为准。
建模的第一步永远是确定粒度:一行事实代表什么?粒度定错之后再加维度,只会得到一份无法复用、越改越乱的表。