跳转至

07 数据仓库构建

数据仓库设计

分层规划

数据仓库分层架构 ADS (Application Data Service) 数据应用层 存放各项统计指标结果。 DWS (Data Warehouse Summary) 汇总数据层 基于上层的指标需求,以分析的主题对象作为建模驱动, 构建公共统计粒度的汇总表。 DWD (Data Warehouse Detail) 明细数据层 基于维度建模理论进行构建,存放维度模型中的事实表, 保存各业务过程最小粒度的操作记录。 DIM (Dimension) 公共维度层 基于维度建模理论进行构建, 存放维度模型中的维度信息。 ODS (Operation Data Store) 原始数据层 存放未经过处理的原始数据,结构上与源系统保持一致, 是数据仓库的数据准备区。

构建流程

数据仓库的设计通常遵循一套结构化方法论,最经典的是 Kimball 维度建模四步法 和 Inmon 企业信息工厂 自上而下的范式。实际项目中,无论采用哪种思路,设计流程都包含以下核心阶段:

一、需求分析与规划

  • 业务调研:明确分析主题(如销售、库存、用户行为),识别关键业务过程和度量指标。
  • 划分数据域:按业务板块初步分类(财务域、客户域、产品域等)。
  • 评估数据源:盘点源系统(ERP、CRM、日志埋点)的数据结构、质量及更新频率。
  • 定义范围与粒度:确定数据仓库的最细原子粒度(如单笔交易、单次点击),这是不可逆的核心决策。

二、概念模型设计(主题域建模)

  • 确定主题域:将业务过程抽象为相对独立的主题(如“客户关系”、“销售流水”)。
  • 总线矩阵构建(Kimball 核心):绘制业务过程与维度的交叉表,确保不同业务过程的维度一致性(Conformed Dimensions),这是构建企业数据仓库架构的基础。
数据域 业务过程 时间 用户 商品 地区 支付方式 退单类型 退单原因类型
交易域 加购物车 √ √ √
下单 √ √ √ √
取消订单 √ √ √ √
支付成功 √ √ √ √ √
退单 √ √ √ √ √ √
退款成功 √ √ √ √ √
用户域 注册 √ √
工具域 领取优惠券 √ √
使用优惠券(下单) √ √
使用优惠券(支付) √ √
互动域 收藏商品 √ √ √
评价 √ √ √

三、逻辑模型设计(维度建模)

这是数据仓库设计的核心环节,产出物为星型模型或雪花模型:

步骤 内容 举例(零售场景)
1. 选取业务过程 确定要分析的具体活动 零售前台收银交易
2. 定义粒度 确定一行记录代表什么 每一条 POS 机扫描流水行
3. 选定维度 描述“谁、何时、何地、何物” 日期、门店、商品、收银员、会员
4. 确定事实 可量化的业务度量值 销售数量、销售金额、折扣金额

注:此阶段需严格区分事实表(存放数字度量)与维度表(存放描述性文字),并处理缓慢变化维(SCD)策略。

四、物理模型设计

将逻辑模型转化为具体的数据库对象:

  • 存储结构选择:根据数据量选择分区表、索引组织表、列式存储(如 Parquet、ORC)。
  • 索引与分区策略:按日期字段进行范围分区,对常用过滤字段建立位图索引或 Bloom Filter。
  • 聚合与物化视图:针对高频汇总查询设计预计算表,以空间换时间。
  • 生命周期管理:设定数据保留周期与压缩归档策略。

五、ETL/ELT 架构设计

数据流转的管道设计,现代架构通常偏向 ELT(先入湖仓再转换):

  1. 抽取:全量/增量同步(CDC 变更数据捕获)、日志采集(Flume/Kafka)。
  2. 清洗与转换:
  3. 脏数据清洗(去NULL、格式归一化)。
  4. 代理键生成(用无意义整型 ID 替换业务主键)。
  5. 维度表拉链表处理(处理 SCD Type 2)。
  6. 加载:针对事实表通常采用增量追加,维度表采用全量快照或缓慢变化更新。

六、数据质量与元数据管理设计

  • 数据质量规则:设计唯一性校验、外键完整性校验、值域约束校验的调度机制。
  • 元数据沉淀:建立指标字典,记录原子指标 → 派生指标 → 复合指标的血缘关系,防止“同名不同义”。

七、测试与部署上线

  • 数据一致性测试:与源系统财务报表 T+1 对账。
  • 性能压测:验证复杂即席查询在大数据量下的响应时间。
  • 灰度迁移:新老报表系统并行运行一段时间后进行切换。

附:两种主流范式对比

特性 Kimball 总线架构 Inmon CIF 架构
设计顺序 自下而上(先数据集市后整合) 自上而下(先建企业级 3NF 数据仓库)
适用场景 业务需求变化快,追求快速交付报表 企业级数据治理强,要求长期数据一致性
核心优势 结构简单,查询性能高 数据冗余低,支撑复杂关联分析

如果需要针对某个具体步骤(例如缓慢变化维的处理逻辑或事实表粒度冲突的解决办法)展开详细说明,可以进一步提问。