数仓建模之事务事实表设计案例

事务事实表概念

事务事实表用来描述业务过程,跟踪空间或时间上某点的度量事件,保存的是最原子的数据,也称为“原子事实表“

设计过程

任何类型的事件都可以被理解为一种事务。比如交易过程中的创建订单、买家付款,物流过程中的揽货、发货、签收,退款中的申请退款、申请小二介入等,都可以被理解为一种事务。

事务事实表, 即针对这些过程构建的一类事实表,用以跟踪定义业务过程的个体行为,提供丰富的分析能力,作为数据仓库原子的明细数据。

下面以淘宝交易事务事实表为例,阐述事务事实表的一般设计过程。

选择业务过程

image-20210611153023303

上图给出了淘宝交易订单的流转过程,其中介绍了四个重要过程:创建订单、买家付款、卖家发货、买家确认收货,即下单、支付、发货和成功完结四个业务过程。

这四个业务过程不仅是交易过程中的重要时间节点,而且也是下游统计分析的重点,因此淘宝交易事务事实表设计着重从这四个业务过程进行展开。

Kimball 维度建模理论认为,为了便于进行独立的分析研究,应该为每个业务过程建立一个事实表。

确定粒度

业务过程选定以后,就要针对每个业务过程确定一个粒度,即确定事务事实表每一行所表达的细节层次。

下面先介绍淘宝订单的产生过程。

淘宝出售商品主要分两类卖家: 一类是个人性质的闲置卖家,主要出售闲置的或者二手商品: 一类是拥有店铺的卖家,以出售新商品为主。接下来主要以店铺类交易订单为例进行介绍。

在淘宝下单交易时,有两种方式:

  • 选定商品后直接购买,这样会产生一个交易订单
  • 将多种商品加入到购物车中,然后一起结算

此时对于每一种商品都会产生一个订单,同时对于同一个店铺会额外产生一个订单,即父订单;由于是在同一个店铺购买的,所以父订单会承载订单物流、店铺优惠等信息。而对于每一种商品产生的订单就称为子订单,子订单记录了父订单的订单号,并且有子订单标志。如果在同一个店铺只购买了-种商品,则会将父子订单进行合并,只保留一条订单记录。

image-20210611170233606

image-20210611170247822

了解了淘宝交易订单的产生过程后,现在为淘宝交易事务事实表确定粒度。如第 l 步所述,在淘宝交易过程中有四个重要业务过程,需要
为每个业务过程确定一个粒度。

其中下单、支付和成功完结三个业务过程选择交易子订单粒度,即每个子订单为事务事实表的一行,每个子订单所表达的细节信息为: 交易时间、卖家、买家、商品,即选择图l 1. 2和图11.3 中订单ID 为1 、4 、5、6 、7 、8,、9 的子订单作为事务事实表的每一行。卖家发货这个业务过程可以选择子订单粒度,即将每个子订单作为卖家发货事实表的一个细节。

然而,在实际操作中发现,卖家发货更多的是物流单粒度而非子订单粒度,同一个子订单可以拆开成多个物流单进行发货。在事务事实表设计过程中,秉承确定为最细粒度的原则,因此对于卖家发货确定为物流单粒度,和其他三个业务过程不同,这样可以更好地给下游统计分析带来灵活性。

确定维度

选定好业务过程并且确定粒度后,就可以确定维度信息了。在淘宝交易事务事实表设计过程中,按照经常用于统计分析的场景,确定维度包含:买家、卖家、商品、商品类目、发货地区、收货地区、父订单维度以及杂项维度。

由于订单的属性较多,比如订单的业务类型、是否无线交易、订单的 attributes 属性等,对于这些使用较多却又无法归属到上述买卖家或商品维度中的属性,则新建一个杂项维度进行存放

image-20210611170753120

确认事实表

作为过程度量的核心,事实表应该包含与其描述过程有关的所有事实。

以淘宝交易事务事实表为例,选定三个业务过程一一下单、支付和成功完结,不同的业务过程拥有不同的事实。比如在下单业务过程中,
需要包含下单金额、下单数量、下单分摊金额;在支付业务过程中,包含支付金额、分摊邮费、折扣金额、红包金额、积分金额;在完结业务过程中包含确认收货金额等。

由于粒度是子订单,所以对于一些父订单上的金额需要分摊到子订单上,比如父订单邮费、父订单折扣等。

根据 Kimball 维度建模理论,经过以上四步,淘宝交易事务事实表已成型,可以满足下游分析统计的需要。然而,淘宝数据仓库在建
模时,基于以上四步增加了一步一一退化维度,这个过程在 Kimball 维度建模中也有所提及;但淘宝数据仓库出于效率和资源的考虑,将常用维度全部退化到事实表中,使下游分析使用模型更加方便。

冗余维度

在确定维度时,包含了买卖家维度、商品维度、类目维度、收发货维度等, Kimball 维度建模理论建议在事实表中只保存这些维表的外键,而淘宝交易事务事实表在 Kimball 维度建模基础之上做了进一步的优化,将买卖家星级、标签、店铺名称、商品类型、商品特征、商品属性、类目层级等维度属性都冗余到事实表中,提高对事实表进行过滤查询、统计聚合的效率

image-20210611171400473

经过以上五个步骤,完成了淘宝交易事务事实表的设计。

事实的设计准则

事实完整性

事实表包含与其描述的过程有关的所有事实,即尽可能多地获取所有的度量。在淘宝交易事务事实表中,比如支付业务过程,在子订单粒
度上的支付金额、支付邮费、支付红包、支付积分、支付折扣都有所包含,覆盖全面。

事实一致性

在确定事务事实表的事实时,明确存储每一个事实以确保度量的一致性。以淘宝交易事务事实表为例,在下单业务过程中,有下单商品数
量和商品价格两个事实,但在事实表中计算了下单金额和下单有效金额,它们可以通过商品数量乘以商品价格进行计算。虽然下游在取数时也可以通过这种方式完成计算,但是在事实表中统一计算可以保证度的一致性,其他如支付过程中的分摊金额等也是类似的。

事实可加性

事实表确定事实时,往往会遇到非可加性度量,比如分摊比例、利润率等,虽然它们也是下游分析的关键点,但往往在事务事实表中关注
更多的是可加性事实,下游用户在聚合统计时更加方便。在淘宝交易事务事实表中,存储了分摊比例这样的度量,但更多的是存储各类金额的度量。

作者:Binge
本文版权归作者和博客园共有,转载必须给出原文链接,并保留此段声明,否则保留追究法律责任的权利。
原文地址:https://www.cnblogs.com/binbingg/p/14884396.html