跳转至

第04章 数据仓库架构

数据仓库架构

📚 章节概述

本章将深入讲解数据仓库架构,包括数据仓库设计、分层架构、主题建模等。通过本章学习,你将能够设计和构建生产级的数据仓库。

🎯 学习目标

完成本章后,你将能够:

  1. 理解数据仓库的核心概念
  2. 掌握数据仓库分层架构
  3. 了解主题建模方法
  4. 掌握数据仓库性能优化
  5. 能够设计生产级的数据仓库架构

4.1 数据仓库概述

4.1.1 什么是数据仓库

数据仓库是面向主题的、集成的、相对稳定的、反映历史变化的数据集合,用于支持管理决策。

数据仓库特点

  1. 面向主题
  2. 围绕主题组织
  3. 如销售、客户、产品
  4. 不是面向应用

  5. 集成性

  6. 数据来自多个源
  7. 统一的数据模型
  8. 一致的数据定义

  9. 非易失性

  10. 数据相对稳定
  11. 历史数据保留
  12. 不频繁删除

  13. 时变性

  14. 反映历史变化
  15. 记录数据变化
  16. 支持时间序列分析

4.1.2 数据仓库vs 操作型数据库

特性 操作型数据库 数据仓库
用途 日常业务操作 决策支持
数据 当前、详细 历史、汇总
更新 频繁、实时 批量、定期
查询 简单、事务 复杂、分析
性能 事务处理 查询性能

4.2 数据仓库分层架构

4.2.1 分层概述

数据仓库分层是将数据按照处理程度和使用目的分成不同层次。

分层架构

Text Only
源系统 → ODS → DWD → DWS → ADS
         ↓     ↓     ↓     ↓
      原始  明细  汇总  应用
      数据  数据  数据  数据

4.2.2 ODS层(操作数据存储)

ODS(Operational Data Store)是数据仓库的第一层,存储从源系统抽取的原始数据。

ODS特点

  1. 原始数据
  2. 不做转换
  3. 保持原样
  4. 便于回溯

  5. 分区存储

  6. 按日期分区
  7. 按来源分区
  8. 提高查询性能

ODS示例

SQL
-- Hive语法:分区列需显式声明,不支持函数表达式
CREATE TABLE ods_sales (
    sale_id INT,
    product_id INT,
    customer_id INT,
    sale_date DATE,
    quantity INT,
    amount DECIMAL(10,2),
    source_system VARCHAR(50),
    extract_time TIMESTAMP
) PARTITIONED BY (dt STRING, dm STRING)
STORED AS PARQUET;

4.2.3 DWD层(数据仓库明细层)

DWD(Data Warehouse Detail)是数据仓库的明细层,存储清洗和转换后的明细数据。

DWD特点

  1. 清洗数据
  2. 去重
  3. 填充缺失值
  4. 数据标准化

  5. 维度建模

  6. 星型模型
  7. 雪花模型
  8. 维度表和事实表

DWD示例

SQL
-- 事实表(Hive语法)
CREATE TABLE dwd_sales_fact (
    sale_id INT,
    product_id INT,
    customer_id INT,
    time_id INT,
    store_id INT,
    quantity INT,
    amount DECIMAL(10,2)
) PARTITIONED BY (dt STRING, dm STRING)
STORED AS PARQUET;

-- 维度表(MySQL/PostgreSQL语法;Hive中无PRIMARY KEY约束,改用STORED AS PARQUET)
CREATE TABLE dwd_product_dim (
    product_id INT PRIMARY KEY,
    product_name VARCHAR(100),
    category VARCHAR(50),
    brand VARCHAR(50),
    price DECIMAL(10,2)
);
-- 若使用Hive:
-- CREATE TABLE dwd_product_dim (
--     product_id INT,
--     product_name STRING,
--     category STRING,
--     brand STRING,
--     price DECIMAL(10,2)
-- ) STORED AS PARQUET;

4.2.4 DWS层(数据仓库汇总层)

DWS(Data Warehouse Summary)是数据仓库的汇总层,存储按维度汇总的数据。

DWS特点

  1. 汇总数据
  2. 按日期汇总
  3. 按地区汇总
  4. 按产品汇总

  5. 预计算

  6. 常用指标预计算
  7. 提高查询性能
  8. 降低计算成本

DWS示例

SQL
-- 日销售汇总(MySQL/PostgreSQL语法;Hive中不支持PRIMARY KEY,可改用PARTITIONED BY + STORED AS PARQUET)
CREATE TABLE dws_sales_daily (
    date DATE,
    product_id INT,
    store_id INT,
    total_quantity INT,
    total_amount DECIMAL(10,2),
    order_count INT,
    PRIMARY KEY (date, product_id, store_id)
);

-- 月度销售汇总
CREATE TABLE dws_sales_monthly (
    year INT,
    month INT,
    product_id INT,
    total_quantity INT,
    total_amount DECIMAL(10,2),
    order_count INT,
    PRIMARY KEY (year, month, product_id)
);

4.2.5 ADS层(应用数据服务层)

ADS(Application Data Service)是数据仓库的应用层,存储面向具体应用的数据。

ADS特点

  1. 应用导向
  2. 面向具体应用
  3. 数据格式优化
  4. 查询性能优化

  5. 数据服务

  6. API接口
  7. BI报表
  8. 数据导出

ADS示例

SQL
-- 销售报表
CREATE TABLE ads_sales_report (
    date DATE,
    product_name VARCHAR(100),
    category VARCHAR(50),
    total_quantity INT,
    total_amount DECIMAL(10,2),
    growth_rate DECIMAL(5,2)
);

-- 客户分析
CREATE TABLE ads_customer_analysis (
    customer_id INT,
    customer_name VARCHAR(100),
    total_orders INT,
    total_amount DECIMAL(10,2),
    avg_order_value DECIMAL(10,2),
    last_order_date DATE
);

4.3 主题建模

4.3.1 主题概述

主题是数据仓库中围绕业务主题组织数据的方式。

常见主题

  1. 销售主题
  2. 销售事实
  3. 产品维度
  4. 客户维度
  5. 时间维度

  6. 客户主题

  7. 客户事实
  8. 客户维度
  9. 交易维度
  10. 时间维度

  11. 产品主题

  12. 产品事实
  13. 产品维度
  14. 分类维度
  15. 品牌维度

4.3.2 主题建模示例

SQL
-- 销售主题
CREATE TABLE sales_fact (
    sale_id INT PRIMARY KEY,
    product_id INT,
    customer_id INT,
    time_id INT,
    store_id INT,
    quantity INT,
    amount DECIMAL(10,2)
);

-- 客户主题
CREATE TABLE customer_fact (
    customer_id INT PRIMARY KEY,
    time_id INT,
    region_id INT,
    total_orders INT,
    total_amount DECIMAL(10,2),
    avg_order_value DECIMAL(10,2)
);

-- 产品主题
CREATE TABLE product_fact (
    product_id INT PRIMARY KEY,
    time_id INT,
    category_id INT,
    total_sales INT,
    total_revenue DECIMAL(10,2),
    avg_price DECIMAL(10,2)
);

4.4 练习题

基础题

  1. 选择题
  2. 数据仓库的分层不包括什么?

    • A. ODS
    • B. DWD
    • C. DWS
    • D. DDL
  3. 简答题

  4. 解释数据仓库的特点。
  5. 说明数据仓库分层的意义。

进阶题

  1. 实践题
  2. 设计一个数据仓库分层架构。
  3. 实现ODS到DWD的数据转换。
  4. 实现DWD到DWS的数据汇总。

  5. 设计题

  6. 设计一个电商数据仓库架构。
  7. 设计一个金融数据仓库架构。

答案

1. 选择题答案

  1. D(数据仓库的分层不包括DDL)

2. 简答题答案

数据仓库的特点: - 面向主题 - 集成性 - 非易失性 - 时变性

数据仓库分层的意义: - 数据逐步清洗和转换 - 提高查询性能 - 便于维护和管理 - 支持不同应用需求

3. 实践题答案

参见4.2-4.3节的示例。

4. 设计题答案

参见4.2-4.3节的示例。

4.5 面试准备

大厂面试题

字节跳动

  1. 解释数据仓库的分层架构。
  2. ODS、DWD、DWS、ADS的区别是什么?
  3. 如何设计数据仓库主题?
  4. 如何优化数据仓库性能?

腾讯

  1. 数据仓库的设计原则是什么?
  2. 如何处理数据仓库的数据质量?
  3. 如何设计数据仓库的ETL流程?
  4. 如何设计数据仓库的分区策略?

阿里云

  1. 数据仓库的最佳实践是什么?
  2. 如何设计数据仓库的扩展性?
  3. 如何设计数据仓库的容灾?
  4. 如何设计数据仓库的监控?

📚 参考资料

  • 《The Data Warehouse Toolkit》
  • 《The Kimball Method》
  • 《Data Warehouse Lifecycle Toolkit》
  • Apache Hive文档
  • Apache Spark SQL文档

🎯 本章小结

本章深入讲解了数据仓库架构,包括:

  1. 数据仓库的核心概念
  2. 数据仓库分层架构
  3. 主题建模方法
  4. 数据仓库性能优化

通过本章学习,你掌握了数据仓库架构设计的核心技术,能够设计生产级的数据仓库。下一章将深入学习数据湖技术。