我眼中的数据仓库

1,937 阅读8分钟

为了提高业务数据的提取效率以及可维护性,最近在业务中了解和学习构建数据仓库。在此记录下自己对数据仓库的粗浅理解,若有错误欢迎指正。

什么是数据仓库

“数据仓库(Data Warehouse)是一个面向主题的(Subject Oriented)、集成的(Integrated)、相对稳定的(Non-Volatile)、反映历史变化(Time Variant)的数据集合,用于支持管理决策(Decision Making Support)。”——数据仓库之父W.H.Inmon

只看句子主干可知,数据仓库是一个用于支持管理决策的数据集合。中间的修饰词,我们在后面的分析中一起理解。

了解了基本概念,来看下数据仓库的整体模型。

数据仓库结构图.png

它由多个层构成,每一层的数据都有不同的用处。这样看,数据仓库好像很麻烦,我不过是要一个分析数据,还要从头构建一个仓库,再从仓库中获取数据。

问题来了,直接从原始数据得到分析数据不行吗?

为什么要构建数据仓库

举个栗子。 有一个电商系统,它有订单表、商户表等。系统稳定上线后,产品同学开始提出一些数据分析的需求:

  • 大盘周数据表:包括每个商户的订单累计数据、每个商户的订单新增数据、每个用户的订单累计/新增数据、商户名称等。
  • 大盘日数据表:包括每个商户的日新增/累计订单数据、每个用户的日新增/累计订单数据、商户名称等。

没有构建数据仓库时

此时,这些数据都是独立存在的。因此,每一个数据都要从原始流水中计算、清洗得到。

最终,数据关系就变成了下图:

无数据仓库-业务例子.png 这个过程中,我们做了很多重复计算。一些可以复用的数据和计算过程,也没法复用起来。

如果是一个稳定、持续迭代的项目,需要的分析数据只会越来越多,而这样的重复计算任务也会一直增多。当以后我们要修改某项指标,这个指标可能会存在多个表中,此时对于表和数据的维护会越发艰难。

有构建数据仓库时

首先,我们根据产品需求,分析出需要的维度:新增、累计、商户、日、周等。

然后我们构建数据仓库,得到数据关系如下图(其中周数据仅以每个商户的累积订单数据举例,其他周数据类似):

数据仓库-业务图.png 每个数据的来龙去脉都是清晰的,可以复用的数据和过程都被复用。虽然会存在很多中间过程的数据表,构建过程会耗费时间,但是对于稳定、持续迭代的项目,后续的分析数据都可以基于已有的数据得到,开发效率大幅提升,并且数据来源清晰,易于管理。

因此,对于稳定、持续迭代的项目,如果它有持续的数据分析需求,构建数据仓库能让开发效率提升,数据可持续管理。

怎么构建数据仓库

再来回顾下数据仓库的整体模型:

数据仓库结构图.png

将它放置在我们的电商系统数据仓库上:

数据仓库业务应用.png

下面对数据仓库逐层进行说明。

ODS 层

  • 是什么:操作性数据层。
  • 作用:存放原始数据。
  • 来源:业务操作流水、API调用数据、数据库操作日志等。 ODS 层存放的是未经过处理、最原始的数据。在我们的电商系统中,每一张数据库表的插入、更新操作都被转换在一张操作流水表中。

DWD 层

  • 是什么:以主题划分的数据仓库明细层。
  • 作用:放整合的原始流水、以及清洗过后的流水。
  • 怎么来:将 ODS 层的原始操作流水经过去重,保留业务所需字段等操作后得到。

什么是主题?

主题对应一个宏观的分析领域。按照业务需要,可以根据不同角度划分。

在我们的电商系统中,可以分为订单和商户主题。

如果有需要,在DWD 层先保留一个订单的原始流水表。为什么 ODS 层已经有原始流水了,还要在 DWD 层保留一份?

因为 ODS 层的数据不是我们能掌控的。我们自己备份的原始流水,可以整合来自多个上报源的信息,可以选择永久保存,这样能根据我们的需要进行管理和拓展。

我们把原始据经过清洗,例如去除业务无关的数据等,就能得到每日增量明细表。

DWM 层

  • 是什么:以主题划分的数据仓库中间层。
  • 作用:它的作用是根据不同维度对明细进行聚合,得到中间层的表,上层可以通过这些中间层的表获得所需维度聚合的数据。
  • 来源:由 DWD 层的数据计算得到。

DWD 和 DWM 层统一组成 DW 层。为什么要细分 DWD 和 DWM ?它们的区别是什么?

DWD 和 DWM 的区别就在于,有没有根据维度聚合。一个 DWD 层的表可以根据不同维度聚合得到多个 DWM 层的表,这样能达到数据复用的效果。

它的聚合方式也有多种:例如,同时对多个维度聚合,然后再进行退化维度得到多个 DWM 层的表;只对一个维度聚合,每个维度得到一张 DWM 层的表。

什么是维度?什么是退化维度?

维度:可以简单理解为我们分析观察指标的角度,如时间、商户ID 等。

退化维度:假设对订单数据的分析要从商户、产品类别两个维度分析。这时候,我们可以在 DWM 层的一张表中对订单数据做先商户再产品类别的聚合,然后在上一层中退化分析维度为仅商户或者仅产品类别。

在我们的电商系统中,我们可以根据商户 ID 对订单的每日增量明细表进行聚合。如果后续有根据其他维度进行聚合,只要在原来 DWD 层的每日增量明细表再作计算就好。

DIM 层

  • 是什么:数据维表层,一般在 DM、APP 层进行连接。
  • 作用:存放维度信息,例如商户信息维表,里面放商户名称、商户 logo 等。便于维度的管理和维护。
  • 怎么来:根据 DWD 层得到。

在我们的电商系统中,订单记录里面只存储商户 ID ,但最后的报表数据需要商户名称。因此,我们需要一个商户信息维表。从 DWD 层得到的明细表可以计算得到维表。

使用维表的好处是,可以将维度信息统一管理,并提供给多个事实表使用。这样能避免不同的事实表中,维度信息来源不一致。当以后维度信息变化(例如,商户名称改变),只需要修改 DIM 层的表,然后把相关的DM、APP 层表重新计算,不用从底层数据重新开始。

DM 层

  • 是什么:数据集市层。
  • 作用:作用是得到不同主题、同一维度的指标数据。这一层的数据已经可以提供给产品同学作分析使用了。
  • 怎么来:根据 DM 层表计算得到。

DM 层不是必要的,只有当我们有不同主题,同一维度的数据才需要 DM 层。

在我们的电商系统中,由于只有一个主题的数据,所以不需要 DM 层。假设以后新增一个商品主题,产品同学需要同时对商品、订单从商户维度分析,这时候我们就可以把订单和商户数据在 DM 层组合起来。

APP 层

  • 是什么:数据应用层,这层的表就是用来提供给报各种报表的数据来源。
  • 作用:连接不同维度的数据以及维表信息得到,表的数据提供给产品报表用。
  • 怎么来:根据 DWM、DM 层计算得到。维度信息通过连接 DIM 层维表得到。

在我们的电商系统中,将订单的每日新增、累计数据组合在大盘日数据表中,用以作为报表的数据来源。

APP层也不是必要的,只有当不同维度的数据需要放在一起作为提供给报表的数据源,才需要 APP 层。它跟 DM 层的差异就在于,DM 层的表是组合同一维度的数据;APP 层的表是组合不同维度的数据。

总结

现在我们回过头来看数据仓库的定义:“数据仓库(Data Warehouse)是一个面向主题的(Subject Oriented)、集成的(Integrated)、相对稳定的(Non-Volatile)、反映历史变化(Time Variant)的数据集合,用于支持管理决策(Decision Making Support)。”

对于面向主题的、集成的、相对稳定的、反应历史变化的这四个词,希望你的脑海中已有自己的理解。

如果没有,那我们一起看《数据仓库》。