数据仓库主要的建模方法是:维度建模和实体关系建模(ER建模)。其他还有ER模型的衍生模型:Data Vault 模型和Anchor 模型,但很少使用。
维度建模
概念描述:
维度建模由 Ralph Kimball 在《数据仓库工具箱》一书中提出的建模方法,其核心思想是将数据组织成事实表和维度表。
事实表:用于存储业务过程中的度量值,比如销售金额、订单数量等,它包含了与业务过程相关的事实数据,每行代表一个业务事件。
维度表:为事实表中的度量值提供上下文信息,例如时间、地点、产品等,维度表可以理解为对业务事件发生的环境进行描述。
维度建模方法的提出主要是为了应对分析决策场景,所以维度建模在分析需求中的响应速度更快,并且在大规模查询中的性能更强。
维度建模的步骤:
1. 选择业务过程
确定要建模的业务流程,例如销售业务、库存管理业务等。业务过程是业务活动的一个明确的操作单元,是维度建模的起点。
2. 声明粒度
粒度指事实表中一行数据所代表的业务细节程度。粒度越细,数据越详细;粒度越粗,数据越汇总。在设计事实表之前,需要明确事实表的粒度,例如是按每笔交易记录,还是按每天的汇总数据记录。
3. 确定维度
找出与业务过程相关的所有维度,如时间、地点、产品、客户等。每个维度都有一个唯一的主键,用于关联事实表。维度表可以包含描述该维度的各种属性,如产品维度表可以包含产品名称、产品类别、产品价格等属性。
4. 确定事实
确定业务过程中的度量值,也就是事实。事实通常是数值型的,并且是可加的,例如销售金额、销售数量等。将这些事实存储在事实表中,并通过外键与维度表关联。
维度建模案例:
以电商销售业务为例,下面进行维度建模。
1. 选择业务过程
本次选择电商的销售业务作为建模的业务过程。
2. 声明粒度
事实表的粒度为订单id+产品id,即事实表中的每行数据中订单id和产品id都是不同的。
3. 确定维度
时间维度:包含日期、年份、季度、月份、星期等属性。
产品维度:包含产品 ID、产品名称、产品类别、产品价格等属性。
客户维度:包含客户 ID、客户姓名、客户性别、客户所在地区等属性。
店铺维度:包含店铺 ID、店铺名称、店铺所在地区等属性。
4. 确定事实
销售金额:每笔订单的销售总金额。
销售数量:每笔订单中销售的产品数量。
以下是简单的 SQL 代码示例,用于创建上述维度表和事实表:
sql
-- 创建时间维度表
CREATE TABLE time_dimension (
date DATE,
year INT,
quarter INT,
month INT,
week INT
);
-- 创建产品维度表
CREATE TABLE product_dimension (
product_id VARCHAR(50),
product_name VARCHAR(100),
product_category VARCHAR(50),
product_price DECIMAL(10, 2)
);
-- 创建客户维度表
CREATE TABLE customer_dimension (
customer_id VARCHAR(50),
customer_name VARCHAR(100),
customer_gender VARCHAR(10),
customer_region VARCHAR(50)
);
-- 创建店铺维度表
CREATE TABLE store_dimension (
store_id VARCHAR(50),
store_name VARCHAR(100),
store_region VARCHAR(50)
);
-- 创建订单事实表
CREATE TABLE sales_fact (
order_id INT,
product_id INT,
order_date INT,
customer_id INT,
store_id INT,
sales_amount DECIMAL(10, 2),
sales_quantity INT
);
通过以上步骤和实例,你可以对维度建模有一个基本的了解,上面的模型是一个典型的星型模型。在实际应用中,需要根据具体的业务需求和数据特点进行灵活调整。
ER建模
概念描述:
ER建模又称为范式建模法,是由数据仓库之父Bill Inomon提出的建模理论,它基于关系数据库的设计理论,以减少数据冗余、保证数据一致性为主要目标,遵循一定的范式规则:如第一范式(1NF)、第二范式(2NF)、第三范式(3NF)等。
设计步骤:
需求分析:梳理业务,明确分析需求。
实体识别:从业务中提取实体,如客户、订单、产品等。
属性定义:为每个实体定义属性,如客户的姓名、年龄、地址等。
关系确定:分析实体之间的关系,如一对一、一对多、多对多关系。
范式化处理:对数据模型进行范式化,消除数据冗余和异常。
优缺点:
优点:数据冗余小,数据一致性高,便于数据的维护和更新。
缺点:查询性能相对较低,因为需要进行大量的表连接操作;模型设计和开发的复杂度较高。
适用场景:适用于对数据一致性要求较高、数据更新频繁的场景,如在线事务处理(OLTP)系统。
ER建模案例:
以下是一个使用 ER 建模方法的数据仓库建设案例,以在线书店为例。
数据建模步骤
需求分析:与在线书店的业务人员沟通,了解他们的业务流程、数据需求和分析目标。例如,业务人员可能需要分析不同类别书籍的销售情况、客户的购买偏好等。
概念建模:根据需求分析的结果,确定实体、属性和关系。在在线书店的案例中,实体包括书籍、客户、订单和订单商品;属性是每个实体的特征,如书籍的标题、客户的姓名等;关系描述了实体之间的联系,如客户下订单、订单包含订单商品等。
逻辑建模:将概念模型转换为逻辑模型,确定表结构、字段类型和约束条件。在 ER 建模中,每个实体对应一个表,每个属性对应一个字段,关系通过外键来实现。
物理建模:根据逻辑模型,选择合适的数据库管理系统(DBMS)和存储结构,优化数据仓库的性能。例如,选择合适的索引、分区策略等。
实施和维护:创建数据库表,导入数据,并进行数据验证和测试。在数据仓库的运行过程中,定期进行数据更新和维护,确保数据的准确性和完整性。
ER 模型描述
实体:
书籍(Books):包含书籍的基本信息,如标题、作者、价格等。
客户(Customers):包含客户的基本信息,如姓名、邮箱、地址等。
订单(Orders):包含订单的基本信息,如订单日期、总金额等,客户id等。
订单商品(Order_Items):包含订单中的商品信息,如订单id、书籍id、数量等。
关系:
客户 - 订单:一个客户可以下多个订单,是一对多的关系。
订单商品:一个订单可以包含多本书籍,是一对多的关系。
模型设计
模型关系图: