事实表基础
事实表的本质与目标
本质:记录业务过程可度量的事件,如交易支付、用户点击。
设计目标
| 目标 | 实现手段 | 业务场景 |
|---|---|---|
| 高性能查询 | 预聚合 + 分区剪枝 | 双11实时大屏响应<1秒 |
| 低成本存储 | 列式压缩 + 生命周期管理 | 历史数据OSS归档降本90% |
| 数据一致性 | 统一原子指标定义 | 集团GMV口径100%统一 |
| 业务可扩展 | 动态添加度量字段 | 新增“碳中和指标”零改造 |
事实表设计原则
- 原则1:尽可能包含所有与业务过程相关的事实。
- 原则2:只选择与业务过程相关的事实。
- 原则3:分解不可加性事实为可加的组件。
- 原则4:在选择维度和事实之前必须先声明粒度。
- 原则5:在同一个事实表中不能有多种不同粒度的事实。
- 原则6:事实的单位要保持一致。
- 原则7:对事实的 null 值要处理。
- 原则8:使用退化维度提高事实表的易用性。
事实表设计四要素
- 事实类型与可加性
| 类型 | 可加性 | 案例 | 聚合规则 |
|---|---|---|---|
| 可加事实 | 完全可加 | 交易金额、商品数量 | SUM()有效 |
| 半可加事实 | 部分可加 | 账户余额、库存量 | AVG()有效,SUM()失真 |
| 不可加事实 | 不可加 | 比率(如毛利率) | 需先分子分母分别聚合 |
- 粒度(Granularity)设计
| 业务过程 | 推荐粒度 | 优势 |
|---|---|---|
| 交易支付 | 单笔订单级别 | 支持最细粒度分析 |
| 用户行为 | 单次事件级别 | 可回溯原始行为 |
| 财务报表 | 每日账户快照 | 平衡明细与存储成本 |
- 一致性事实:通过OneData原子指标统一定义,字段级血缘追踪,DataWorks自动校验下游一致性。
事务事实表
记录对象:业务过程的最小事件单元,如一笔支付、一次点击。
时效性要求:强实时(秒级延迟)。
数据特征:事件一旦发生不再变更(仅追加),与时间强相关(依赖事件时间戳)。
设计关键决策点
| 要素 | 阿里规范 | 反例后果 |
|---|---|---|
| 粒度 | 必须为最小事件单元(如单次点击) | 合并单日行为 → 路径分析失效 |
| 事实类型 | 仅允许完全可加事实(金额、数量) | 包含比率字段 → 聚合失真 |
| 时间精度 | 毫秒级时间戳(支持事件序列排序) | 秒级精度 → 乱序事件关联错误 |
| 分区键 | 按事件日期分区(dt=yyyyMMdd) |
未分区 → 全表扫描PB级数据 |
- 小文件治理方案
| 问题 | 传统方案 | 阿里自研方案 | 收益 |
|---|---|---|---|
| 实时写入小文件多 | 定时Compaction | 流式小文件合并(SLS) | 文件数减少90% |
| 分区热点 | 手动重分布 | 自动分桶均衡(AutoBucket) | 写入延迟降低60% |
周期快照事实表
记录对象:业务实体在固定时间点的全量状态(如每日账户余额、月末库存量)。
业务价值
| 业务场景 | 问题 | 阿里解决方案 | 收益 |
|---|---|---|---|
| 财务对账 | 无法获取历史每日账户余额 | 每日账户快照表 | 对账效率提升90% |
| 库存周转分析 | 仅知出入库事件,不知中间状态 | 商品每日库存快照 | 周转计算精度100% |
| 用户资产分析 | 实时计算用户总资产代价高 | T+1用户资产快照(含余额/理财/积分) | 查询耗时<1秒 |
- 设计关键决策
| 要素 | 阿里规范 | 违反后果 |
|---|---|---|
| 快照周期 | 按业务需求定制(日/周/月) | 日快照用于金融,月快照用于HR |
| 状态事实 | 仅包含半可加事实(余额/库存) | 错误包含交易金额 → 聚合失真 |
| 分区策略 | 按快照日期分区 | 未分区 → 全表扫描效率低下 |
| 存储格式 | ORC列存 + ZSTD压缩(LEVEL 15) | 文本存储 → 空间膨胀5倍 |
累积快照事实表
记录对象:单笔业务的生命周期关键里程碑,如订单从创建→支付→发货→签收。
业务价值
| 业务场景 | 传统方案痛点 | 阿里累积快照方案 | 收益 |
|---|---|---|---|
| 订单履约时效分析 | 需关联多表计算节点间隔 | 单表记录全链路时间戳 | 分析效率提升10倍 |
| 保险理赔进度监控 | 无法实时获取当前所处阶段 | 更新当前状态字段 + 时间节点 | 处理超时率下降40% |
| 物流全链路追踪 | 分散在运单/仓储/配送表 | 整合全环节状态到单表 | 查询延迟<500ms |
- 设计关键决策
| 要素 | 阿里规范 | 违反后果 |
|---|---|---|
| 节点选择 | 关键里程碑≤7个(避免宽表失控) | 包含20个节点 → 维护灾难 |
| 时间精度 | 统一UTC时间戳(支持跨时区分析) | 本地时间 → 流程计算错误 |
| 状态更新 | 仅更新当前节点及后续字段 | 修改历史节点 → 数据失真 |
| 分区策略 | 按流程开始日期分区(如订单创建日) | 按结束日期分区 → 热点问题 |
三种事实表的比较
| 维度 | 事务事实表 | 周期快照事实表 | 累积快照事实表 |
|---|---|---|---|
| 本质 | 记录原子业务事件 | 捕获实体周期性状态 | 追踪业务流程里程碑 |
| 数据时效 | 秒级实时(流式写入) | T+1批量生成 | 近实时更新(流程推进时更新) |
| 事实类型 | 可加事实(金额/数量) | 半可加事实(余额/库存) | 混合事实(时长/状态) |
| 时间字段 | 单一事件时间戳 | 单个快照日期 | 多个时间节点(5-10个) |
| 存储开销 | 低(仅追加,不更新) | 中(增量合并) | 高(需更新历史行) |
| 查询性能 | 高(分区剪枝) | 中(需处理半可加性) | 低(宽表扫描) |
| 业务场景 | 双11实时交易大屏 | 每日账户余额对账 | 订单全链路时效分析 |
| 阿里优化重点 | 小文件合并 + 流式压缩 | 增量计算 + OSS分级存储 | 局部更新 + 时间戳压缩 |