首页/数据/数仓建模速查/事实表粒度声明
维度与事实设计149 条

事实表粒度声明

每张事实表必须声明一行代表什么(一订单一行还是一订单商品一行);粒度决定主键、分区方式与可用维度组合。

数仓建模速查数据更新于 2026-10-13

事实表粒度声明是什么

事实表粒度声明指每张事实表必须白纸黑字写清「一行代表什么」:一个订单一行、一个订单中的一个商品行一行,还是一天一个账户一行。粒度决定主键、去重口径、分区方式与可用的维度组合,是事实表设计的第一性问题。评审事实表时先问粒度再谈字段,因为粒度含糊是重复计数的头号来源,而上线后再改粒度等于重建整条链路。

基本信息

声明位置表注释、数据字典与模型文档首页
声明内容一行代表什么 + 唯一业务键组合
影响面主键设计、分区方式、可加性与可用维度
评审顺序先定粒度,再定维度,最后定度量
变更成本改粒度等于重建事实表与所有下游指标

典型使用场景

  • 新表设计评审:先确认粒度声明,避免事后返工
  • 重复计数排查:两个报表金额不一致时先核对粒度假设
  • 维度可用性判断:粒度越细可支持的维度组合越多
  • 分区策略选择:粒度与业务时间共同决定分区键
  • 指标口径定义:指标必须写在明确粒度之上才可复现
  • 跨表对齐:上下游事实表粒度不同时明确汇聚方式

粒度声明示例

粒度声明示例
fact_order_item  一行 = 一个订单中的一个商品行
grain            = order_id + sku_id
唯一约束          = (order_id, sku_id),取最新版本
分区键            = biz_date(业务日期)
可加度量          = 商品金额、件数、优惠金额
注意事项          = 一单多商品时订单级金额不可直接求和

粒度层级对照

粒度一行代表用途与注意
订单商品行订单 + 商品最细,可上卷到订单与品类;订单级字段需去重
订单级一个订单便于算客单价;无法按商品分析
支付流水级一次支付或退款含正负行,净额靠 sum;不可与订单行直接 join 求和
周期快照级实体 + 周期状态型度量,跨时间不可加
订单级字段(如整单运费、整单优惠)落在订单商品行粒度上时是重复值,直接 sum 会成倍放大。要么在订单粒度单独存放,要么明确分摊规则后按系数摊到商品行,二者不能含糊混用。

易错点

  • 粒度未声明:不同人按各自理解统计,同样的表算出不同订单数
  • 订单级金额放在商品行粒度上直接求和:一单多商品时金额成倍放大
  • 上线后才发现粒度不足:需要更细维度时只能重建事实表与所有下游指标
  • 跨粒度两表直接 join 后求和:一对多放大,结果无人能解释
  • 粒度声明与唯一约束不一致:声明是订单级但表里存在重复行,去重规则无从执行

数据来源与参考

  • 数据仓库工具箱:粒度
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌