库存中心怎么设计?一次讲清可用库存、冻结库存、仓库维度与库存流水体系
库存中心怎么设计?一次讲清可用库存、冻结库存、仓库维度与库存流水体系
大家好,我是一名有 4 年工作经验的 Java 后端开发。
库存系统在电商里绝对是核心中的核心,很多高并发、超卖、回补、履约问题最后都会绕回库存中心本身。
这篇文章我想系统聊一聊库存中心到底应该怎么设计。
🦅个人主页
🐼
文章目录
一、库存中心到底在管什么
很多人会把库存理解成:
- 一个商品有多少库存
但真实库存中心远不止这个层面,它通常要管理:
- 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 仓库库存表
CREATE TABLE warehouse_stock (
sku_id BIGINT NOT NULL,
warehouse_id BIGINT NOT NULL,
available_stock INT NOT NULL,
frozen_stock INT NOT NULL,
sold_stock INT NOT NULL,
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (sku_id, warehouse_id)
);
5.2 库存流水表
CREATE TABLE stock_flow (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
sku_id BIGINT NOT NULL,
warehouse_id BIGINT NOT NULL,
biz_type VARCHAR(32) NOT NULL,
biz_id BIGINT NOT NULL,
available_delta INT NOT NULL,
frozen_delta INT NOT NULL,
sold_delta INT NOT NULL,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
);
六、面试中怎么回答
如果面试官问你:
库存中心一般怎么设计?
你可以这样回答:
第一,我不会把库存中心设计成单一 stock 字段,而是至少会拆成可用库存、冻结库存和已售库存,因为它们对应不同的业务生命周期。
第二,库存通常会按 SKU + 仓库维度建模,因为真实履约依赖的是具体 SKU 在具体仓库里的库存,而不是抽象商品总库存。
第三,库存中心里一定要有库存流水,因为很多问题最后不是“当前数不对”,而是“这个数到底怎么变成现在这样的”,没有流水后面很难排查和对账。
七、总结
库存中心真正难的,不是“减库存”,而是如何把:
- 数量
- 生命周期
- 仓库维度
- 流水审计
真正管理成一套账本系统。
如果只记一句结论,我觉得可以记住这句:
库存中心最稳的设计一定不是一个 stock 字段,而是“SKU + 仓库 + 可用/冻结/已售 + 流水”的组合模型。
八、结尾
如果你觉得这篇文章对你有帮助,欢迎点赞、收藏、关注。
后面我会继续整理一些更偏实战的 Java 后端和电商系统设计文章,尽量少写空泛概念,多写真实项目里会踩到的坑。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)