库存中心怎么设计?一次讲清可用库存、冻结库存、仓库维度与库存流水体系
大家好,我是一名有 4 年工作经验的 Java 后端开发。
库存系统在电商里绝对是核心中的核心,很多高并发、超卖、回补、履约问题最后都会绕回库存中心本身。
这篇文章我想系统聊一聊库存中心到底应该怎么设计。
🦅个人主页
🐼
文章目录
- 库存中心怎么设计?一次讲清可用库存、冻结库存、仓库维度与库存流水体系
- 一、库存中心到底在管什么
- 二、为什么库存一定要按 SKU 和仓库管理
- 三、推荐的库存模型
- 四、库存中心最关键的几个能力
- 4.1 库存冻结与解冻
- 4.2 扣减与回补
- 4.3 库存流水
- 4.4 人工调整
- 五、表设计建议
- 5.1 仓库库存表
- 5.2 库存流水表
- 六、面试中怎么回答
- 七、总结
- 八、结尾
一、库存中心到底在管什么
很多人会把库存理解成:
- 一个商品有多少库存
但真实库存中心远不止这个层面,它通常要管理:
- SKU 库存
- 仓库库存
- 可用库存
- 冻结库存
- 已售库存
- 库存流水
- 人工调整
- 盘点差异
所以库存中心本质上不是一个字段,而是一套库存账本系统。
二、为什么库存一定要按 SKU 和仓库管理
因为真正可售卖和可履约的库存,往往取决于:
- 具体 SKU
- 具体仓库
如果你只在商品维度记库存,后面会很难支持:
- 多仓发货
- 仓库调拨
- 区域库存
- 部分缺货
三、推荐的库存模型
我更建议至少拆成:
warehouse_stockstock_flowstock_adjust_record
其中warehouse_stock可以包含:
available_stockfrozen_stocksold_stock
这比单一stock字段清晰很多。
四、库存中心最关键的几个能力
4.1 库存冻结与解冻
用于:
- 下单锁库存
- 超时释放库存
4.2 扣减与回补
用于:
- 支付成功
- 取消订单
- 售后回补
4.3 库存流水
用于:
- 审计
- 排查
- 对账
4.4 人工调整
库存系统一定会遇到:
- 盘点差异
- 手工修正
所以要有专门调整记录。
五、表设计建议
5.1 仓库库存表
CREATETABLEwarehouse_stock(sku_idBIGINTNOTNULL,warehouse_idBIGINTNOTNULL,available_stockINTNOTNULL,frozen_stockINTNOTNULL,sold_stockINTNOTNULL,updated_atDATETIMENOTNULLDEFAULTCURRENT_TIMESTAMPONUPDATECURRENT_TIMESTAMP,PRIMARYKEY(sku_id,warehouse_id));5.2 库存流水表
CREATETABLEstock_flow(idBIGINTPRIMARYKEYAUTO_INCREMENT,sku_idBIGINTNOTNULL,warehouse_idBIGINTNOTNULL,biz_typeVARCHAR(32)NOTNULL,biz_idBIGINTNOTNULL,available_deltaINTNOTNULL,frozen_deltaINTNOTNULL,sold_deltaINTNOTNULL,created_atDATETIMENOTNULLDEFAULTCURRENT_TIMESTAMP);六、面试中怎么回答
如果面试官问你:
库存中心一般怎么设计?
你可以这样回答:
第一,我不会把库存中心设计成单一 stock 字段,而是至少会拆成可用库存、冻结库存和已售库存,因为它们对应不同的业务生命周期。
第二,库存通常会按 SKU + 仓库维度建模,因为真实履约依赖的是具体 SKU 在具体仓库里的库存,而不是抽象商品总库存。
第三,库存中心里一定要有库存流水,因为很多问题最后不是“当前数不对”,而是“这个数到底怎么变成现在这样的”,没有流水后面很难排查和对账。
七、总结
库存中心真正难的,不是“减库存”,而是如何把:
- 数量
- 生命周期
- 仓库维度
- 流水审计
真正管理成一套账本系统。
如果只记一句结论,我觉得可以记住这句:
库存中心最稳的设计一定不是一个 stock 字段,而是“SKU + 仓库 + 可用/冻结/已售 + 流水”的组合模型。
八、结尾
如果你觉得这篇文章对你有帮助,欢迎点赞、收藏、关注。
后面我会继续整理一些更偏实战的 Java 后端和电商系统设计文章,尽量少写空泛概念,多写真实项目里会踩到的坑。