首页/数据/数仓建模速查/度量存储类型与单位
维度与事实设计149 条

度量存储类型与单位

存储基础可加度量并统一单位(如金额用分或固定小数位 decimal);比率类指标由上层计算,不在事实表存最终比率。

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

度量存储类型与单位规范

度量存储规范指事实表的度量列统一用可加的基础量、统一单位与类型:金额用 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) 或按分存 bigintfloat 或 double,累计出现尾差
件数、次数bigint字符串存数字,比较与求和都出错
比率不落值,存分子分母直接存 float 比率,跨维度不可合并
时间长度秒数 bigint存时分秒文本,无法参与计算
多币种本币金额 + 币种 + 原币金额只存原币,汇率变更后无法复算
金额字段禁用浮点不是风格偏好:二进制浮点无法精确表示 0.1 之类的十进制小数,累计几百笔后就会出现分位尾差,且误差随规模放大,在财务对账时必然暴露。

易错点

  • 金额用 float:长期累计出现尾差,对账时能差出可观的金额且难以定位
  • 同名度量在不同表单位不一致(一处元一处分):汇总时差 100 倍,且不报错
  • 比率直接落 float 值:跨维度无法合并,必须回明细重算
  • 小数位不统一:有的保留 2 位有的保留 4 位,汇总结果随口径变动
  • 多币种只存原币金额:汇率变更后无法复算本币值,历史报表永久不可重算

数据来源与参考

  • 数仓字段规范实践
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌