漫谈事实表如何设计(三)
一.周期性快照事实表的特性
1.1用快照采样状态
理解状态,状态可以指一段时间内某个事实的汇总,比如说近一个月用户下单汇总金额,这就是一个状态值,当天计算的近一个月的下单汇总金额状态,一旦插入不可改变,也可以指某个事实的最终状态值,这里的最终一般是指当天最晚的时间点,比如日期末库存,就是一个按天为周期,库存值就是当天最后的一个库存量,是一个状态值。
快照事实表以预定的间隔采样状态度量(周期可以是天,周,月,季度,年,自然年等)。这种间隔联合一个或多个维度,将被用来定义快照事实表的粒度,每行都将包含记录所涉及状态的事实(所以说周期性快照事实表是稠密的)。即按照固定的周期,定义的维度,对事实表的事实进行聚集或者状态度量,方便下游分析使用。这些状态度量可以每天通过事务事实表进行聚集,但随着时间跨度变大聚集效率会越来越低,因此需要设计周期快照事实表进行状态度量聚集。如果是单事务事实表,进行聚合的话,还相对简单,如果是多事务事实表进行聚合的话,还需要考虑去重问题,因为多事务实时表,一条记录包含了多个业务过程,其中一个业务过程发生改变都会保留之前的业务过程状态在插入一条新数据。
1.2快照粒度
事务事实表的粒度可以通过业务过程中所涉及的细节程度来描述,但快照事实表的粒度通常总是被多维声明,可以简单地理解为快照需要采样的周期以及什么将被采样。当然,快照周期不一定都按天来进行。
1.3密度与稀疏性
快照事实表和事务事实表的一个关键区别在密度上。事务事实表是稀疏的,只有当天发生的业务过程,事实表才会记录该业务过程的事实, 如下单、支付等;而快照事实表是稠密的,无论当天是否有业务过程发生,都会记录一行,比如针对卖家的历史至今的下单和支付金额,无论当天卖家是否有下单支付事实,都会给该卖家记录一行。稠密性是快照事实表的重要特征,如果在每个快照周期内不记录行,比如和事务事实表一样,那么确定状态将变得非常困难。
1.4半可加性
在快照事实表中收集到的状态度量(如日期末库存)都是半可加的。与事务事实表的可加性事实不同,半可加性事实不能根据时间维度获得有意义的汇总结果。比如对于淘宝交易事务事实表,可以对一个周期内的下单金额或者支付金额进行汇总,得到下单支付总额,但快照事实表在每个采样周期内是不能对状态度量进行汇总的。比如淘宝交易卖家快照事实表,无法对每天的历史至今的下单金额进行汇总,也没有汇总意义。虽然不能汇总,但可以计算一些平均值,比如计算每天一个下单的平均值。
二.单维度快照事实表和多维度快照事实表。
1.1单维度快照事实表
指进行单维度的采样,比如按月周期,计算买家近一个月的下单金额。
1.2多维度快照事实表
混合维度相对于单维度,只是在每天的采样周期上针对多个维度进行采样。比如淘宝买卖家历史至今快照事实表,采样周期依然是每天, 维度是卖家加买家,反映的是不同买家对于不同卖家的下单支付金额。
三.注意事项
1.1事物与快照成对设计
数据仓库维度建模时,对于事务事实表和快照事实表往往都是成对设计的,互相补充,以满足更多的下游统计分析需求,特别是在事务事 实表的基础上可以加工快照事实表,如前面所述的淘宝卖家历史至今快照事实表,就是在事务事实表的基础上加工得到的,既丰富了星形模型, 又降低了下游分析的成本。
1.2附加事实
快照事实表在确定状态度量时,一般都是保存采样周期结束时的状态度量。但是也有分析需求需要关注上一个采样周期结束时的状态度量,而又不愿意多次使用快照事实表,因此一般在设计周期快照事实表时会附加一些上一个采样周期的状态度量。
1.3多种周期快照事实表设计
在实际运用当中,针对同一个类型的状态度量,可能会关注多个周期,比如近一天的用户下单金额,近一个周的用户下单金额等等。