事实表的分类:事务事实表,周期快照事实表,累计快照事实表

本文深入探讨了数据仓库中三种核心事实表类型:事务事实表、周期快照事实表及累计快照事实表的特性与应用场景。事务事实表记录最原子的业务事件,周期快照事实表提供定期聚合视图,而累计快照事实表则跟踪业务过程的全生命周期。通过对比三者在粒度、更新方式及数据密度上的差异,帮助读者理解各自的优势与适用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

维度建模数仓领域中的事实表大致分以下三种:事务事实表,周期快照事实表,累计事实表。

事务事实表与周期快照事实表、累积快照事实表虽然使用相同的一致性维度,但是它们在内容构成以及业务描述上还是有很大的区别。

 

1.事务事实表

事务事实表记录的事务层面的事实,保存的是最原子的数据,也称“原子事实表”。事务事实表中的数据在事务事件发生后产生,数据的粒度通常是每个事务记录一条记录。一旦事务被提交,事实表数据被插入,数据就不再进行更改,其更新方式为增量更新。由于事实表具有稀疏性质 ,因此只有当天数据才会进入 当天的事实表中,相当于每个分区里面都是每天的数据,不包含之前的数据。 

事务事实表的日期维度记录的是事务发生的日期,它记录的事实是事务活动的内容。用户可以通过事务事实表对事务行为进行特别详细的分析。

为什么事务事实表具有稀疏性质?

事实表一般围绕着度量来建立,当度量产生的时候,事实记录就生成了。度量可以是销售数量、交易流水值、月末节余等数值。如果同时生成多个度量值的话,我们可以在一个事实表中建立多个事实。当我们的事实表中的事实比较多时,有可能多个事实不同时发生,如果同时生成的几率很小,我们称之为稀疏事实表(Sparse Facts)。

来自http://wenda.tianya.cn/answer/1eb54dc6c0a17b11000481a632d86094

 

2.周期快照事实表

周期快照事实表以具有规律性的、可预见的时间间隔来记录事实,时间间隔如每天、每月、每年等等。典型的例子如销售日快照表、库存日快照表等。它统计的是间隔周期内的度量统计,如历史至今、自然年至今、季度至今等等

周期快照表没有粒度的概念,取而代之的是周期+状态度量的组合,如历史至今的订单总数,其中历史至今是一个周期,订单总数是度量。

周期快照事实表的粒度是每个时间段一条记录,通常比事务事实表的粒度要粗,是在事务事实表之上建立的聚集表,比如说时间周期是1周,那么这个周期快照事实表的一条记录就是这一周的对于某个度量的统计值(我理解的)。

周期快照事实表的维度个数比事务事实表要少,但是记录的事实要比事务事实表多(为什么记录的事会比事务事实表表多呢?)。事务事实表是稀疏表,周期快照表是稠密表。

什么是稀疏表,什么是稠密表?

稀疏表:当天只有发生了操作才会有记录

稠密表:当天没有操作也会有记录,便于下游使用

周期快照事实表的日期维度通常是记录时间段的终止日,记录的事实是这个时间段内一些聚集事实值。事实表的数据一旦插入即不能更改,其更新方式为增量更新。

 

为什么周期快照事实表纪录的纪录会比事务事实表多呢?

根据阿里大数据之路第11章212页所说:

事务事实表是 稀疏的,只有当天发生的业务过程,事实表才会记录该业务过程的事 实, 如下单、支付等;而快照事实表是稠密的,无论当天是否有业务过程发 生,都会记录一行,比如针对卖家的历史至今的下单和支付金额,无论 当天卖家是否有下单支付事实,都会给该卖家记录一行。

假如卖家之前下单6笔,昨天没有下单,但是还是会给他在昨天的分区里面纪录它截止目前为止下单6笔的纪录。

 

3.累计快照事实表

累积快照事实表和周期快照事实表有些相似之处,它们存储的都是事务数据的快照信息。但是它们之间也有着很大的不同,周期快照事实表记录的确定的周期的数据,而累积快照事实表记录的不确定的周期的数据。累积快照事实表代表的是完全覆盖一个事务或产品的生命周期的时间跨度,它通常具有多个日期字段,用来记录整个生命周期中的关键时间点。例如订单累计快照事实表会有付款日期,发货日期,收货日期等时间点。

事务事实表中一条交易记录会每天有一条数据来记录整个交易过程;而累积快照事实表只会有一条记录,数据会一致更新直到过程结束。

累积快照事实表代表的是完全覆盖一个事务或产品的生命周期的时间跨度,它通常具有多个日期字段,用来记录整个生命周期中的关键时间点。另外,它还会有一个用于指示最后更新日期的附加日期字段。由于事实表中许多日期在首次加载时是不知道的,所以必须使用代理关键字来处理未定义的日期,而且这类事实表在数据加载完后,是可以对它进行更新的,来补充随后知道的日期信息。

周期快照事实表记录的是重复的可预测到的时间间隔的事实,例如帐户月结余事实表,用来记录每个月末的帐户结余信息。一般周期快照的数据会按报表需要的周期进行记录,比较适合周期长一些的情况。

而累计快照适用于较短周期,有着明确的开始和结束状态的过程,如一个订单执行的过程,并记录过程中每个步骤的执行时间,使分析人员对执行的过程有整体的把握。周期快照事实表记录上每个步骤的执行时间是逐步建立的,随着执行的过程逐步更新的事实表中。

最后来用表格比较一下三种事实表的区别:

参考文章:

https://www.jianshu.com/p/453afb5382ea

https://www.jianshu.com/p/ff8dcb089d3d

https://www.jianshu.com/p/f55238c6e0b4

https://blog.youkuaiyun.com/maenlai0086/article/details/93998924

 

### 事务事实表的定义与使用 #### 1. 事务事实表的概念 事务事实表数据仓库中的一种核心结构,用于记录特定业务事件的详细信息。它通过存储事实(通常是数值型数据与之关联的维度细节,支持对业务行为进行单独或聚集的研究[^1]。事务事实表的粒度通常是最细的,每个记录对应一个具体的业务事件,例如一次销售交易、一笔银行转账或一个客户订单。 #### 2. 事务事实表的特征 - **粒度**:事务事实表的粒度是最细的,每条记录代表一个独立的业务事件。 - **可加性**:事务事实表中的事实字段通常是可加的,例如金额、数量等数值型数据[^1]。 - **稀疏性**:由于事务事实表记录的是具体事件,可能存在某些维度组合没有对应的记录,导致稀疏性问题。 - **无事实的事实表**:在某些情况下,事务事实表可能不包含任何数值型事实,仅用于记录事件的发生。 #### 3. 数据仓库中的事务事实表数据仓库中,事务事实表是分析的核心。通过将事务事实表与维度表结合,可以生成丰富的分析报告。例如,在零售行业中,ETL管道会从POS系统、电子商务平台等抽取每日销售交易数据,并将其转换后加载到数据仓库中的事务事实表中[^2]。这些数据随后可用于分析销售趋势、库存水平客户行为。 #### 4. ETL过程中的事务事实表 在ETL(Extract, Transform, Load)过程中,事务事实表的加载方式取决于数据实时性需求。当数据量较小时,通常采用全量快照装载;而当数据量较大时,则使用增量装载,以周期性地同步数据仓库源系统[^3]。以下是一个典型的ETL流程: 1. **抽取**:从源系统中提取事务数据。 2. **转换**:清洗转换数据,例如处理退货、折扣、货币转换等[^2]。 3. **加载**:将转换后的数据加载到数据仓库中的事务事实表中。 #### 5. 示例代码 以下是一个简单的Python脚本,展示如何通过ETL流程加载事务事实表: ```python import pandas as pd # 模拟源系统数据 source_data = pd.DataFrame({ 'transaction_id': [1, 2, 3], 'amount': [100, 200, 300], 'currency': ['USD', 'EUR', 'USD'] }) # 转换:货币统一为USD exchange_rates = {'USD': 1, 'EUR': 1.1} source_data['amount_usd'] = source_data.apply( lambda row: row['amount'] * exchange_rates[row['currency']], axis=1 ) # 加载:将数据写入目标表 target_table = source_data[['transaction_id', 'amount_usd']] target_table.to_csv('fact_transaction.csv', index=False) ``` #### 6. 数据错误处理 在ETL过程中,可能会遇到数据错误。为了确保数据质量,可以通过以下方法更正错误: - **消除事实**:删除错误的记录。 - **更新事实**:修改错误的值。 - **删除重新加载事实**:如果错误较为复杂,可以选择删除整个批次的数据并重新加载。 ###
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值