订阅更新

箱、件、千克能直接求和吗?多计量单位的数仓怎么设计?

面试问 274 约 4 分钟读完

本文目录
  1. 面试怎么回答
  2. 数量不是一个孤立的数
  3. 包装单位转换,往往依赖商品
  4. 件与重量,未必能用固定系数
  5. 换算规则变更,历史要不要跟着改?
  6. 缺少系数,最危险的是默认等于一
  7. 数量变了,单价的分母也要一致
  8. 我会怎么验收?
  9. 参考资料

面试怎么回答

我会把数量、单位与业务粒度一起定义,保留原始数量,再按明确规则转换到标准单位。箱到件通常依赖商品和包装规格,不是全局常数;件到千克更不能默认固定重量。换算要记录方向、生效期和实际系数,缺失时隔离而不是填一。最后区分历史冻结与重新换算,并检查单价分母、退货单位和精度规则。

先把这段讲顺;面试官追问时,再展开下面的原理和细节。

详细讲解

一笔出库是 2 箱,另一笔是 5 件,把 quantity 加起来得到 7,看起来 SQL 没错,业务却不知道这 7 到底是什么。数量字段一旦离开单位、商品规格和发生时间,很多汇总就只剩一个没有含义的数字。

数量必须带单位和换算上下文;包装换算依赖商品规格,重量换算未必存在固定系数。

数量不是一个孤立的数

模型至少要说明:记录的是什么业务事件,数量对应什么单位,同一行是否只有一种商品和包装规格。出库、退货和库存快照也不能因为都有 quantity 就混在一起相加。

原始数量和原始单位应共同保留,必要时还要保留来源规格。标准化后的数量用于汇总,但不能替代原始事实,否则遇到换算争议时无从追溯。

例如 2 箱商品 A,每箱 12 件,另有 5 件散件。标准件数是 2 × 12 + 5 = 29 件,而不是 7 件。这组数字仅用来说明单位转换。

关键关系图

包装单位转换,往往依赖商品

“1 箱等于多少件”通常不是全局常数。同样叫一箱,商品 A 可能装 12 件,商品 B 可能装 24 件;同一商品也可能存在不同包装方案。

因此换算关系要包含商品或规格身份、来源单位、目标单位和适用时间。若来源订单已明确记录当次包装,应优先保留那份实际依据,避免后来规格变更让历史数量漂移。

换算方向也要明确。系数表达的是“每箱多少件”,计算时应乘;如果保存的是“每件多少箱”,则是另一方向。字段名只写 rate,很容易让不同任务用反。

件与重量,未必能用固定系数

千克到克是同一物理维度内的单位换算;件到千克则需要知道每件实际重量,两者不是同一类关系。

对于变重商品,一箱的净重可能按称重结果确定,不能套一个平均重量就声称得到了真实出库重量。平均系数可以服务估算,但指标名称和用途要标明估算性质。

类似地,体积、面积、长度和件数不能随意折算。模型要区分可换算、需要额外属性才能换算,以及根本不可直接比较的数量。

如果经营分析要求比较不同商品的“标准箱”,也要把它看作专门定义的业务折算指标,而不是冒充原始物流箱数。

换算规则变更,历史要不要跟着改?

看一个典型场景:商品原来每箱 12 件,后来新包装改成每箱 10 件。历史有 2 箱出库,重跑任务关联最新规格后,从 24 件变成了 20 件。

团队最初排查退货漏算,事实行数和原箱数却没变。真正的问题是最新规格覆盖了历史适用规则;旧验收只对原数量,未检查标准数量与换算依据。

修复要保留生效期或实际换算系数,并为历史冻结结果和重新折算结果分别命名。新规格生效的具体边界,由业务确认,不能让任务上线日期代替包装实际使用日期。

测试至少包括规格变化前后、同日不同包装,以及原始凭证显式指定规格的情况。不能只用一款永远不变的商品验证模型。

缺少系数,最危险的是默认等于一

若查不到箱到件关系,直接用 COALESCE(rate, 1),会让结果看起来正常却悄悄少算。兜底只有在业务含义明确时才成立。

可将无法换算的记录保留原量并打异常标记,单独统计未换算数量和占比;是否阻断发布,要按指标的重要程度决定。不要为了让 SUM 不为空,就把未知伪装成真实的一。

有效关系重叠也要检查。一次关联命中两套规格,可能让数量成倍增加。换算正确的第一步,是每条事实找到唯一适用规则。

数量变了,单价的分母也要一致

金额除以件数得到每件单价,金额除以箱数得到每箱单价。这两个单价数值不同,但总金额可能相同,不能把它们放在同一列直接平均。

汇总单价通常应使用同口径总金额除以同单位总数量,而不是简单平均各行单价。退货的正负方向、数量单位和金额归属也应配套处理。

精度规则同样要写清:允许小数件吗,标准单位保留几位,先逐笔舍入还是汇总后舍入。单靠 DECIMAL 类型,并不能替业务决定这些规则。

我会怎么验收?

一边按原单位对账,确认没有丢失原始事实;另一边按标准单位检查换算关系、有效期和计算结果。

再抽查真实业务凭证能否还原到“原量 × 当次系数”。能讲清这个过程,才说明数仓在管理有含义的数量,而不是在堆放数字。

参考资料

刷题进度保存在当前浏览器