所谓的事实表和维度表技术,指的就是如何和构造一张事实表和维度表,是的事实表和维度表,可以涵盖现在目前的需要和方便后续下游数据应用的开发。
事实表,就是一个事实的集合。事实来自业务过程的度量,基本上以数量值表示。事实表行对应一个事实,一个事实对应一个物理可以观察的事件,例如,再零售事件中,销售数量与总额是数据事实,与销售事件不相关的度量不可以放在同一个事实表里面,如员工的工资。
事实表是实际发生的度量,对应的,这些度量我们可以分为三中类型:可加、半可加、不可加。可加性度量可以按照与事实表关联的任意维度汇总。半可加度量可以对某些维度汇总,但不能对所有维度汇总。差额是常见的半可加事实,除了时间维度之外,它们可以跨越所有维度进行加法操作。不可加度量,比如比率,任何维度都不能直接相加。因此对于不可加度量,我们要尽可能的把不可加度量拆分为可加度量,例如比率,我们可以分别存储他们的分子和分母,使其转为可加度量。
对于事实表,还有一类值NULL,需要我们去校验和保证,对于事实表的度量,我们可以允许存在NULL,不过对于一些外键,则不能存在空值,否在会导致违反参照完整性的情况发生,我们可以赋予默认的代理键来表示未知或者NULL的情况。
参照的完整性要求关系中不允许引用不存在的实体。与实体完整性是关系模型必须满足的完整性约束条件,目的是保证数据的一致性。参照完整性又称引用完整性。
如果一个度量出现在多个事实表里面,我们还需要保证,多个事实表汇总到同一个维度的时候,度量的值相等,并且命名尽量相同,这就是一致性事实。一致性事实可以保证数据口径的一致和取数方便。如何保证数据事实的一致性呢?如何保证多张事实表相同字段相同?这里建议有两个,一是字段名称相同,二是开发完成的时候,可以对表数据的值比对,并且可以起一个数据校验的任务,定时校验比对,如果有问题就告警。
简单的,我们可以大概分为事务事实表,周期快照事实表,累计快照事实表,无事实的事实表。
- 事务事实表:事务事实表的一行对应空间或者时间上某点的度量事件。即流水行数据。
- 周期快照事实表:周期快照事实表中的每一行汇总了发生在某一标准周期,例如某一天的多个事实。即按某个维度轻度汇总的数据。
- 累计快照事实表:累积快照事实表的行汇总了发生在过程开始和结束之间可预测步骤内的度量事件。也就是记录整一个业务过程,如下单,包含下单时间,支付时间,赔付时间等。
- 无事实的事实表:有一些事件是没有事实的,事实包含多个度量,也就是部分事件没有度量,只有维度,例如某天学生参加的课程。
接下来说说维度表的一些要点,维度表包含单一的主键列。维度表的主键可以作为与之关联的任何事实表的外键,当然,维度表行的描述环境与事实表行完全对应。
维度表开发过程中有下面几个点。
- 维度代理键,维度表中会包含一个列,表示唯一主键,该主键不是操作型系统的自然键,如果采用自然键,需要多个维度行表示,另外,维度的自然键可能由多个源系统建立,这些自然键可能会出现兼容性问题。所以这里可以对代理键做一些处理,具体可以看业务形态,如果源系统已经保证了唯一,直接应用也是没有问题的。
- 退化维度,有时,维度除了主键外没有其他内容,例如订单表里面的发票维度只有发票号,没有其他的信息,那么我们可以将这个维度放入事实表里面,这个就是退化维度。
- 一致性维度,当不同的维度表的属性具有相同列名和领域内容时,称维度具有一致性。利用一致性维度属性与每一个事实表关联,可将来自不同事实表的信息合并到同一个报表里面。
我们整理了维度表和事实表之后,我们需要形成一个总线矩阵。总线矩阵用于设计数据仓库架构的基本工具,矩阵的行表示业务过程,列代表维度。矩阵中的点表示维度与给定的业务过程是否存在关系,如下图。
形成这样的一个架构之后,我们的数据仓库的结构分层,和里面的数据表设计完成了,就可以进行同步和开发了。
参考资料:数据仓库(8)数仓事实表和维度表技术