第02章 数据建模¶
📚 章节概述¶
本章将深入讲解数据建模技术,包括维度建模、星型模型、雪花模型等。通过本章学习,你将能够设计高质量的数据模型。
🎯 学习目标¶
完成本章后,你将能够:
- 理解数据建模的核心概念
- 掌握维度建模方法
- 了解星型模型和雪花模型
- 掌握ER图设计
- 能够设计生产级的数据模型
2.1 数据建模概述¶
2.1.1 什么是数据建模¶
数据建模是对现实世界进行抽象,用数据结构表示的过程。
数据建模的目标¶
- 准确性
- 准确反映业务需求
- 避免数据冗余
-
保证数据一致性
-
性能
- 优化查询性能
- 减少数据扫描
-
提高响应速度
-
可扩展性
- 支持业务增长
- 易于修改和扩展
- 适应变化
2.1.2 数据建模层次¶
2.2 维度建模¶
2.2.1 维度建模概述¶
维度建模是数据仓库建模的主流方法,由Ralph Kimball提出。
核心概念¶
- 事实表(Fact Table)
- 存储业务事件
- 包含度量值
-
外键关联维度表
-
维度表(Dimension Table)
- 存储描述性信息
- 用于分析和过滤
- 相对稳定
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图元素¶
- 实体(Entity)
- 表示现实世界中的对象
-
用矩形表示
-
属性(Attribute)
- 描述实体的特性
-
用椭圆表示
-
关系(Relationship)
- 描述实体间的关联
- 用菱形表示
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 性能优化¶
- 索引优化
- 为常用查询字段创建索引
- 避免过多索引
-
定期维护索引
-
分区优化
- 按时间分区
- 按地区分区
-
提高查询性能
-
物化视图
- 预计算常用查询
- 提高查询性能
- 定期刷新
2.4.2 存储优化¶
- 列式存储
- 适合分析查询
- 压缩率高
-
减少I/O
-
压缩
- 减少存储空间
- 降低I/O
- 节省成本
2.5 练习题¶
基础题¶
- 选择题
-
维度建模的核心概念不包括什么?
- A. 事实表
- B. 维度表
- C. 关系表
- D. 度量值
-
简答题
- 解释星型模型和雪花模型的区别。
- 说明ER图的核心元素。
进阶题¶
- 实践题
- 设计一个电商数据模型。
- 实现星型模型。
-
优化查询性能。
-
设计题
- 设计一个金融数据模型。
- 设计一个物流数据模型。
答案¶
1. 选择题答案¶
- C(维度建模的核心概念不包括关系表)
2. 简答题答案¶
星型模型和雪花模型的区别: - 星型模型:维度表不规范化,查询性能好 - 雪花模型:维度表规范化,存储效率高
ER图的核心元素: - 实体 - 属性 - 关系
3. 实践题答案¶
参见2.2-2.4节的示例。
4. 设计题答案¶
参见2.2-2.4节的示例。
2.6 面试准备¶
大厂面试题¶
字节跳动¶
- 解释维度建模的核心概念。
- 星型模型和雪花模型的区别是什么?
- 如何设计数据模型?
- 如何优化数据模型性能?
腾讯¶
- ER图的设计原则是什么?
- 如何处理数据冗余?
- 如何设计可扩展的数据模型?
- 如何设计数据模型版本控制?
阿里云¶
- 数据建模的最佳实践是什么?
- 如何设计实时数据模型?
- 如何设计分布式数据模型?
- 如何设计数据模型迁移?
📚 参考资料¶
- 《The Data Warehouse Toolkit》
- 《Data Modeling Essentials》
- 《Dimensional Modeling》
- 《ER Modeling》
🎯 本章小结¶
本章深入讲解了数据建模技术,包括:
- 数据建模的核心概念
- 维度建模方法
- 星型模型和雪花模型
- ER图设计
- 数据模型优化
通过本章学习,你掌握了数据建模的核心技术,能够设计生产级的数据模型。下一章将深入学习ETL流程设计。