为什么要设计数据分层 ——参考《一种通用的数据仓库分层方法》
这是数据仓库同学在设计数据分层时首先要被挑战的问题,类似的问题可能会有很多,比如说“为什么要做数据仓库?”、“为什么要做元数据管理?”、“为什么要做数据质量管理?”。当然,这里我们只聊一下为什么要做设计数据分层。
作为一名数据的规划者,我们肯定希望自己的数据能够有秩序地流转,数据的整个生命周期能够清晰明确被设计者和使用者感知到。直观来讲就是数据层次、依赖关系清晰。
但是,大多数情况下,我们完成的数据体系却是依赖复杂、层级混乱的。在不知不觉的情况下,我们可能会做出一套表依赖结构混乱,甚至出现循环依赖的数据体系。
因此,我们需要一套行之有效的数据组织和管理方法来让我们的数据体系更有序,这就是谈到的数据分层。数据分层并不能解决所有的数据问题,但是,数据分层却可以给我们带来如下的好处:
-
清晰数据结构:每一个数据分层都有它的作用域和职责,在使用表的时候能更方便地定位和理解
-
减少重复开发:规范数据分层,开发一些通用的中间层数据,能够减少极大的重复计算
-
统一数据口径:通过数据分层,提供统一的数据出口,统一对外输出的数据口径
-
复杂问题简单化:将一个复杂的任务分解成多个步骤来完成,每一层解决特定的问题
数仓分层 ——参考数据中台-数据体系建设
贴源数据层ODS、统一数仓层DW(细分为明细数据层DWD和汇总数据层DWS)、标签数据层TDM、应用数据层ADS。
其中,DW层采用维度建模的思想,包含维度表与事实表。涉及到常用的事实表如下:
1)事务事实表-记录业务事务级别数据(增量更新)
2)周期快照事实表-记录时间周期内的聚集事实或状态度量(增量更新)
3)累计快照事实表-覆盖一个事务从开始到结束之间所有关键事件(全量刷新)
事务事实 | 周期快照 | 累计快照 | |
周期 | 离散的事务发生时间点 | 以有规律的间隔产生快照 | 时间跨度不确定的变化的流程节点 |
粒度 | 每个事务或事务线一行 | 每个快照周期加其他维度一行 | 每次管道事件一行(包含事件整个流程) |
日期维度 | 事务日期 | 快照日期 | 管道事件中每个里程碑节点涉及多日期 |
事实 | 事务度量 | 时间间隔内累积度量、状态度量 | 管道事件度量 |
事实表稀疏性 | 与事务活动有关 | 稠密 | 与管道事件有关 |
事实表更新 | 增量更新 | 增量更新 | 全量刷新 |
其他 ——无事实的事实表、聚集事实表、合并事实表
无事实的事实表
只是形容存在某些事件,没有可记录的数字化事实。常用于两个场景:
1)“关注什么未发生”。如处于销售状态但尚未销售的产品(没有发生销售事实)有哪些,需要由促销范围事件表产品(无促销事实)-销售事实表中已卖出产品。
2)“客户/代理分配”。销售经理与客户分配关系表(有一本书专门讲了“关系”),如尚未产生销售事实的代理分配有哪些,需要由分配关系-已发生销售行为的分配关系。
聚集事实表
对多个原子粒度事实表进行事务度量汇总、进行简单的数字化上卷获得。
合并事实表
将来自多过程的事实打横,以相同粒度合并放在一个单一的事实表中。难点在于不同的过程事实的公共维度处理。