跳转至

第02章 数据建模

数据建模

📚 章节概述

本章将深入讲解数据建模技术,包括维度建模、星型模型、雪花模型等。通过本章学习,你将能够设计高质量的数据模型。

🎯 学习目标

完成本章后,你将能够:

  1. 理解数据建模的核心概念
  2. 掌握维度建模方法
  3. 了解星型模型和雪花模型
  4. 掌握ER图设计
  5. 能够设计生产级的数据模型

2.1 数据建模概述

2.1.1 什么是数据建模

数据建模是对现实世界进行抽象,用数据结构表示的过程。

数据建模的目标

  1. 准确性
  2. 准确反映业务需求
  3. 避免数据冗余
  4. 保证数据一致性

  5. 性能

  6. 优化查询性能
  7. 减少数据扫描
  8. 提高响应速度

  9. 可扩展性

  10. 支持业务增长
  11. 易于修改和扩展
  12. 适应变化

2.1.2 数据建模层次

Text Only
概念模型 → 逻辑模型 → 物理模型
   ↓           ↓           ↓
业务视图   数据结构   存储结构

2.2 维度建模

2.2.1 维度建模概述

维度建模是数据仓库建模的主流方法,由Ralph Kimball提出。

核心概念

  1. 事实表(Fact Table)
  2. 存储业务事件
  3. 包含度量值
  4. 外键关联维度表

  5. 维度表(Dimension Table)

  6. 存储描述性信息
  7. 用于分析和过滤
  8. 相对稳定

2.2.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),
    FOREIGN KEY (product_id) REFERENCES product_dim(product_id),
    FOREIGN KEY (customer_id) REFERENCES customer_dim(customer_id),
    FOREIGN KEY (time_id) REFERENCES time_dim(time_id),
    FOREIGN KEY (store_id) REFERENCES store_dim(store_id)
);

-- 产品维度表
CREATE TABLE product_dim (
    product_id INT PRIMARY KEY,
    product_name VARCHAR(100),
    category VARCHAR(50),
    brand VARCHAR(50),
    price DECIMAL(10,2)
);

-- 客户维度表
CREATE TABLE customer_dim (
    customer_id INT PRIMARY KEY,
    customer_name VARCHAR(100),
    city VARCHAR(50),
    country VARCHAR(50),
    gender CHAR(1),
    age INT
);

-- 时间维度表
CREATE TABLE time_dim (
    time_id INT PRIMARY KEY,
    date DATE,
    year INT,
    quarter INT,
    month INT,
    day INT,
    day_of_week INT
);

-- 门店维度表
CREATE TABLE store_dim (
    store_id INT PRIMARY KEY,
    store_name VARCHAR(100),
    city VARCHAR(50),
    country VARCHAR(50),
    region VARCHAR(50)
);

2.2.3 雪花模型

雪花模型是星型模型的扩展,维度表可以进一步规范化。

示例:电商雪花模型

SQL
-- 产品维度表(规范化)
CREATE TABLE product_dim (
    product_id INT PRIMARY KEY,
    product_name VARCHAR(100),
    category_id INT,
    brand_id INT,
    price DECIMAL(10,2),
    FOREIGN KEY (category_id) REFERENCES category_dim(category_id),
    FOREIGN KEY (brand_id) REFERENCES brand_dim(brand_id)
);

-- 分类维度表
CREATE TABLE category_dim (
    category_id INT PRIMARY KEY,
    category_name VARCHAR(50),
    department_id INT,
    FOREIGN KEY (department_id) REFERENCES department_dim(department_id)
);

-- 部门维度表
CREATE TABLE department_dim (
    department_id INT PRIMARY KEY,
    department_name VARCHAR(50)
);

-- 品牌维度表
CREATE TABLE brand_dim (
    brand_id INT PRIMARY KEY,
    brand_name VARCHAR(50),
    manufacturer_id INT,
    FOREIGN KEY (manufacturer_id) REFERENCES manufacturer_dim(manufacturer_id)
);

-- 制造商维度表
CREATE TABLE manufacturer_dim (
    manufacturer_id INT PRIMARY KEY,
    manufacturer_name VARCHAR(100),
    country VARCHAR(50)
);

2.3 ER图设计

2.3.1 ER图概述

ER图(实体关系图)是描述数据结构的图形化工具。

ER图元素

  1. 实体(Entity)
  2. 表示现实世界中的对象
  3. 用矩形表示

  4. 属性(Attribute)

  5. 描述实体的特性
  6. 用椭圆表示

  7. 关系(Relationship)

  8. 描述实体间的关联
  9. 用菱形表示

2.3.2 ER图示例

erDiagram
    CUSTOMER ||--o{ ORDER : places
    ORDER ||--|{ ORDER_ITEM : contains
    ORDER_ITEM }|--|| PRODUCT : references
    PRODUCT ||--o{ CATEGORY : belongs_to

2.4 数据模型优化

2.4.1 性能优化

  1. 索引优化
  2. 为常用查询字段创建索引
  3. 避免过多索引
  4. 定期维护索引

  5. 分区优化

  6. 按时间分区
  7. 按地区分区
  8. 提高查询性能

  9. 物化视图

  10. 预计算常用查询
  11. 提高查询性能
  12. 定期刷新

2.4.2 存储优化

  1. 列式存储
  2. 适合分析查询
  3. 压缩率高
  4. 减少I/O

  5. 压缩

  6. 减少存储空间
  7. 降低I/O
  8. 节省成本

2.5 练习题

基础题

  1. 选择题
  2. 维度建模的核心概念不包括什么?

    • A. 事实表
    • B. 维度表
    • C. 关系表
    • D. 度量值
  3. 简答题

  4. 解释星型模型和雪花模型的区别。
  5. 说明ER图的核心元素。

进阶题

  1. 实践题
  2. 设计一个电商数据模型。
  3. 实现星型模型。
  4. 优化查询性能。

  5. 设计题

  6. 设计一个金融数据模型。
  7. 设计一个物流数据模型。

答案

1. 选择题答案

  1. C(维度建模的核心概念不包括关系表)

2. 简答题答案

星型模型和雪花模型的区别: - 星型模型:维度表不规范化,查询性能好 - 雪花模型:维度表规范化,存储效率高

ER图的核心元素: - 实体 - 属性 - 关系

3. 实践题答案

参见2.2-2.4节的示例。

4. 设计题答案

参见2.2-2.4节的示例。

2.6 面试准备

大厂面试题

字节跳动

  1. 解释维度建模的核心概念。
  2. 星型模型和雪花模型的区别是什么?
  3. 如何设计数据模型?
  4. 如何优化数据模型性能?

腾讯

  1. ER图的设计原则是什么?
  2. 如何处理数据冗余?
  3. 如何设计可扩展的数据模型?
  4. 如何设计数据模型版本控制?

阿里云

  1. 数据建模的最佳实践是什么?
  2. 如何设计实时数据模型?
  3. 如何设计分布式数据模型?
  4. 如何设计数据模型迁移?

📚 参考资料

  • 《The Data Warehouse Toolkit》
  • 《Data Modeling Essentials》
  • 《Dimensional Modeling》
  • 《ER Modeling》

🎯 本章小结

本章深入讲解了数据建模技术,包括:

  1. 数据建模的核心概念
  2. 维度建模方法
  3. 星型模型和雪花模型
  4. ER图设计
  5. 数据模型优化

通过本章学习,你掌握了数据建模的核心技术,能够设计生产级的数据模型。下一章将深入学习ETL流程设计。