一:事实表的特性
粒度:
事实表中一条记录所表达的业务细节程度被称为粒度。通常粒度可以通过两种方式来表述:一种是维度属性组合所表示的细节程度:一种是所表示的具体业务含义。事实:
事实表当中最为重要的特性就是事实了,即在特定环境下的度量值,一般分为这几类:可加性:可加性事实是指可以按照与事实表关联的任意维度进行汇总。半可加性:半可加性事实只能按照特定维度汇总,不能对所有维度汇总,比如库存可以按照地点和商品进行汇总,而按时间维度把一年中每个月的库存累 加起来则毫无意义。不可加:还有 种度量完全不具备可加性,比如比率型事实。对于不可加性事实可分解为可加的组件来实现聚集。分类
1.事务性事实表
2. 周期快照事实表
3.累计快照事实表
二:事实表的设计原则
1.尽可能包含所有与业务过程相关的事实
事实表设计的目的是为了度量业务过程,所以分析哪些事实与业务过程有关是设计中非常重要的关注点。在事实表 中应该尽量包含所有与业务过程相关的事实,即使存在冗余,但是因为事实通常为数字型,带来的存储开销也不会很大。
2.只选择与业务过程相关的事实
在选择事事实,应该注意只选择与业务过程有关的事实。比如在订单的下单这个业务过程的事实表设计中 ,不应该存在支付金额这个表示支付业务过程的事实。
3.分解不可加事实为可加的组件
对于不具备可加性条件的事实,需要分解为可加的组件。比如订单的优惠率,应该分解为订单原价金额与订单优惠金额两个事实存储在事实表中。
4.在选择维度和事实之前必须先生声明粒度
粒度的声明是事实表设计中不可忽视的重要一步,粒度用于确定实表中一行所表示业务的细节层次,决定了维度模型的扩展性,在选择维度和事实之前必须先声明粒度,且每个维度和事实必须与所定义的粒度保持一致。在设计事实表的过程中,粒度定义得越细越好,建议从最低级别的原子粒度开始,因为原子粒度提供了最大限度的灵活性(比如订单粒度无法统计商品粒度的值),可以支持无法预期的各种细节层次的用户需求。在事实表中,通常通过业务描述来表述粒度,但对于聚集性事实表的粒度描述,可采用维度或维度属性组合的方式。
5.在同一个事实表中不能同时存在多种不同粒度的事实
事实表中的所有事实需要与表定义的粒度保持一致,在同个事务表中不能有多种不同粒度的事实。不然对不同粒度的事实进行累加时,其实是会出现很大问题的。
6.事实的单位要保持一致
对于同 个事实表中事实的单位,应该保持一致。比如原订单金额、订单优惠金额、订单运费金额这三个事实,应该采用一致的计量单位,统一为元或分,以方便使用。
7.对事实的null值要处理
对于事实表中事实度量为 null 值的处理,因为在数据库中null对常用数字型字段的 SQL 过滤条件都不生效,比如大于、小于、等于、大于或等于、小于或等于,建议用-9999填充。
8.使用退化维度提高事实表的易用性
在Kimball的维度建模中,通常按照星形模型的方式来设计,对于维度的获取采用的是通过事实表的外键关联专门的维表的方式,谨慎使用退化维度。而在大数据领域的事实表设计中,则大量采用退化维度的 方式,在事实表中存储各种类型的常用维度信息。这样设计的目的主要是为了减少下游用户使用时关联多个表的操作,直接通过退化维度实现 对事实表的过滤查询、控制聚合层次、排序数据以及定义主从关系等。 通过增加冗余存储的方式减少计算开销,提高使用效率。
三:事实表设计方法
1.选择业务过程及确定事实表类型
1.1.选择业务过程:业务过程通常使用行为动词表示业务执行的活动。就拿订单流转的业务过程举例就有四个:创建订单、买家付款、卖家发货、 买家确认收货。在明确了流程所包含的业务过程后,需要根据具体的业 务需求来选择与维度建模有关的业务过程。比如是选择买家付款这个业务过程,还是选择创建订单和买家付款这两个业务过程,具体根据业务情况来确定。
1.2.确定事实表类型:在选择了业务过程以后,相应的事实表类型也随之确定了。比如选择买家付款这个业务过程,那么事实表应为只包含买家付款这一个业务过程的单事务事实表,如果选择的是所有四个业务过程,并且需要分析各个业务过程之间的时间间隔,那么所建立的事实表应为包含了所有四个业务过程的累积快照事实表。
2.声明粒度
粒度的声明是事实表建模非常重要的一步,意味着精确定义事实表 的每一行所表示的业务含义,粒度传递的是与事实表度量有关的细节层 次。明确的粒度能确保对事实表中行的意思的理解不会产生混淆,保证 所有的事实按照同样的细节层次记录。
3.确定维度
完成粒度声明以后,也就意味着确定了主键,对应的维度组合以及相关的维度字段就可以确定了,应该选择能够描述清楚业务过程所处的环境的维度信息。比如在淘宝订单付款事务事实表中,粒度为子订单, 相关的维度有买家、卖家、商品、收货人信息、业务类型、订单时间等维度。
4.确定事实
事实可以通过回答“过程的度量是什么”来确定。应该选择与业务过程有关的所有事实,且事实的粒度要与所声明的事实表的粒度一致。 事实有可加性、半可加性、非可加性三种类型,需要将不可加性事实分解为可加的组件。
5.冗余维度
在传统的维度建模的星形模型中,对维度的处理是需要单独存放在专门的维表中的,通过事实表的外键获取维度。这样做的目的是为了减 少事实表的维度冗余,从而减少存储消耗。而在大数据的事实表模型设 计中,考虑更多的是提高下游用户的使用效率,降低数据获取的复杂性, 减少关联的表数量。所以通常事实表中会冗余方便下游用户使用的常用维度,以实现对事实表的过滤查询、控制聚合层次、排序数据以及定义 主从关系等操作。