粒度声明是什么
粒度声明是用一句话回答『一行代表什么』,它是维度模型的地基。粒度越细灵活性越高但存储与加工成本越大;粒度越粗则无法下钻,报表只能在指定层级汇总。声明完成后要写进表注释、模型文档与评审记录,任何新增字段都要先问一句是否与该粒度相容。同一个业务过程如果出现两套粒度,说明存在两张事实表,而不是一张表里混着两种含义。
基本信息
| 表达形式 | 一行 = 一笔订单中的一个商品行(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 '粒度:一行 = 一笔订单中的一个商品行';粒度声明检查项
| 检查项 | 通过标准 | 常见问题 |
|---|---|---|
| 唯一性 | 声明字段能唯一标识一行 | 声明了订单粒度却按商品行存储 |
| 可读性 | 业务与开发都能复述 | 用『相关信息』这类模糊词 |
| 相容性 | 每个度量在该粒度下可累加 | 把账户余额与订单金额放在同一张表 |
| 落档 | 注释、文档、评审三处一致 | 只在评审会上口头达成 |
粒度争议必须在评审阶段解决,落地之后再改就是全链路返工:事实表重刷、下游口径重算、历史指标失去可比性。
同一业务过程允许存在多个粒度,但那是两张事实表(明细与汇总),并且必须能互相校验,而不是在同一张表里混存两种含义的行。