数据仓库:后台服务器就十几张表,为什么要建几十张表的数仓?

引言

初学数据仓库时,心中多少会有一个困惑。那就是后台服务器也就十几张表,为什么使用分层架构+维度建模搭建数仓时就要创建几十张甚至上百张表?这就好比发面馒头,放到蒸笼一蒸,个头就变大了不少。

那数据仓库是不是把一个简单的问题搞得更复杂了呀?

呵呵,这正是数据仓库的分层架构+维度建模的核心价值所在。让我详细解释这个现象背后的原理。

数据仓库到底有何价值?

我们知道,企业耗费精力搭建数据仓库,目的是为公司的服务或产品做分析数据,最终为公司决策者提供更可靠的数据依据,这就是所谓的商业BI(商业智能)。现在都信息时代了,如果公司老板还在靠拍脑袋做决定,想一想就很不靠谱。

如果公司没有数据仓库,那是不是就不能做分析数据呀?当然不是。

人家有些小微公司,就靠一张 excel 表格就搞定了,照样做数据分析。当然,那是因为小微公司的服务或产品规模小,数据量也就很有限,excel 表格本身就自带很多数据分析功能,足够小公司使用了。

如果觉得 excel 表格分析能力有限,那么就可以使用 python 做数据分析。因为 python 有更强大的数据分析库,比如 numpy、pandas等。不过,这需要你得有一定的 python 编程能力,这对于普通人来说是有门槛的。

那公司大了,数据量也更大,excel 表格就已经容纳不下了,那就要用专门的后台数据库来装,比如 MySQL、Oracle、PostgreSQL。

我们知道,这些都是关系型数据库,并且支持 SQL 语言,而 SQL 语句具有极强的查询能力,我们通过编写 SQL 语句就可以满足各种数据分析要求。

既然如此,那不就没数据仓库啥事了呀?别着急。

这里存在两个问题。

问题一:数据库不保存历史记录

也就是说,数据库里保存的数据永远是当前状态的数据。比如我修改一条数据库记录,那么它就会覆盖以前的记录。如果我想要查询修改前的记录,那肯定是查不到了。

而数据分析不仅要分析当前的数据,也要分析以前的数据。比如分析用户流失数,也就是之前活跃过的用户,最近一段时间未活跃。

问题二:随着数据量增大查询性能变差

一般表记录达到 2000 万行‌,当然,这个数字并非一个硬性规定,而是一个基于经验的性能拐点提示,全表扫描等操作的性能会显著下降。‌

而数据分析的需求中,有很多都需要做统计,需要全表扫描。如果表记录达到上亿,那数据分析的性能就会更差,耗时更久。

这两个问题对于企业来说,哪一个都是无法接受的。

随着大数据技术的兴起,分布式数据存储和并行计算,大大提升了数据存储和计算能力,为数据仓库提供了底层基座。

数据仓库的价值在于解决的数据库存在的两大问题。

OLTP 和 OLAP

难道数据库自身就无法解决这两大问题吗?是的。

因为 MySQL、Oracle、PostgreSQL 等数据库的设计并不是为数据分析而来,它们更在乎事务处理和数据一致性等,也就是所谓的 OLTP(联机事务处理),它更适合用于后台服务器的数据存储,以支撑业务交易。

而数据仓库的设计则是为数据分析而来,它能够存储海量的历史记录,支持复杂的聚合分析,数据分析性能更好,耗时更短,也就是所谓的 OLAP(联机分析处理)。

数据仓库分层架构

说了半天,似乎还是没有解释“后台服务器就十几张表,数仓为什么要建几十张表?” 是的。

我们知道,数据仓库是为数据分析而生,它自然要解决数据库存在的两大问题。

那它是如何解决的呢?或者说,它解决问题的思路如何?

来看第一个问题,数据仓库必须可以保存历史记录。

这个问题比较好办。首先,数据仓库采用分布式存储,比如 HDFS 是分布式文件系统,HBase、MongeDB 等也是分布式数据库,支持横向扩展,只要增加服务器,理论上可以支持无限存储。接着,就可以通过datax、flume、sqoop等采集工具将数据采集到数据仓库中。数据采集分为全量同步和增量同步,全量同步就是把数据库中所有数据都采集,增量同步就只采集有变化的数据,这样数据仓库就可以保存历史记录了。

来看第二问题,数据仓库必须有更好的查询性能。
这个问题,你可能会说也比较好办。因为大数据技术不是有并行计算引擎嘛,比如 Hadoop/MapReduce,Spark 以及Flink 等,数据分析不是分分钟的事情嘛。

呵呵,问题就出现分分钟的事情上。虽然大数据并行计算引擎越来越牛逼,但是人们对查询性能,也就是查询速度,要求也越来越高。数据查询哪怕要等上一分钟,估计很多用户都受不了。我所知道的很多公司要求是 1s 内返回查询结果。

聪明的你,估计会想到,那还不简单嘛,不是可以并行计算,多搞几台服务器,查询性能不就上来了。坊间有句玩笑,即“能用钱解决的问题,千万别花时间”。呵呵,那还不如直接搞一台超级计算器,问题不都解决了嘛。

硬件升级行不通,那么就得另辟蹊径。怎么办呢?

解决办法就数据仓库的数据分层架构。你随便看一本关于数仓的书,都会告诉你,数仓一般分为 ODS、DIM、DWD、DWS、ADS 这几层。但是为什么要分这几层,却少有提及,似乎地球人都知道。

其实呀,数据仓库的分层架构,无论分几层,其目的都是为了解决查询性能问题。它解决查询性能问题的思路其实很简单,就是空间换时间的思想。

以空间换时间,是性能优化最常见的办法,在数仓中如何体现的呢?

比如我们有一张学生信息表,里面包含学生的信息字段(姓名、年龄、性别、身高、体重)等信息。如果要为学生信息表做数据分析,那么就可以针对年龄、性别、身高、体重几个维度做基础统计分析,比如统计学生年龄段分布、统计性别比例、统计身高分布等。

除了基础统计分析,可能我们还想要做更为复杂的统计分析,比如学生健康度评分(综合年龄、性别、体重、身高等数据),那就需要使用到基础统计分析结果。

如果我们直接编写一段 SQL 语句,让它做学生健康度评分(综合年龄、性别、体重、身高等数据)的统计分析,那么它就要先做基础统计分析,然后再做复杂统计分析。

如果我们把基础统计分析结果提前做好,并存储起来。这样,当我们要做学生健康度评分(综合年龄、性别、体重、身高等数据)的统计分析,是不是就可以直接把基础统计分析结果拿来使用,这样速度是不是就快多了。

虽然这个案例非常简单,但是想必你已经明白了数仓分层架构的作用了。

那么,后台服务器就十几张表,数仓为什么要建几十张表?想必答案就再明显不过了,数仓分层架构的必然结果。

以下为数仓分层架构示例图:

后台业务库 (10张表)
    ↓ 数据抽取转换
ODS层 (10张表) - 保持原样
    ↓ 清洗整合  
DWD层 (20张表) - 明细事实表 + 维度表
    ↓ 轻度汇总
DWS层 (30张表) - 主题宽表 + 汇总表  
    ↓ 高度聚合
ADS层 (15张表) - 应用指标表
    ↓ 维度退化
维度层 (15张表) - 独立维度表

其实,打一个不恰当的比方,数据仓库分层架构就好比预制菜,预制菜提前把你想要吃的菜配料都准备好,你只管选你喜欢的预制菜,下锅蒸煮即可,速度自然比你一步步从头自己做快多了。可能自己做菜要花一上午,预制菜只需要几分钟。

所以,数据仓库分层架构通过空间换时间,性能比直接数据查询快了 100 倍不止。

数据仓库维度模型

数据仓库维度模型,常见有星型模型、雪花模型等,这个东西是用于指导数据仓库建表的,其目的是为了方便做数据分析。为何维度模型比关系模型更方便做数据分析,这个你可以自行去研究。

数据仓库的弊端

数据仓库虽然解决了数据分析中数据库存在的两个问题,但是也引发了两个新问题。

问题一:数据仓库表急剧膨胀

为了空间换时间,提高查询性能,搭建数仓就需要创建大量中间层表,比如 DWD、DWS 层,数据表就会成几何倍数膨胀,复杂度也急剧提升。

问题二:数据仓库缺乏灵活性

由于数据仓库的中间层表是提前做好的,那么如果数据库中表的字段有所调整,那么数据仓库各层都要跟着调整,并重新做一遍。显然,数据仓库并不适用于数据表字段频繁变动的情况。就好比预制菜,配料是固定的,不太方便调整。

总之,虽然数据仓库存在弊端,但是遇到适合的场景,比如数据分析指标固定,数据表结构变化较小,数据仓库还是非常有用的。

思考

那是否存在既没有数据仓库的弊端,又具有数据仓库优点的解决办法呢?答案是,有!不过,请记住,凡事有利就有弊。虽然解决了数据仓库的弊端,但是也会存在新的问题。毕竟,天下没有白吃的午餐。

至于是什么,又存在什么新问题,请听下回分解!

posted @ 2025-12-09 18:06  Binge-和时间做朋友  阅读(4)  评论(0)    收藏  举报