一、分层设计
有些设计将 DWD 和 DWS 合并为中间层,或在 DWS 之上再设"数据集市层",但分层思想一致:逐层抽象、复用、解耦。
| 层级 | 名称 | 作用 | 数据特征 |
|---|---|---|---|
| ODS | 存储层 | 从db抽取过来的原样数据 | 无业务逻辑加工 |
| DWD | 明细层 | 清洗、去重、规范编码、维度退化,生成细粒度事实。(如空值替换、格式统一、外键完整性检查) 这一层一般建立数据质量监控(如唯一性、非空、值域) | 原子粒度,经过轻度清洗,保留最细业务过程 |
| DWS | 汇总层 | 按主题或维度预聚合,形成宽表或轻度汇总 | 中度聚合,服务于常用报表或多维分析 |
| ADS | 应用层 | 面向具体应用(报表、大屏、OLAP)加工的个性化数据 | 高度聚合,特定业务服务 |
二、数据建模
1. Kimball 维度建模(推荐)
-
核心 :由 事实表 和 维度表 构成星型或雪花模型。
-
事实表:记录业务过程的可加度量(如销售额、数量),外键关联维度表。
-
维度表:描述业务环境的实体(时间、产品、客户、地域),包含文本属性。
-
优点:查询性能好,易理解,适合 BI 分析。
-
变体:星型模型(维度非规范化,单层)vs 雪花模型(维度规范化,多层)。星型更常用。
2. Inmon 范式建模(三范式)
-
核心:先建企业级数据仓库(3NF),再根据需求构建数据集市。
-
优点:数据冗余低,一致性高,适合复杂更新操作。
-
缺点:分析查询需多表关联,性能较差。
三、设计流程
-
分析需求
-
明确业务目标(KPI、分析维度、报表需求)。
-
确定数据粒度(订单级、日/月汇总级)。
-
-
数据源分析
-
盘点数据源(业务库、日志、文件等)。
-
评估数据质量、更新频率、接口方式。
-
-
总线矩阵设计
-
定义业务过程与公共维度(一致性维度)。
-
确保不同事实表能通过共用维度进行关联(如日期、产品)。
-
-
声明粒度
-
确定事实表中每一行代表的业务细节层次(如"一次订单支付"而非"一天订单汇总")。
-
粒度越细,灵活性越高,但存储成本也越高。
-
-
确定维度
-
针对每个事实表,列出所有可能描述环境的维度(谁、何时、何地、何物)。
-
为每个维度构建维度表,包含主键、属性和缓慢变化维(SCD)策略。
-
-
确定事实
-
选择可度量的数值指标(可加、半可加、不可加)。
-
设计事实表的外键(关联维度)和度量列。
-
-
物理设计与 ETL/ELT
-
选择表分区(按日期)、索引(如位图索引)、压缩方式。
-
设计 ETL/ELT 流程(从 ODS → DWD → DWS → ADS)
-
四、示例
电商相关业务:订单表、商品表、用户表、商品模板表、地域表等。
-
ODS:直接同步。
-
DWD :
事实表 订单表
维度表 时间、地域、商品模板、用户
-
DWS:按天\用户\地域 等维度 经行数据处理
-
ADS: 高价值用户、地域购买力 等
五、技术选型
| 组件 | 可选技术 |
|---|---|
| 离线数仓 | Hive、Spark SQL、Greenplum、MaxCompute |
| 实时数仓 | Flink + Kafka + Druid/ClickHouse/Hologre |
| MPP 数据库 | ClickHouse、Doris、StarRocks、Redshift |
| 数据湖 | Iceberg、Hudi、Delta Lake(集成spark)、Paimon(集成flink) |
| ETL 工具 | DataX、SeaTunnel、DolphinScheduler |
| 可视化 | superset、grafana |