首页/数据/数仓建模速查/粒度声明:模型的地基
建模基础69 条

粒度声明:模型的地基

粒度声明用一句话回答「一行代表什么」;粒度越细灵活性越高但存储越大,粒度越粗则无法下钻,声明后写进表注释与文档。

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

粒度声明是什么

粒度声明是用一句话回答『一行代表什么』,它是维度模型的地基。粒度越细灵活性越高但存储与加工成本越大;粒度越粗则无法下钻,报表只能在指定层级汇总。声明完成后要写进表注释、模型文档与评审记录,任何新增字段都要先问一句是否与该粒度相容。同一个业务过程如果出现两套粒度,说明存在两张事实表,而不是一张表里混着两种含义。

基本信息

表达形式一行 = 一笔订单中的一个商品行(order_id + sku_id)
权衡细粒度灵活但成本高,粗粒度省资源但无法下钻
落地表注释、模型文档、评审记录三处一致
校验唯一键组合是否与声明完全对应

典型使用场景

  • 新建事实表:粒度句先定稿再讨论维度与度量,避免顺序颠倒
  • 评审争议裁决:两个团队口径不一致时,回到粒度句判断谁的假设成立
  • 模型文档编写:粒度是文档第一项,缺这项的模型视为未交付
  • 历史模型诊断:同一过程出现多张表时,用粒度区分是冗余还是分层必要
  • 需求评估:新的下钻需求先判断现有粒度是否支持,不支持就评估成本而非临时改表

粒度声明写法

粒度声明写法
-- 笼统(不合格):订单相关明细数据,业务与开发理解各不相同
-- 合格写法一:一行 = 一笔订单中的一个商品行(order_id + sku_id)
-- 合格写法二:一行 = 一个用户一天的账户余额快照(user_id + snapshot_date)
CREATE TABLE fact_order_item (
  order_id   bigint COMMENT '订单号,与 sku_id 组成唯一键',
  sku_id     bigint COMMENT '商品编码',
  item_amt   bigint COMMENT '商品行应付金额,单位分'
) COMMENT '粒度:一行 = 一笔订单中的一个商品行';

粒度声明检查项

检查项通过标准常见问题
唯一性声明字段能唯一标识一行声明了订单粒度却按商品行存储
可读性业务与开发都能复述用『相关信息』这类模糊词
相容性每个度量在该粒度下可累加把账户余额与订单金额放在同一张表
落档注释、文档、评审三处一致只在评审会上口头达成
粒度争议必须在评审阶段解决,落地之后再改就是全链路返工:事实表重刷、下游口径重算、历史指标失去可比性。
同一业务过程允许存在多个粒度,但那是两张事实表(明细与汇总),并且必须能互相校验,而不是在同一张表里混存两种含义的行。

易错点

  • 粒度写得太笼统:开发各自理解,同一张表里混着订单级与商品行级数据
  • 为将来可能的下钻提前拍细粒度:存储与加工成本空转,细粒度层长期无人使用
  • 粒度与主键不一致:声称订单粒度却缺少唯一约束,重跑后行数成倍增长
  • 粒度声明只留在文档里未进表注释:使用者查表时看不到,误按错误粒度聚合

数据来源与参考

  • Kimball 方法论:粒度声明
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌