基于阿里巴巴OneData方法论最佳实践,事实表(事实模型,又称事实逻辑表)作为数据仓库维度建模的核心,紧紧围绕着业务过程进行设计。业务过程是通过事实表的度量、引用的维度与业务过程有关属性的方式获取。

Dataphin支持两种类型的事实表:
  • 事务型事实表:用于描述业务过程,跟踪空间或时间上某点的度量事件,保存的是最原子的数据,也称为原子事实表,表名后缀一般为di。
  • 周期快照型事实表:以具有规律性的、可预见的时间间隔(例如每天、每月、每年等)记录事实,一般表名后缀为df。

事实表设计原则

  • 尽可能包含所有与业务过程相关的事实。

    设计事实表的目的是度量业务过程,所以分析哪些事实与业务过程有关,是事实表设计中至关重要的。在事实表中应该尽量包含所有与业务过程相关的事实,即使存在冗余,但是因为事实通常为数字型,带来的存储开销不会很大。

  • 只选择与业务过程相关的事实。

    在选择事实时应该注意,只选择与业务过程有关的事实。例如,A公司的订单交易业务流程中,在设计下单这个业务过程的事实表时,不能包含支付金额这个表示支付业务过程的事实。

  • 在选择维度和事实之前,必须先声明粒度。

    粒度(数据行数的最小单位,非统计粒度)的声明是事实表设计中不可忽视的重要一步。粒度用于确定事实表中一行所表示业务的细节层次,决定了维度模型的扩展性。在选择维度和事实之前,必须先声明粒度,且每个维度和事实必须与所定义的粒度保持一致。在事实表中,通常通过业务描述来表述粒度并定义事实表主键,但对于聚集性事实表的粒度描述(例如存在下单、支付等多个事务),可以基于多个字段拼接,形成新的字段作为事实表主键,也可以不定义主键,这样一行记录即最小粒度。

  • 在同一个事实表中,不能包含多种不同粒度的事实。

    事实表中所有事实的粒度需要与表声明的粒度保持一致,在同一个事实表中不能有多种不同粒度的事实。

  • 事实的单位要保持一致。

    在同一个事实表中,事实的单位应该保持一致。例如,原订单金额、 订单优惠金额、订单运费金额这三个事实,应该采用一致的计量单位,统一为元或分,以方便使用。

事实表设计方法

任何类型的事件都可以被理解为一种事务。例如,交易过程中的创建订单、买家付款,物流过程中的揽货、发货、签收,退款过程中的申请退款、申请客服介入等,都可以被理解为一种事务。事务型事实表,即针对这些过程构建的一类事实表,用以跟踪定义业务过程的个体行为,提供丰富的分析能力,作为数据仓库CDM层的明细数据。

下面以A公司的订单交易事务型事实表为例,阐述事务型事实表的一般设计过程。
  1. 选择业务过程。

    按照之前的业务流程分析,A公司的交易订单流程包含四个重要过程:创建订单、买家付款、卖家发货、确认收货,即下单、支付、发货和收货四个业务过程。这四个业务过程不仅是交易过程中的重要时间节点,而且也是下游统计分析的重点,因此A公司的交易事务事实表设计着重从这四个业务过程进行展开。

    为了便于进行独立的分析研究,我们应该为每个业务过程建立一个事实表。本教程中,我们选择交易成功这个业务过程,建立事务型事实表。

  2. 确定粒度。

    事实表中一条记录所表达的业务细节程度被称为粒度。通常粒度可以通过两种方式来表述:一种是维度属性组合所表示的细节程度;一种是所表示的具体业务含义。

    业务过程选定之后,就要针对业务过程确定一个粒度,即确定事务型事实表每一行所表达的细节层次。明确的粒度能确保对事实表中行的意思的理解不会产生混淆,保证所有的事实按照同样的细节层次记录。如果有字段可以表达这个粒度,可以定义为事实表的主键。

    应该尽量选择最细级别的粒度,以确保事实表的应用具有最大的灵活性。对于订单过程而言,每一种商品结算后都会产生一个订单,交易成功这个业务过程的粒度可以选择为订单。订单id如果唯一,可以作为事实表主键以描述粒度。

  3. 确定维度。

    选定好业务过程并且确定粒度之后,就可以确定维度信息了,应该选择能够描述清楚业务过程所处的环境的维度信息。例如,在A公司的交易订单事务事实表设计过程中,粒度为订单,确定的维度包含:买家、卖家、商品名称、商品类目、发货地区、收货地区、订单时间等维度。

  4. 确定事实。

    作为度量业务过程的核心,事实通常为整型或浮点型的十进制数值。事实表应该包含与业务过程描述有关的所有事实,且事实的粒度要与所确定的事实表的粒度一致。例如,在下单业务过程中,需要包含商品ID、商品价格、购买数量。在支付业务过程中,需要包含支付金额、红包金额、积分金额。在收货业务过程中,需要包含确认收货金额等。

  5. 关联维度。

    在确定维度时,包含了买卖家维度、商品维度、类目维度、收发货维度等。维度建模理论建议在事实表中只保存这些维表的外键, 而A公司电商交易事务事实表在维度建模基础之上做了进一步的优化,将买卖家星级、标签、店铺名称、商品类型、商品特征、商品属性、 类目层级等维度都关联到事实表中,提高对事实表进行过滤查询、统计聚合的效率。

明细数据层(DWD)规范

Dataphin中默认的事实表命名规范为:fct_{业务过程缩写}[_{自定义表命名标签缩写}] _{di/df,单分区增量/全量标识}。单分区增量全量标识通常为:i表示增量,f表示全量。例如, fct_ordcrt_trip_di(A电商公司航旅机票订单下单事实表,日刷新增量)及fct_asale_itm_df(A电商商品快照事实表,日刷新全量)。

本教程中,DWD层主要由三个表构成:
  • 交易商品信息事实表:fct_trade_success_itm_di。
  • 交易会员信息事实表:fct_trade_success_mbr_di。
  • 交易订单信息事实表:fct_trade_success_ord_di。

创建事实表

本节以交易商品信息事实表(fct_trade_success_itm_di)为例,为您介绍如何基于Dataphin创建事实表。

  1. 在Dataphin首页,单击顶部菜单栏的研发
  2. 选择开发 > 规范建模 > 事实逻辑表
    事实表页面
  3. 单击左侧功能区右上方的新建文件按钮。
    创建事实表
  4. 在弹出的新建事实逻辑表对话框中,选择数据域业务过程明细类型来源主表,填写英文名名称描述等,单击下一步
    填写基本信息
  5. 定义主键。信息填写完成后,单击提交
    定义主键
  6. 提交成功后,即进入事实表初始状态。然后,您可以继续对事实表进行添加关联维度、添加度量、添加事实属性、主表编辑、物理化配置、调度配置等操作。待事实模型设计完成后,单击页面右上方的保存提交即可。
    提交事实表
    说明 创建事实表的详情请参见新建与修改事实逻辑表

查询事实表

逻辑表运维包含两个模块,一个是逻辑表任务,用来从逻辑表视角切入,为用户展现逻辑表内部任务关系。另一个是逻辑表实例,用于查看已运行的逻辑表任务包含的节点实例及其状态。

  1. 在Dataphin首页,单击顶部菜单栏的研发 > 运维
  2. 单击左侧菜单栏中的逻辑表任务,进入逻辑表任务页面,如下图所示。
    事实表-运维-1
  3. 在逻辑表任务页面:左侧功能区主要用于搜索和展示逻辑表及其内部物理节点,右侧DAG图展示区,默认展示当前逻辑表内包含的所有节点和内部节点间的依赖关系,并在左下角动态展示缩略图。
    说明 详细内容请参见逻辑表任务
  4. 单击左侧菜单栏中的逻辑表实例,进入逻辑表任务页面,如下图所示。
    事实表-运维2
  5. 在在逻辑表实例页面:左侧功能区主要用于搜索和展示逻辑表及其内部物理节点实例。右侧DAG图展示区,默认展示当前逻辑表包含的所有节点实例及其状态(如运行中、运行成功、运行失败),并在左下角动态展示缩略图。
    说明 详细内容请参见逻辑表实例