0%

数据仓库的概念

别再被“数据仓库”唬住了,它就是个专门看数的数据库

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这层做充分的校验和兜底。

欢迎关注我的其它发布渠道