度量存储类型与单位规范
度量存储规范指事实表的度量列统一用可加的基础量、统一单位与类型:金额用 decimal 而不是 float,全库统一到元或统一到分,计数用整型,比率不在事实表落最终值。命名上按后缀区分语义,如 amt 金额、cnt 笔数、qty 件数、fee 费用。这样做的直接收益是跨表 join 与汇总时不需要逐表确认单位,对账也不会因为浮点误差出现尾差。
基本信息
| 单位 | 全库统一,元或分二选一,不允许混用 |
|---|---|
| 类型 | 金额用 decimal 明确精度,禁用 float |
| 命名 | amt 金额、cnt 笔数、qty 件数、fee 费用、rate 比率 |
| 比率 | 不在事实表存最终值,只存分子分母 |
| 精度 | 小数位统一,如金额保留 2 位、比例保留 6 位 |
典型使用场景
- 新建事实表:按规范挑类型与单位,避免下游逐表换算
- 跨表汇总:多张事实 join 时金额单位一致才能直接相加
- 汇率与多币种:统一本币金额加一列原币金额,不在查询端换算
- 对账:金额用 decimal 避免浮点尾差导致对不上
- 成本核算:费用类度量统一到分,避免小数位截断累积
- 指标层复用:比率类指标由分子分母现算,不依赖事实表落值
字段示例
字段示例
pay_amt decimal(18,2) -- 支付金额(元),禁用 float
item_cnt bigint -- 商品件数
express_fee decimal(18,2) -- 运费(元)
discount_amt decimal(18,2) -- 优惠金额(元),正数表示减少
tax_amt decimal(18,2) -- 税额(元)
-- 比率类不落最终值,只留分子分母
-- SELECT sum(pay_amt) / count(distinct order_id) AS aov FROM fact_order;类型对照
| 度量 | 推荐类型 | 错误做法 |
|---|---|---|
| 金额 | decimal(18,2) 或按分存 bigint | float 或 double,累计出现尾差 |
| 件数、次数 | bigint | 字符串存数字,比较与求和都出错 |
| 比率 | 不落值,存分子分母 | 直接存 float 比率,跨维度不可合并 |
| 时间长度 | 秒数 bigint | 存时分秒文本,无法参与计算 |
| 多币种 | 本币金额 + 币种 + 原币金额 | 只存原币,汇率变更后无法复算 |
金额字段禁用浮点不是风格偏好:二进制浮点无法精确表示 0.1 之类的十进制小数,累计几百笔后就会出现分位尾差,且误差随规模放大,在财务对账时必然暴露。