以下笔记来自 <阿里巴巴大数据实践>.
设计原则
1, 尽可能包含所有与业务过程相关的事实
事实表设计的目的是为了度量业务过程, 所以重点在于分析哪些事实与业务过程相关,
尽量将其包含进事实表中, 可以冗余存储.
2, 只选择与业务过程相关的事实
原则1是针对与业务过程相关的事实, 而不相关的, 不应该放进事实表中.
3, 分解不可加性事实为可加的组件
例如,优惠率
这个数值, 是不可加的, 而在事实表中拆为原价金额
和优惠金额
之后,
通过这两个数值的计算可以得到优惠率, 而且在进行聚合分析时, 分解后的数值是可加的.
4, 在选择维度和事实之前必须先声明粒度
粒度是维度属性组合所表示的细节程度, 或者所表示的具体业务的细节程度.
在选择维度和事实之前, 必须先确定粒度, 维度和事实与定义的粒度保持一致.
例如, 机票支付成功事务
事实表, 粒度为机票这一级别,
而一个订单中可以有多张机票, 因此订单支付事实表
的粒度更高一些, 粒度为订单这一级别.
事实表的设计一般从最低级别的原子粒度开始, 因为基于此, 可以拓展实现各个层次的需求.
5, 同一个事实表里不能有多种不同粒度的事实
一个事实表中的事实需要和表定义的粒度保持一致, 不能有多种不同粒度的事实.
继续前面的例子, 机票支付成功事务
事实表, 这个表是不应该加入 订单支付金额
和订单支付票数
这两个度量的,
因为它们是不同粒度的事实, 聚合汇总时的值也是无意义的.
6, 同一事实表中 事实的单位要保持一致
例如, 订单支付金额和订单运费金额需要用一致的计量单位, 比如元或分.
7, 对事实的 null 值要进行处理
8, 使用退化维度提高事实表的易用性
适度的维度退化, 在事实表中直接存储各种类型的常用维度信息,
可以减少下游用户使用时关联多个表的操作,
直接通过退化维度可以方便的进行过滤、聚合、排序等等操作,
而且可以用冗余存储减少计算开销, 用空间换时间, 在易用和计算上提高了效率.