别再被“数据仓库”唬住了,它就是个专门看数的数据库
MySQL管的是你下单、注册、支付,数据在不停地变;数据仓库管的是“过去发生了什么”,数据进去基本就不动了。它的活儿就一个:伺候老板、运营、分析师看报表。
今儿我就按我自己的理解,把数据仓库的概念、架构捋一遍。
先给个“人话版”定义
专业书上说,数据仓库是一个面向主题的、集成的、带时间属性的、基本不变的数据集合。听着晕是吧?
拆开来看:
- 面向主题:不是按“订单系统”“用户系统”分,而是按“用户分析”“销售分析”这种目标来组织数据。说白了,就是按事儿分,不按系统分。
- 集成:数据从四面八方来(MySQL、日志、第三方接口),全拽过来,统一格式,规整到一个锅里。
- 带时间:不光有当前数,还存历史,能看到趋势。比如不光知道这个月卖了多少钱,还能知道去年这个时候卖了多少,对比着看。
- 基本不变:数据进去就进去了,不删不改,只查。这点跟业务库完全反着来。
跟普通数据库到底有啥不一样?
我直接列个表,一眼就能看明白:
| 对比项 | 业务数据库(OLTP) | 数据仓库(OLAP) |
|---|---|---|
| 做什么 | 支撑交易,比如下单 | 支撑分析,比如出报表 |
| 怎么操作 | 频繁增删改查 | 主要是查,几乎不改 |
| 数据范围 | 当前状态,数据量相对小 | 历史全量,数据量巨大 |
| 设计思路 | 按业务功能来(范式建模) | 按分析主题来(维度建模) |
业务库是你“干活儿”的地儿,数据仓库是你“看数”的地儿。各司其职,谁也替不了谁。
数据怎么流?从源头到报表
整个流程就四步:数据源 → 存储加工 → 分析计算 → 展示。
graph TD A[数据源] -->|抽取/清洗| B[数据存储层] B -->|分析计算| C[应用工具层] C -->|结果展示| D[可视化界面]
1. 数据源——啥都往里灌
- 业务库:MySQL、PG里的订单、用户、支付流水
- 日志:用户点的每个按钮、每个页面的停留时间
- 第三方:合作方的API、公开数据集
反正能搞到的,全整进来,先存上再说。
2. 存储层——核心加工区
原始数据脏得很,没法直接用。这层主要干三件事:
- 清洗:去重、修正乱码、填上空值
- 转换:统一单位、统一日期格式、把表关联起来
- 重组:按主题重新组织,整成规整的分析模型
3. 应用层——拿数据干活
数据整好了,得有人用。这层提供工具:
- OLAP:让你从不同角度切数据,比如按时间、按地区、按产品组合查
- 数据挖掘:跑算法模型,比如预测用户流失
- 统计分析:做回归、假设检验这些
4. 展示层——最后画成图
折线图看趋势,柱状图看对比,仪表盘看实时指标。老板们就爱看这个。
几个必须搞懂的概念
主题:就是“按啥目标来组织数据”。电商平台常见的:用户主题、商品主题、订单主题。同一个用户的数据可能来自注册、订单、客服三个系统,在“用户主题”下全汇到一块儿。
粒度:数据的粗细程度。细粒度:每一条订单明细都存,能回答很细的问题,但数据量爆炸;粗粒度:只存每天汇总的销售额,查询快,但只能看大面。我做过一个用户行为项目,存的是每一条点击日志,半年后查询慢到怀疑人生——粒度过细的教训,血的教训。
维度:看数据的角度。“时间”是维度,“地区”也是,“产品品类”还是。时间还能分层:日→周→月→季→年,报表里可以从年度下钻到月度,再下钻到每天,这就是维度的威力。
数据集市:数据仓库的一个“子集”,只关注某个业务线。比如销售部门不想看用户行为,单独切一个“销售数据集市”出来,查得又快又爽。
经典的四层架构
实际工程里,数据仓库是分层设计的。每一层干自己的活儿,改一层不影响别的层,排查问题也能逐层定位。
| 分层 | 全称 | 存什么 | 存成啥样 |
|---|---|---|---|
| ODS层 | 操作数据存储 | 原始数据,从各源直接同步,原封不动 | CSV、JSON,轻度压缩 |
| DWD层 | 数据仓库明细层 | 清洗、标准化之后的明细数据 | 列式存储+压缩(比如Parquet),省空间 |
| DWS层 | 数据仓库服务层 | 按主题聚合好的指标(比如日活、月活) | 不压太狠,保证查询速度 |
| ADS层 | 数据应用层 | 直接给业务用的结果数据,报表里看到的那种 | 按需来,怎么快怎么存 |
实际项目中,ODS和DWD有时候会合并,DWS和ADS也经常混着叫。别纠结名字,记住一个核心逻辑:越往下越原始,越往上越聚合。
实操里几个血泪教训
分层看着规整,真用起来有几个坑,我踩过,希望你别踩。
1. 粒度别设计太细。 一开始容易贪多,想着“全存下来,以后啥都能查”。但数据量增长远超你想象,半年后查询慢到想砸电脑。我的建议:从业务最关心的问题出发,反推需要什么粒度。别为了“万一以后用得上”存了不该存的。
2. ETL一定要管好失败重试。 从ODS到DWD的清洗转换,一旦某个任务挂了,下游全断粮。重试机制和失败告警必须设计好,别问我是怎么知道的。
3. 数据质量是最大的坑。 最头疼的不是写SQL,而是发现上游某个字段的含义变了、枚举值增加了、时间格式改了。我一个同事曾经排查了三天,最后发现是上游把“status=1”从“已支付”改成了“已发货”。强烈建议在ODS到DWD这层做充分的校验和兜底。