
01
—
什么是维度建模
维度建模是数据仓库设计中最关键的步骤之一。它将复杂的业务需求转化为结构化的、易于理解和查询的数据模型。维度模型通常采用星型模式或雪花模式,由事实表和维度表组成。
维度建模的核心概念:
事实表: 包含业务过程的度量值(如销售额、数量等)。维度表: 包含描述业务实体的属性(如产品、客户、时间等)。粒度: 事实表中单条记录所代表的业务含义的细节程度。维度层次: 维度内部的逻辑结构,如时间维度中的年、月、日。
维度建模步骤:
确定业务过程: 根据需求分析,识别需要建模的核心业务过程(如销售、库存、客户服务等)。
声明粒度: 为每个业务过程确定适当的粒度级别。
识别维度: 确定描述每个业务过程的维度。
识别事实: 确定需要度量的业务指标。
设计维度表: 详细设计每个维度表,包括属性、层次结构等。
设计事实表: 设计事实表,包括外键和度量值

02
—
维度建模考虑的关键因素
缓慢变化维度(SCD)处理:
维度属性可能随时间变化,如客户地址、产品价格等。我们需要决定如何处理这些变化:
类型1: 直接覆盖旧值
类型2: 保留历史记录,创建新行
类型3: 增加新列保存当前值
示例: 对于客户维度中的会员等级,我们可能选择使用类型2 SCD,以便跟踪客户等级的变化历史。
退化维度:
有时,一些低基数的属性可以直接包含在事实表中,而不需要创建单独的维度表。
示例: 订单状态(已付款、已发货、已完成等)可以作为退化维度直接存储在销售事实表中。
桥接表:
用于处理多对多关系或复杂层次结构。
示例: 如果一个订单可以应用多个促销,我们可能需要一个桥接表来连接销售事实表和促销维度表。
一致性维度:
确保跨多个事实表的共同维度保持一致。
示例: 产品维度应在销售、库存、采购等多个事实表中保持一致。
日期维度的特殊处理:
日期维度通常需要预先生成,包含丰富的属性以支持各种时间相关的分析。
03
—
维度建模应用案例
示例:电商销售数据的维度模型
让我们以电商公司的销售数据为例,设计一个星型模式的维度模型:
1. 业务过程: 销售订单2. 粒度: 单个订单项(一个订单中的一个产品)3. 维度:- 时间维度- 产品维度- 客户维度- 地理维度- 促销维度4. 事实:- 销售金额- 销售数量- 折扣金额- 利润5. 维度表设计:时间维度(DIM_TIME):- 时间键(主键)- 日期- 年- 季度- 月- 周- 是否节假日产品维度(DIM_PRODUCT):- 产品键(主键)- 产品ID- 产品名称- 品类- 子类- 品牌- 单位成本- 建议零售价客户维度(DIM_CUSTOMER):- 客户键(主键)- 客户ID客户维度(DIM_CUSTOMER):- 客户键(主键)- 客户ID- 客户名称- 客户类型(个人/企业)- 注册日期- 年龄段- 性别- 会员等级地理维度(DIM_GEOGRAPHY):- 地理键(主键)- 国家- 省/州- 城市- 邮政编码促销维度(DIM_PROMOTION):- 促销键(主键)- 促销ID- 促销名称- 促销类型- 开始日期- 结束日期- 折扣率6. 事实表设计:销售事实表(FACT_SALES):- 订单项ID(主键)- 时间键(外键)- 产品键(外键)- 客户键(外键)- 地理键(外键)- 促销键(外键)- 订单ID- 销售金额- 销售数量- 折扣金额- 利润
维度模型的SQL实现示例:
以下是基于上述星型模式的部分SQL创建语句:
-- 创建时间维度表CREATE TABLE DIM_TIME (time_key INT PRIMARY KEY,date DATE,year INT,quarter INT,month INT,week INT,is_holiday BOOLEAN);-- 创建产品维度表CREATE TABLE DIM_PRODUCT (product_key INT PRIMARY KEY,product_id VARCHAR(50),product_name VARCHAR(100),category VARCHAR(50),subcategory VARCHAR(50),brand VARCHAR(50),unit_cost DECIMAL(10,2),retail_price DECIMAL(10,2));-- 创建客户维度表CREATE TABLE DIM_CUSTOMER (customer_key INT PRIMARY KEY,customer_id VARCHAR(50),customer_name VARCHAR(100),customer_type VARCHAR(20),registration_date DATE,age_group VARCHAR(20),gender VARCHAR(10),membership_level VARCHAR(20));-- 创建销售事实表CREATE TABLE FACT_SALES (order_item_id BIGINT PRIMARY KEY,time_key INT,product_key INT,customer_key INT,geography_key INT,promotion_key INT,order_id VARCHAR(50),sales_amount DECIMAL(12,2),quantity INT,discount_amount DECIMAL(10,2),profit DECIMAL(10,2),FOREIGN KEY (time_key) REFERENCES DIM_TIME(time_key),FOREIGN KEY (product_key) REFERENCES DIM_PRODUCT(product_key),FOREIGN KEY (customer_key) REFERENCES DIM_CUSTOMER(customer_key),FOREIGN KEY (geography_key) REFERENCES DIM_GEOGRAPHY(geography_key),FOREIGN KEY (promotion_key) REFERENCES DIM_PROMOTION(promotion_key));
04
—
小结
维度建模的优势:
直观性: 星型或雪花模型结构简单,易于业务用户理解。查询性能: 通过降低表的数量和预先计算聚合,提高查询速度。灵活性: 易于添加新的维度或修改现有维度,以适应业务变化。一致性: 提供了一个统一的数据视图,确保跨部门的报告一致性。
维度建模的挑战:
数据冗余: 维度表中可能存在数据重复,需要权衡存储成本和查询性能。维护复杂性: 随着维度和事实表的增加,模型可能变得复杂,需要仔细管理。历史数据处理: 处理缓慢变化维度可能会增加模型的复杂性和存储需求。粒度选择: 选择过粗的粒度可能无法满足详细分析需求,选择过细则可能影响性能。
维度建模最佳实践:
从高层需求出发: 始终以业务需求为导向,避免过度设计。保持简单: 尽可能使用星型模式,只在必要时采用雪花模式。标准化命名: 采用一致的命名约定,提高模型的可读性。考虑未来扩展: 在设计时预留扩展空间,以适应未来的需求变化。性能优化: 合理使用索引、分区等技术,提升查询性能。数据质量: 在ETL过程中加入数据质量检查,确保维度模型中的数据准确性。
维度建模是一个迭代的过程,需要与业务用户密切合作,不断调整和优化。一个优秀的维度模型不仅能满足当前的分析需求,还能为未来的业务发展提供灵活性和可扩展性。

往期精彩
一种基于滑动平均的时间序列滤波方法 | Hive UDF 实现
数仓建模:如何有效构建DWB/DWM层?| 基于案例实战分析




