目录
第三章:事实表设计
3.1 事实表设计原则
原则1:尽可能包含所有与业务过程相关的事实
事实表设计的目的是为了度量业务过程,所以应该分析那些事实与业务过程有关。在事实表中应该尽量包含所有与业务过程相关的事实,即使存在冗余。
原则2:只选择与业务过程相关的事实
在选择事实的时候,只选择与业务过程相关的事实。比如在订单的下单这个业务过程的事实表设计中,不应该存在支付金额这个表示支付业务过程的事实。
原则3:分解不可加性事实为可加的组件
对于不具备可加性条件的事实,需要分解为可加的组件。比如订单的优惠率,应该分解为订单的原金额和订单的优惠金额两个事实存储在事实表中。
-
可加事实:对任意维度都可以分组汇总,例如订单量
-
半可加事实:对部分维度可以分组汇总,例如余额
-
不可加事实:对任何维度都不可分组汇总,例如比率,模型中可以保留分子,分母从而转成可加事实。
原则4:在选择维度和事实前必须先声明粒度
粒度用于确定事实表中一行所表示业务的细节层次,决定了维度模型的扩展性,在选择维度和事实前必须先声明粒度,且每个维度和事实必须与所定义的粒度保持一致。在设计事实表的过程中,粒度定义越细越好,建议从最低级别的原子粒度开始,因为原子粒度提供了最大限度的灵活性,可以支持无法预期的各种细节层次的用户需求。
原则5:在同一个事实表中不能有多种不同粒度的事实
事实表中所有事实需要与表定义的粒度保持一致
-
事务型事实表(原子事实表):通常是明细表,拥有最丰富的的维度信息和最细粒度的事实,一般具有退化维度。
-
周期型事实表:通常是汇总表,关注某个固定周期内的聚合事实,一般由原子事实加工产出,维度上可以有所缩减
-
累积型事实表:关注业务的整个过程(物流),单条数据会随着时间的变化而更新,一般需要重跑或者全量处理数据。例如哈罗单车用户骑行过程,会关注几个关键里程,开锁,关锁,支付,评价
原则6:事实的单位要保持一致
对于同一个事实表中事实的单位,应该保持一致。比如原订单金额,订单优惠金额,订单运费金额这三个事实,应该采用一致的计量单位。
原则7:对事实的null值要进行处理
对事实的null值要进行处理,因为在数据库中null值对常用数字型字段的sql过滤条件都不生效,比如大于,小于,等于都建议使用零值进行填充,或者使用-999进行兜底。
原则8:使用退化维度提供事实表的易用性
在大数据领域的事实表设计中,则大量采用退化维度的方式,在事实表中存储各类型的常用维度信息。这样设计的目的是为了减少下游用户使用时关联多个表的操作,直接通过退化维度实现对事实表的过滤查询,控制聚合层次等。通过冗余存储的