维度建模之事实表

1.事实表概述
    事实表存储了从业务活动或事件提炼出来的性能度量,它主要包含维度表的外键和连续变化的可加性数值、半可加事实和不可加事实。事实表产生于业务过程中而不是业务过程的描述性信息。它一般是行多列少,占了数据仓库的90%的空间。在维度模型中也有表示多对多关系的事实,其他都是维度表。 
 
2.事实表粒度
    事实表的粒度是产生事实行的度量事件的业务定义。粒度确定了事实表的业务主键, 事实表的所有度量值必须具有相同的粒度。 
 
3.事实表设计原则
原则一:尽可能包含所有业务与业务过程相关的事实
        事实表设计的目的是为了度量业务过程,所以分析哪些事实与业务过程有关式设计中非常重要的关注点。
        在事实表中应该尽量包含所有与业务过程相关的事实,即使存在冗余,但是因为事实通常为数字型,带来的存储开销也不会很大。
原则二:只选择与业务过程相关的事实
        在选择事实是,应该注意只选择与业务过程有关的事实。
        比如在订单下单这个业务过程的事实表设计中,不应该存在支付金额这个表示支付业务过程的事实。
原则三:分解不可加性事实为可加的组件
        对于不具备可加性条件的事实,需要分解为可加的组件。
        比如订单的优惠率,应该分级为订单原价金额与订单优惠金额两个事实存储在事实表中。
原则四:在选择维度和事实之前必须声明粒度
        粒度的声明是事实表设计中不可忽视的重要一步,粒度用于确定事实表中一行所表示业务的细节层次,决定了维度模型的扩展性,在选择维度和事实之前必须声明粒度,且每个维度和事实必须与所定义的粒度保持一致。
        在设计事实表的过程中,粒度定义得越细越好,建议从最低级别的原则粒度开始,因为原子粒度提供了最大限度的灵活性,可以支付无法预期的各种细节层析的用户需求。
        在事实表中,通常通过业务描述来表述粒度,但对于聚集性事实表的粒度描述,可以采用维度或维度属性组合的方式。
原则五:在同一个事实表中不能有多种不同粒度的事实
        事实表中的所有事实需要与表定义的粒度保持一致,在同一个事实表中不能有多种不同粒度的事实。
原则六:事实的单位要保持一致
        对于同一个事实表中实施的单位,应该保持一致。
        比如原订单金额、订单优惠金额、订单运费金额这三个事实,应该采用一致的计量单位,统一为元或分,以方便使用。
原则七:对事实的null值要处理
        对于事实表中实施度量null值的处理,因为在数据库中null值对常用数字型字段的SQL过滤条件都不生效,比如大于、小于、等于、大于或等于、小于或等于,建议用0值填充。
原则八:使用退化维度提高事实表的易用性
        在Kimball的维度建模中,通常按照星型模型的方法来设计,对于维度的获取采用的是通过事实表的外键关联专门的维表方式,谨慎使用退化。
        而在大多数领域的事实表设计中,则大量采用退化维度的方式,在事实表中存储各种类型的常用维度信息。这样设计的目的主要是为了减少下游用户使用时关联多个表的操作,直接通过退化维度实现对事实表的过滤查询、控制聚合层次、排序数据以及定义主从关系等。
        通过增加冗余存储的方式减少计算开销,提高使用效率;
 
4.事实表设计方法
    在Kimball所著的《The Data Warehouse Toolkit-The Definitive Guide to Dimensional Modeling》一书中,对于维度模型设计采用四部设计方法:
  • 选择业务过程
  • 声明粒度
  • 确定维度
  • 确定事实
 
5.事实表的分类
  • 维度建模数仓领域中的事实表大致分以下三种:事务事实表,周期快照事实表,累计事实表。
  • 事务事实表与周期快照事实表、累积快照事实表虽然使用相同的一致性维度,但是它们在内容构成以及业务描述上还是有很大的区别。
  • 事务事实表:它是面向事务的,其粒度是每一行对应一个事务,它是最细粒度的事实表。
  • 周期快照事实表:它是按照良好的时间周期间隔(每天,每月)来捕捉业务活动的执行情况,一旦装入事实表就不会再去更新,它是事务事实表的补充,而非替代品。
  • 累积快照事实表:它用于描述业务过程中某个不确定时间跨度里的活动,它随着业务活动的发生会不断的更新。
5.1 事务事实表
    事务事实表记录的事务层面的事实,保存的是最原子的数据,也称“原子事实表”。事务事实表中的数据在事务事件发生后产生,数据的粒度通常是每个事务记录一条记录。一旦事务被提交,事实表数据被插入,数据就不再进行更改,其更新方式为增量更新。由于事实表具有稀疏性质 ,因此只有当天数据才会进入 当天的事实表中,相当于每个分区里面都是每天的数据,不包含之前的数据。 
    事务事实表的日期维度记录的是事务发生的日期,它记录的事实是事务活动的内容。用户可以通过事务事实表对事务行为进行特别详细的分析。
 
说明1:为什么事务事实表具有稀疏性质?
    事实表一般围绕着度量来建立,当度量产生的时候,事实记录就生成了。度量可以是销售数量、交易流水值、月末节余等数值。如果同时生成多个度量值的话,我们可以在一个事实表中建立多个事实。当我们的事实表中的事实比较多时,有可能多个事实不同时发生,如果同时生成的几率很小,我们称之为稀疏事实表(Sparse Facts)。
 
5.2 周期快照事实表
    周期快照事实表以具有规律性的、可预见的时间间隔来记录事实,时间间隔如每天、每月、每年等等。典型的例子如销售日快照表、库存日快照表等。它统计的是间隔周期内的度量统计,如历史至今、自然年至今、季度至今等等。
    周期快照表没有粒度的概念,取而代之的是周期+状态度量的组合,如历史至今的订单总数,其中历史至今是一个周期,订单总数是度量。
    周期快照事实表的粒度是每个时间段一条记录,通常比事务事实表的粒度要粗,是在事务事实表之上建立的聚集表,比如说时间周期是1周,那么这个周期快照事实表的一条记录就是这一周的对于某个度量的统计值(我理解的)。
    周期快照事实表的维度个数比事务事实表要少,但是记录的事实要比事务事实表多(为什么记录的事会比事务事实表表多呢?)。事务事实表是稀疏表,周期快照表是稠密表。
 
说明1:什么是稀疏表,什么是稠密表?
    稀疏表:当天只有发生了操作才会有记录
    稠密表:当天没有操作也会有记录,便于下游使用
    周期快照事实表的日期维度通常是记录时间段的终止日,记录的事实是这个时间段内一些聚集事实值。事实表的数据一旦插入即不能更改,其更新方式为增量更新。
 
说明2:为什么周期快照事实表纪录的纪录会比事务事实表多呢?
    事务事实表是稀疏的,只有当天发生的业务过程,事实表才会记录该业务过程的事 实, 如下单、支付等;而快照事实表是稠密的,无论当天是否有业务过程发 生,都会记录一行,比如针对卖家的历史至今的下单和支付金额,无论 当天卖家是否有下单支付事实,都会给该卖家记录一行。
    假如卖家之前下单6笔,昨天没有下单,但是还是会给他在昨天的分区里面纪录它截止目前为止下单6笔的纪录。
 
5.3 累计快照事实表
    累积快照事实表和周期快照事实表有些相似之处,它们存储的都是事务数据的快照信息。但是它们之间也有着很大的不同,周期快照事实表记录的确定的周期的数据,而累积快照事实表记录的不确定的周期的数据。累积快照事实表代表的是完全覆盖一个事务或产品的生命周期的时间跨度,它通常具有多个日期字段,用来记录整个生命周期中的关键时间点。例如订单累计快照事实表会有付款日期,发货日期,收货日期等时间点。
    事务事实表中一条交易记录会每天有一条数据来记录整个交易过程;而累积快照事实表只会有一条记录,数据会一致更新直到过程结束。
    累积快照事实表代表的是完全覆盖一个事务或产品的生命周期的时间跨度,它通常具有多个日期字段,用来记录整个生命周期中的关键时间点。另外,它还会有一个用于指示最后更新日期的附加日期字段。由于事实表中许多日期在首次加载时是不知道的,所以必须使用代理关键字来处理未定义的日期,而且这类事实表在数据加载完后,是可以对它进行更新的,来补充随后知道的日期信息。
    周期快照事实表记录的是重复的可预测到的时间间隔的事实,例如帐户月结余事实表,用来记录每个月末的帐户结余信息。一般周期快照的数据会按报表需要的周期进行记录,比较适合周期长一些的情况。
    而累计快照适用于较短周期,有着明确的开始和结束状态的过程,如一个订单执行的过程,并记录过程中每个步骤的执行时间,使分析人员对执行的过程有整体的把握。周期快照事实表记录上每个步骤的执行时间是逐步建立的,随着执行的过程逐步更新的事实表中。
 
6.三种事实表的区别
 
 
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员学习圈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值