一、引言

在数据仓库的架构体系中,事实表是承载业务核心数据、支撑数据分析的关键组件。本文将围绕事实表设计展开,从基础概念、设计原则、设计方法到分类应用,系统掌握事实表设计的核心技术,为构建高效的数据仓库奠定基础。

二、事实表的基础

事实表的定义

事实表是维度建模中的核心数据表,用于存储业务过程中产生的可度量事件或状态数据。它记录了企业运营过程中的关键事实,如销售订单金额、产品生产数量、用户交易次数等。这些事实数据通过与维度表(如时间、产品、客户维度表)关联,为数据分析提供丰富的上下文,实现多维度的业务洞察。

事实表的作用

  1. 记录业务过程:完整记录企业各类业务活动,如订单创建、库存变动、资金流转等,为业务复盘提供原始数据依据。

  1. 支撑分析决策:事实表中的度量数据是数据分析的核心,通过聚合计算,满足企业对业务指标的统计、趋势分析等需求,辅助决策制定。

  1. 维度关联枢纽:作为连接维度表的桥梁,将业务数据与时间、地点、客户、产品等维度信息相结合,使数据分析更具针对性和灵活性。

事实表与维度表的关系

事实表与维度表共同构成维度建模的核心。事实表存储业务过程中的事实或度量数据(如销售金额、数量),维度表则描述业务过程的环境信息(如销售时间、产品类别、客户属性)。二者通过键值关联,维度表的主键作为事实表的外键,实现对事实数据的多维度过滤和分析。例如在销售事实表中,通过时间维度表的日期、产品维度表的产品名称的聚合,可分析不同时间、不同产品的销售情况。

事实(度量)分类

事实表中事实或者度量的分类主要有三种:可加、半可加、不可加。

类别

说明

例子

可加

可以按照任意维度累加

销售额、成本、pv等

半可加

只能在部分维度上累加,其他维度不能累加,否则会产生错误结果

库存:可以按照产品维度汇总,但是不能将1.1号的库存和1.2号的库存相加,没有业务意义。

余额:可以按照客户汇总,但是不能将每天的余额相加,得到的是一个没有意义的数字。

员工数:可以按部门汇总,但是计算3季度的员工数不能直接将3季度每天的员工数求和。

不可加

所有维度都不能累加

单价、比率等

事实表在设计时尽量保留可加事实或者度量,避免直接存储不可加事实,保证数据的灵活性。

三、事实表设计原则

粒度一致性原则

同一事实表中所有事实必须具有相同的粒度。粒度定义了事实表中每行数据的业务细节程度,如订单事实表可选择按订单明细粒度(每个订单中的每个商品项)或订单汇总粒度(每个订单)设计,但不能同时存在两种粒度。保持粒度一致可避免数据分析逻辑混乱,确保结果准确。

维度退化

维度退化到事实表中,可以提升数据查询和分析的效率,并且减少计算开销。可以在事实表中直接使用维度进行过滤和多维分析,退化维度可以大大提升使用体验性。

完整性原则

事实表应涵盖尽量全的与业务过程相关的事实,满足各种业务分析需求。例如在库存业务中,除记录库存数量外,还应包含入库数量、出库数量、库存成本等关键事实,以支持库存动态变化和成本分析。

可加性原则

优先选择可加性事实,这类事实能在不同维度上进行累加,方便汇总分析。如销售数量、订单金额等典型可加性事实,可按时间、地区、产品等维度求和统计。对于不可加性事实(如比率、平均值),可分解为可加组件存储(如存储分子和分母),便于灵活计算。

单位一致性原则

事实表中所有事实字段的单位必须统一,避免因单位不一致导致分析错误。如金额统一用人民币元,数量统一用件、箱等标准单位,确保数据可比性和准确性。

稳定性原则

事实表的结构和口径应具备稳定性,避免频繁变更。因为事实表是数据分析的基础,频繁变更会导致下游报表和分析模型不稳定,增加维护成本。设计初期应充分考虑业务发展变化,预留扩展性。

四、事实表的设计步骤

确定业务过程

明确数据仓库要支持的业务过程,业务过程通常以行为动词表示,如销售、采购、生产、投保、理赔等业务过程。一个业务过程一般对应一张事务型事实表,如销售业务对应销售事实表,采购业务对应采购事实表。复杂业务流程可能需多个事实表协同,如生产业务涉及原材料采购、产品生产、产品销售等多个事实表。

确定粒度

粒度指表中一行数据所代表的细节程度。在设计事实表之前,需要明确事实表的粒度。选择时需综合业务需求和数据量,细粒度提供多维数据分析能力,但增加存储和计算成本;粗粒度便于快速统计,但可能丢失细节。例如电商销售事实表,若需分析每个订单商品明细,可选订单+商品明细粒度;若仅关注每日销售总额,可选日汇总粒度。

选择维度

维度是对业务过程的环境描述,用于过滤和分组统计事实数据。确定业务过程和粒度后,选择与业务相关的维度,如时间(年、季、月、日)、地区(省份、城市、区县)、产品(类别、品牌、型号)、客户(类型、年龄、性别)等。每个维度对应一个维度表,通过外键与事实表关联。以销售事实表为例,可能关联时间、产品、客户等维度表。为提高查询性能,减少表连接操作,可在事实表中冗余常用维度属性。

选择事实

事实是业务过程中产生的数值型数据,选择时遵循可加性和完整性原则,确保满足业务分析需求。比如:“2025 年 8 月 1 日,用户A在上海购买了 2 件商品B,总金额500元”,这个销售事实中包含了2件和500元这两个事实用于量化分析。

五、事实表的分类

事务事实表

  • 定义与特点:存储业务过程,每条记录代表一个事务。如订单事实表,每产生一笔订单则插入一条记录对应一个事务。

  • 分类:单事务事实表和多事务事实表

单事务事实表只保存一个业务过程。多事务事实表保存多个业务过程,多个业务过程的粒度是一致的。

  • 适用场景:适用于多维度分析场景,支持各种细节层次的统计需求,如从商品、客户、店铺等维度分析销售额。

周期快照事实表

  • 定义与特点:以规律性时间间隔记录度量值,粒度较粗。如投保周期快照表,每天统计各省投保金额,包含日期、省份、投保金额、保费等信息。

  • 适用场景:用于分析存存量数据,适合分析指标随时间的变化趋势、历史某个时间点的状态等。

累积快照事实表

  • 定义与特点:整合与业务过程相关的多个关键业务的事实表,包含多个日期字段,多个业务事实或者度量,数据随业务流程推进而更新。如订单处理流程:包含下单日期、支付日期、发货日期、收货日期等字段,以及订单金额、支付金额、运费等事实。

  • 适用场景:主要用于分析完整业务过程,如计算订单从下单到支付的平均时间、产品从生产到交付的周期,帮助企业优化业务流程。

注:多事务事实表和累积快照事实表的主要区别在于:多事务事实表每个业务过程对应一条记录,累积快照事实表则是一条记录包含多个业务过程。

六、案例分析

电商销售事实表

  1. 业务过程:电商平台销售业务,包括订单创建、支付、发货等。

  1. 粒度:订单+商品明细粒度,每条数据代表一个订单中一件商品。

  1. 维度

  • 时间维度:年、季、月、日

  • 客户维度:客户 ID、姓名、性别、年龄、地区

  • 产品维度:产品 ID、名称、类别、品牌

  • 店铺维度:店铺 ID、名称

  • 支付方式维度:支付方式 ID、名称

  1. 事实:销售数量、销售金额、折扣金额、成本金额、运费、利润

  1. 事实表类型:事务事实表(可以选择单事务事实表或者多事务事实表),用于记录每一笔订单交易详细信息,支持订单分析、销售趋势分析、客户购买行为分析等。

银行账户余额周期快照事实表案例

  1. 业务过程:银行账户余额统计

  1. 粒度:每日统计一次账户余额。

  1. 维度

  • 时间维度:日期

  • 账户维度:账户 ID、客户 ID、账户类型

  • 机构维度:分行 ID、支行 ID

  1. 事实:账户余额、可用余额、冻结金额

  1. 事实表类型:周期快照事实表,通过每日记录账户余额状态,方便分析账户资金变化趋势、不同账户类型余额分布等。

七、总结与展望

随着大数据技术发展和业务需求复杂化,事实表设计面临新挑战与机遇。未来,事实表设计将更注重实时性、智能化和自动化,以满足企业实时数据分析和智能决策需求。同时,如何在海量数据环境下优化事实表设计,提升数据处理效率和存储性能,将成为重要研究方向。