07 数据仓库构建
数据仓库设计¶
分层规划¶
构建流程¶
数据仓库的设计通常遵循一套结构化方法论,最经典的是 Kimball 维度建模四步法 和 Inmon 企业信息工厂 自上而下的范式。实际项目中,无论采用哪种思路,设计流程都包含以下核心阶段:
一、需求分析与规划¶
- 业务调研:明确分析主题(如销售、库存、用户行为),识别关键业务过程和度量指标。
- 划分数据域:按业务板块初步分类(财务域、客户域、产品域等)。
- 评估数据源:盘点源系统(ERP、CRM、日志埋点)的数据结构、质量及更新频率。
- 定义范围与粒度:确定数据仓库的最细原子粒度(如单笔交易、单次点击),这是不可逆的核心决策。
二、概念模型设计(主题域建模)¶
- 确定主题域:将业务过程抽象为相对独立的主题(如“客户关系”、“销售流水”)。
- 总线矩阵构建(Kimball 核心):绘制业务过程与维度的交叉表,确保不同业务过程的维度一致性(Conformed Dimensions),这是构建企业数据仓库架构的基础。
| 数据域 | 业务过程 | 时间 | 用户 | 商品 | 地区 | 支付方式 | 退单类型 | 退单原因类型 |
|---|---|---|---|---|---|---|---|---|
| 交易域 | 加购物车 | √ | √ | √ | ||||
| 下单 | √ | √ | √ | √ | ||||
| 取消订单 | √ | √ | √ | √ | ||||
| 支付成功 | √ | √ | √ | √ | √ | |||
| 退单 | √ | √ | √ | √ | √ | √ | ||
| 退款成功 | √ | √ | √ | √ | √ | |||
| 用户域 | 注册 | √ | √ | |||||
| 工具域 | 领取优惠券 | √ | √ | |||||
| 使用优惠券(下单) | √ | √ | ||||||
| 使用优惠券(支付) | √ | √ | ||||||
| 互动域 | 收藏商品 | √ | √ | √ | ||||
| 评价 | √ | √ | √ |
三、逻辑模型设计(维度建模)¶
这是数据仓库设计的核心环节,产出物为星型模型或雪花模型:
| 步骤 | 内容 | 举例(零售场景) |
|---|---|---|
| 1. 选取业务过程 | 确定要分析的具体活动 | 零售前台收银交易 |
| 2. 定义粒度 | 确定一行记录代表什么 | 每一条 POS 机扫描流水行 |
| 3. 选定维度 | 描述“谁、何时、何地、何物” | 日期、门店、商品、收银员、会员 |
| 4. 确定事实 | 可量化的业务度量值 | 销售数量、销售金额、折扣金额 |
注:此阶段需严格区分事实表(存放数字度量)与维度表(存放描述性文字),并处理缓慢变化维(SCD)策略。
四、物理模型设计¶
将逻辑模型转化为具体的数据库对象:
- 存储结构选择:根据数据量选择分区表、索引组织表、列式存储(如 Parquet、ORC)。
- 索引与分区策略:按日期字段进行范围分区,对常用过滤字段建立位图索引或 Bloom Filter。
- 聚合与物化视图:针对高频汇总查询设计预计算表,以空间换时间。
- 生命周期管理:设定数据保留周期与压缩归档策略。
五、ETL/ELT 架构设计¶
数据流转的管道设计,现代架构通常偏向 ELT(先入湖仓再转换):
- 抽取:全量/增量同步(CDC 变更数据捕获)、日志采集(Flume/Kafka)。
- 清洗与转换:
- 脏数据清洗(去NULL、格式归一化)。
- 代理键生成(用无意义整型 ID 替换业务主键)。
- 维度表拉链表处理(处理 SCD Type 2)。
- 加载:针对事实表通常采用增量追加,维度表采用全量快照或缓慢变化更新。
六、数据质量与元数据管理设计¶
- 数据质量规则:设计唯一性校验、外键完整性校验、值域约束校验的调度机制。
- 元数据沉淀:建立指标字典,记录原子指标 → 派生指标 → 复合指标的血缘关系,防止“同名不同义”。
七、测试与部署上线¶
- 数据一致性测试:与源系统财务报表 T+1 对账。
- 性能压测:验证复杂即席查询在大数据量下的响应时间。
- 灰度迁移:新老报表系统并行运行一段时间后进行切换。
附:两种主流范式对比¶
| 特性 | Kimball 总线架构 | Inmon CIF 架构 |
|---|---|---|
| 设计顺序 | 自下而上(先数据集市后整合) | 自上而下(先建企业级 3NF 数据仓库) |
| 适用场景 | 业务需求变化快,追求快速交付报表 | 企业级数据治理强,要求长期数据一致性 |
| 核心优势 | 结构简单,查询性能高 | 数据冗余低,支撑复杂关联分析 |
如果需要针对某个具体步骤(例如缓慢变化维的处理逻辑或事实表粒度冲突的解决办法)展开详细说明,可以进一步提问。