事实表粒度声明是什么
事实表粒度声明指每张事实表必须白纸黑字写清「一行代表什么」:一个订单一行、一个订单中的一个商品行一行,还是一天一个账户一行。粒度决定主键、去重口径、分区方式与可用的维度组合,是事实表设计的第一性问题。评审事实表时先问粒度再谈字段,因为粒度含糊是重复计数的头号来源,而上线后再改粒度等于重建整条链路。
基本信息
| 声明位置 | 表注释、数据字典与模型文档首页 |
|---|---|
| 声明内容 | 一行代表什么 + 唯一业务键组合 |
| 影响面 | 主键设计、分区方式、可加性与可用维度 |
| 评审顺序 | 先定粒度,再定维度,最后定度量 |
| 变更成本 | 改粒度等于重建事实表与所有下游指标 |
典型使用场景
- 新表设计评审:先确认粒度声明,避免事后返工
- 重复计数排查:两个报表金额不一致时先核对粒度假设
- 维度可用性判断:粒度越细可支持的维度组合越多
- 分区策略选择:粒度与业务时间共同决定分区键
- 指标口径定义:指标必须写在明确粒度之上才可复现
- 跨表对齐:上下游事实表粒度不同时明确汇聚方式
粒度声明示例
粒度声明示例
fact_order_item 一行 = 一个订单中的一个商品行
grain = order_id + sku_id
唯一约束 = (order_id, sku_id),取最新版本
分区键 = biz_date(业务日期)
可加度量 = 商品金额、件数、优惠金额
注意事项 = 一单多商品时订单级金额不可直接求和粒度层级对照
| 粒度 | 一行代表 | 用途与注意 |
|---|---|---|
| 订单商品行 | 订单 + 商品 | 最细,可上卷到订单与品类;订单级字段需去重 |
| 订单级 | 一个订单 | 便于算客单价;无法按商品分析 |
| 支付流水级 | 一次支付或退款 | 含正负行,净额靠 sum;不可与订单行直接 join 求和 |
| 周期快照级 | 实体 + 周期 | 状态型度量,跨时间不可加 |
订单级字段(如整单运费、整单优惠)落在订单商品行粒度上时是重复值,直接 sum 会成倍放大。要么在订单粒度单独存放,要么明确分摊规则后按系数摊到商品行,二者不能含糊混用。