返回模板页

库存管理数据库设计示例

以下库存 schema 示例展示了同样的商品-仓库-库存核心如何扩展,以处理多个地点、批次与有效期追踪,以及与销售点系统的集成。

库存管理数据库设计示例

真实案例

单仓库存(基线方案)

使用场景: 为单个地点构建首个库存系统的开发者

Product (id, sku, name, unit_price, quantity, reorder_level)
数量直接放在商品行上——没有单独的库存表
Category (id, name) 用于组织目录
StockMovement (id, product_id, type, quantity, created_at)
Supplier (id, name, contact) 被入库记录引用

这样组织的原因: 只有一个地点时,数量可以直接放在商品行上——这是最简单的库存 schema。一旦出现第二个仓库,就要把数量拆进单独的库存表。

多仓库存

使用场景: 跨多个地点追踪同一商品的团队

Stock (id, product_id, warehouse_id, quantity, reorder_level)
每个商品每个仓库一行——数量不再放在 Product 上
Warehouse (id, name, location)
补货阈值可按仓库不同
低库存查询连接 Stock 和 Product,过滤 quantity < reorder_level

这样组织的原因: 多仓模式是库存 schema 的标准形态——把库存从商品中分离出来,才能让同一 SKU 在每个地点拥有不同的数量和补货阈值。

批次与有效期追踪

使用场景: 处理生鲜、药品或按批次管控货物的团队

Batch (id, product_id, warehouse_id, lot_number, expiry_date, quantity)
库存按批次追踪,而非仅按商品
FEFO(先到期先出)查询按 expiry_date 排序
StockMovement 引用 batch_id,而非仅商品
对临近有效期的批次触发告警

这样组织的原因: 批次追踪在库存之下加了一层——只要货物会过期或按批次召回就需要它,因为监管和 FEFO 拣货都要求知道某个单品究竟来自哪个批次。

零售 POS 库存

使用场景: 把库存与销售点集成的团队

Sale (id, store_id, sold_at, total) 含 SaleItem 明细行
每个 SaleItem 扣减该门店仓库的 Stock
Store 为库存目的映射到一个 Warehouse
StockMovement 的 'sale' 类型自动记录扣减
售后数量低于阈值时触发补货

这样组织的原因: POS 集成把销售与库存扣减绑定——图表展示 Sale 喂给 StockMovement,于是卖出商品和减少库存是同一笔事务,而非两个需要对账的系统。

使用技巧

  • 一旦有多个地点就把 Stock 从 Product 中分离——把数量放在 Product 上无法扩展到多仓。
  • 让 StockMovement 仅追加;当前数量是派生或缓存的,但流水日志才是真相来源。
  • 给 StockMovement 一个类型枚举(入库、出库、调整、销售),让每次数量变化都可审计。
  • 把 reorder_level 放在 Stock 而非 Product 上,让每个仓库设自己的阈值。

在线开始编辑

回到模板页,直接替换成你的课程主题、章节和复习重点,就可以继续使用这套结构。

使用这个模板: /editor/new?template=inventory-database-design

编辑此库存 schema 模板