多事务事实表和累积快照事实表的区别。

问题

之前本人一直认为多事务事实表和累积快照事实表差不多,甚至是一样的,最近再次读了<**大数据之路**>这本书,发现是本人肤浅了,是本人以前对事实表的理解不到位。

为什么会觉得多事务事实表和累积快照事实表差不多?

首先问下,觉得这两个表差不多,合理吗?丢人吗?
我的回答是,非常的合理。
因为从一些特征上来说,这两个表非常相似。
多事务事实表和累积快照事实表有以下相同的特点

  • 包含多事务,因此包含了多个业务时间,业务度量
  • 事实表的粒度选择,两者往往相同
  • 事实表的度量选择,累积快照基本会包含多事务事实表。
  • 从表结构上来看,两者甚至可以是一样的。

以书上的例子,最典型的交易,包含下单->支付->确认收货时间这三个节点来说。

多事务事实表和累积快照事实表设计的表结构是一模一样的,如下所示

日期 子订单id 下单时间 支付时间 确认收货时间 相关事实

连表结构都一样了,觉得这两个表没啥区别也就没啥好奇怪的了。

那么,多事务事实表和累积快照事实表的区别到底是什么?

答案揭晓,最核心的一点是
事务事实表记录事务发生时的状态,对于实体的某一实例不再更新
累积事实表则对实体的某一实例定期更新
简单来说,就是多事务事实表只会新增记录,不会修改记录,而累积事实表则是修改记录。

举个例子

还是以上文的交易,包含下单->支付->确认收货时间这三个节点来说。
表结构如下

日期 子订单id 下单时间 支付时间 确认收货时间 相关事实

假设有一笔订单,1号下单,2号支付,3号确认收货。

1号下单

此时,多事务事实表会生成已一条记录,如下所示

日期 子订单id 下单时间 支付时间 确认收货时间 相关事实
2023-01-01 order1 2023-01-01 13:41:41 NULL NULL

累积快照事实表也会生成一条记录,如下所示

日期 子订单id 下单时间 支付时间 确认收货时间 相关事实
2023-01-01 order1 2023-01-01 13:41:41 NULL NULL

似乎没啥区别,不要急,继续往下看

2号支付

此时,多事务事实表会再生成已一条记录,order1总计会变成2条记录,如下所示

日期 子订单id 下单时间 支付时间 确认收货时间 相关事实
2023-01-01 order1 2023-01-01 13:41:41 NULL NULL
2023-01-02 order1 2023-01-01 13:41:41 2023-01-02 09:15:15 NULL

累积快照事实表则不会生成,而是在原先的记录上修改,如下所示

日期 子订单id 下单时间 支付时间 确认收货时间 相关事实
2023-01-02 order1 2023-01-01 13:41:41 2023-01-02 09:15:15 NULL

好像有那么点区别了,再往下看

3号确认收货

此时,多事务事实表会再生成已一条记录,order1总计会变成3条记录,如下所示

日期 子订单id 下单时间 支付时间 确认收货时间 相关事实
2023-01-01 order1 2023-01-01 13:41:41 NULL NULL
2023-01-02 order1 2023-01-01 13:41:41 2023-01-02 09:15:15 NULL
2023-01-03 order1 2023-01-01 13:41:41 2023-01-02 09:15:15 2023-01-03 15:15:15

累积快照事实表则继续在原先的记录上修改,不会生成记录,如下所示

日期 子订单id 下单时间 支付时间 确认收货时间 相关事实
2023-01-03 order1 2023-01-01 13:41:41 2023-01-02 09:15:15 2023-01-03 15:15:15

总结

多事务事实表和累积快照事实表都包含多个业务过程

从产生角度来说
多事务事实表的选择,往往是因为多业务过程之间有高度相似性,同时拥有相同的粒度和维度,从成本和下游使用易用性考虑从而建设,关注的仍然是事务的本身。
而累计快照事实表的选择,往往研究的是事件之间的时间间隔。

从表现特点来说
事务事实表记录事务发生时的状态,对于实体的某一实例不再更新
累积事实表则对实体的某一实例定期更新