WMS仓库管理系统的数据库表设计 笔记250725
好的,设计一个WMS(仓库管理系统)的数据库表结构是一个复杂但核心的任务。它需要精确反映仓库的物理结构、货物特性、业务流程以及操作记录。以下是一个核心且相对通用的WMS数据库表设计概览,涵盖了主要实体和关系。实际设计需要根据具体业务需求(如行业、仓库规模、流程复杂度、自动化程度等)进行调整和扩展。
核心设计原则:
- 数据完整性: 主键、外键约束确保关联关系正确。
- 可追溯性: 所有关键操作(入库、出库、移动、调整)必须有详细记录。
- 性能: 高频查询表(如库存表)需优化索引和结构。
- 扩展性: 考虑未来业务变化(如新增仓库、货主、商品属性)。
- 规范化: 减少数据冗余,但有时为了查询性能会适当反规范化(如库存表中存储常用商品信息)。
核心实体与表结构:
仓库基础信息
warehouse
(仓库表)warehouse_id
(PK): 仓库唯一标识 (主键)name
: 仓库名称code
: 仓库编码address
: 仓库地址contact_person
: 联系人contact_phone
: 联系电话status
(启用/禁用): 仓库状态type
(常温仓、冷藏仓、危品仓等): 仓库类型manager
: 负责人description
: 描述created_at
,updated_at
: 创建/更新时间
库区与储位管理
zone
(库区表)zone_id
(PK): 库区唯一标识warehouse_id
(FK): 所属仓库ID (外键到warehouse
)name
: 库区名称 (如:收货区、存储区、拣货区、发货区、退货区、残品区)code
: 库区编码type
: 库区类型 (收货、存储、拣货、发货、暂存等)description
: 描述capacity
(可选): 库区容量估算status
: 状态 (启用/禁用)
location
(储位表 - 核心表)location_id
(PK): 储位唯一标识 (如货架-层-位编码)zone_id
(FK): 所属库区ID (外键到zone
)code
: 储位编码 (唯一,通常有规则,如 A-01-01-01)type
: 储位类型 (地面堆垛、货架、流利架、穿梭板位等)status
: 状态 (空置、占用、锁定、禁用、盘点中等)max_volume
: 最大可容纳体积max_weight
: 最大承重max_quantity
(可选): 最大可容纳数量 (对于固定容器位)dimensions
(可选): 储位尺寸 (长,宽,高)x_coord
,y_coord
,z_coord
(可选): 在仓库/库区内的坐标 (用于路径优化)current_volume
(可选, 可计算): 当前占用体积 (冗余,根据库存计算)current_weight
(可选, 可计算): 当前承重 (冗余)last_inventory_time
(可选): 最近盘点时间
货主与商品管理
owner
/client
(货主表)owner_id
(PK): 货主唯一标识name
: 货主名称/公司名code
: 货主编码contact_info
: 联系方式address
: 地址contract_info
: 合同信息status
: 状态 (合作中/终止等)
sku
(商品表 - 核心表)sku_id
(PK): 商品唯一标识 (Stock Keeping Unit)owner_id
(FK): 所属货主ID (外键到owner
) - 重要!支持多货主name
: 商品名称code
: 商品编码 (货主提供或系统生成)barcode
: 商品条码 (主条码,用于扫描)specification
: 规格型号unit
: 计量单位 (个、箱、千克、米等)length
,width
,height
: 商品尺寸 (计算体积用)volume
: 单件体积 (冗余,方便计算)weight
: 单件重量 (毛重)net_weight
(可选): 净重category_id
(FK, 可选): 商品分类ID (外键到category
)is_serialized
: 是否序列号管理 (是/否)is_batch_managed
: 是否批次管理 (是/否) - 关键属性shelf_life
(可选): 保质期 (天)shelf_life_warning_days
(可选): 保质期预警天数temperature_requirement
(可选): 温层要求 (常温、冷藏、冷冻)hazardous_level
(可选): 危险品等级description
: 描述status
: 状态 (启用/禁用)
category
(商品分类表, 可选)category_id
(PK)parent_id
(FK): 父分类ID (自身引用,支持多级分类)name
: 分类名称code
: 分类编码description
: 描述
supplier
(供应商表, 可选)supplier_id
(PK)name
: 供应商名称code
: 供应商编码contact_info
: 联系方式- … (其他供应商信息)
库存管理 (核心表!)
inventory
(库存明细表)inventory_id
(PK): 库存记录唯一标识location_id
(FK): 所在储位ID (外键到location
) - 精确到储位sku_id
(FK): 商品ID (外键到sku
)owner_id
(FK): 货主ID (外键到owner
) - 明确归属batch_number
(可选): 批次号 (如果启用批次管理)production_date
(可选): 生产日期 (如果启用批次/效期管理)expiry_date
(可选): 失效/过期日期 (如果启用效期管理)serial_number
(可选): 序列号 (如果启用序列号管理,需唯一)quantity
: 当前数量 (正数)lock_quantity
(可选): 锁定数量 (如已分配未拣、待质检、冻结等)available_quantity
(计算字段 或 冗余): 可用数量 =quantity
-lock_quantity
inventory_status
: 库存状态 (良品、待检、残品、冻结等) - 重要last_transaction_id
(FK, 可选): 最后操作的事务ID (外键到inventory_transaction
) - 便于追溯last_updated
: 最后更新时间 (记录最新操作时间)version
(乐观锁): 版本号 (用于并发控制,防止超卖)- 唯一约束 (Unique Constraint):
(location_id, sku_id, batch_number, production_date, expiry_date, serial_number, inventory_status)
- 确保同一储位、同一商品、同一批次/序列号、同一状态的记录唯一。这是核心约束!
库存事务流水 (核心表!)
inventory_transaction
(库存事务表)transaction_id
(PK): 事务唯一标识transaction_type
: 事务类型 (入库、出库、移库、库存调整、盘点调整、冻结/解冻等)transaction_time
: 事务发生时间operator_id
(FK, 可选): 操作员ID (外键到user
)reference_document
: 关联单据号 (如入库单号、出库单号、移库单号、盘点单号等)reference_document_type
: 关联单据类型 (采购入库单、销售出库单、调拨单、盘点单等)sku_id
(FK): 涉及商品ID (外键到sku
)owner_id
(FK): 涉及货主ID (外键到owner
)from_location_id
(FK, 可选): 源储位ID (外键到location
, 如移库、出库)to_location_id
(FK, 可选): 目标储位ID (外键到location
, 如入库、移库)batch_number
(可选): 批次号production_date
(可选): 生产日期expiry_date
(可选): 失效日期serial_number
(可选): 序列号inventory_status
(可选): 库存状态 (良品->残品调整)quantity_change
: 数量变化 (正数表示增加,负数表示减少)quantity_before
: 操作前数量 (冗余,便于审计)quantity_after
: 操作后数量 (冗余,便于审计)remarks
: 备注cost
(可选, 通常财务系统管): 成本 (谨慎处理)transaction_group
(可选): 事务组ID (用于关联同一操作产生的多条事务记录,如移库涉及出和入)
入库管理
asn
/receiving_order
(入库通知单/收货单)asn_id
(PK): 入库单唯一标识asn_number
: 入库单号owner_id
(FK): 货主IDsupplier_id
(FK, 可选): 供应商IDwarehouse_id
(FK): 目标仓库IDexpected_arrival_time
: 预计到货时间actual_arrival_time
(可选): 实际到货时间carrier
(可选): 承运商vehicle_number
(可选): 车牌号status
: 状态 (创建、部分收货、收货完成、上架中、上架完成、关闭、取消)total_expected_quantity
(可选): 预期总数量total_received_quantity
(可选): 已收总数量total_putaway_quantity
(可选): 已上架总数量created_by
,created_at
,updated_by
,updated_at
asn_detail
(入库单明细)asn_detail_id
(PK)asn_id
(FK): 关联入库单IDsku_id
(FK): 商品IDexpected_quantity
: 预期数量received_quantity
: 已收数量putaway_quantity
: 已上架数量batch_number
(可选): 预期批次号production_date
(可选): 预期生产日期expiry_date
(可选): 预期失效日期inventory_status
(可选): 预期库存状态 (通常为良品)- … (其他预期属性)
receiving_record
(收货记录表, 可选)- 记录每次收货扫描的明细(按托盘/箱/件),关联到
asn_detail
。如果流程简单,可以直接更新asn_detail
的received_quantity
。
- 记录每次收货扫描的明细(按托盘/箱/件),关联到
putaway_task
/putaway_list
(上架任务表)putaway_task_id
(PK)asn_id
(FK): 关联入库单IDtask_number
: 任务单号status
: 状态 (待分配、已分配、执行中、部分完成、已完成、取消)assigned_to
(FK, 可选): 分配给谁 (外键到user
)assigned_time
(可选): 分配时间start_time
(可选): 开始执行时间completion_time
(可选): 完成时间priority
(可选): 优先级source_location_id
(FK, 可选): 源储位 (通常是收货暂存区)total_quantity
: 总待上架数量 (可计算)completed_quantity
: 已完成上架数量
putaway_task_detail
(上架任务明细)putaway_detail_id
(PK)putaway_task_id
(FK): 关联上架任务IDasn_detail_id
(FK): 关联入库单明细IDsku_id
(FK): 商品IDquantity_to_putaway
: 待上架数量quantity_putaway
: 已上架数量suggested_location_id
(FK, 可选): 系统推荐上架储位IDactual_location_id
(FK, 可选): 实际上架储位IDbatch_number
(可选): 批次号- … (其他属性)
status
: 明细状态 (待上架、上架中、已完成)
出库管理
order
/shipment_order
(出库单/发货单)order_id
(PK)order_number
: 出库单号 (如销售订单号、调拨出库单号)owner_id
(FK): 货主IDcustomer_id
(FK, 可选): 客户ID (如果是销售出库)warehouse_id
(FK): 发货仓库IDorder_type
: 订单类型 (销售出库、调拨出库、退货出库、领料出库等)priority
: 优先级 (普通、紧急)status
: 状态 (新建、已分配、部分拣货、拣货完成、部分打包、打包完成、部分发货、发货完成、关闭、取消)total_ordered_quantity
(可选): 订单总数量total_picked_quantity
(可选): 已拣总数量total_packed_quantity
(可选): 已打包总数量total_shipped_quantity
(可选): 已发货总数量expected_ship_date
: 要求发货日期actual_ship_date
(可选): 实际发货日期carrier
(可选): 承运商tracking_number
(可选): 运单号shipping_address
: 收货地址created_by
,created_at
,updated_by
,updated_at
order_detail
(出库单明细)order_detail_id
(PK)order_id
(FK): 关联出库单IDsku_id
(FK): 商品IDordered_quantity
: 订单需求数量allocated_quantity
(可选): 已分配数量 (波次分配结果)picked_quantity
: 已拣选数量packed_quantity
: 已打包数量shipped_quantity
: 已发货数量batch_rule
(可选): 批次规则 (FIFO, FEFO, LIFO, 指定批次)inventory_status_rule
(可选): 库存状态要求 (通常良品)- … (其他要求)
wave
(波次表, 可选)wave_id
(PK)wave_number
: 波次号warehouse_id
(FK): 仓库IDstatus
: 状态 (新建、已分配、部分拣货、拣货完成、关闭)release_time
: 波次释放时间 (开始拣货)completion_time
(可选): 完成时间strategy
: 波次策略 (按订单、按商品、按区域等)
wave_detail
(波次明细)wave_detail_id
(PK)wave_id
(FK): 关联波次IDorder_id
(FK): 关联出库单IDorder_detail_id
(FK): 关联出库单明细IDallocated_quantity
: 分配数量
picking_task
/pick_list
(拣货任务表)picking_task_id
(PK)wave_id
(FK, 可选): 关联波次ID (如果有)order_id
(FK, 可选): 关联出库单ID (如果按单拣)task_number
: 任务单号picker_id
(FK, 可选): 拣货员IDstatus
: 状态 (待分配、已分配、执行中、部分完成、已完成、取消)assigned_time
,start_time
,completion_time
pick_type
: 拣货方式 (按单拣、按批次拣、按区域接力拣)zone_id
(FK, 可选): 负责库区 (区域接力拣)total_quantity
: 总待拣数量picked_quantity
: 已拣数量
picking_task_detail
(拣货任务明细)picking_detail_id
(PK)picking_task_id
(FK): 关联拣货任务IDorder_detail_id
(FK): 关联出库单明细IDinventory_id
(FK): 来源库存记录ID (外键到inventory
) - 关键!精确到具体批次/序列号的库存location_id
(FK): 来源储位IDquantity_to_pick
: 计划拣取数量quantity_picked
: 实际拣取数量batch_number
(可选): 批次号serial_number
(可选): 序列号status
: 明细状态 (待拣、拣货中、已拣)
packing
(打包表, 可选)packing_id
(PK)order_id
(FK): 关联出库单IDpacker_id
(FK, 可选): 打包员IDpacked_time
: 打包时间box_number
: 箱号/包裹号weight
(可选): 包裹重量dimensions
(可选): 包裹尺寸shipping_label
: 物流面单信息 (或存储路径)
packing_detail
(打包明细表, 可选)packing_detail_id
(PK)packing_id
(FK): 关联打包记录IDorder_detail_id
(FK): 关联出库单明细IDquantity_packed
: 打包数量sku_id
(FK): 商品ID (冗余)
shipping
(发货表, 可选)shipping_id
(PK)order_id
(FK): 关联出库单IDshipper_id
(FK, 可选): 发货员IDshipped_time
: 发货时间carrier
: 承运商 (冗余)tracking_number
: 运单号 (冗余或唯一)vehicle_number
: 车牌号 (冗余)shipping_cost
(可选): 运费
库内作业
move_task
(移库/调拨任务表)move_task_id
(PK)task_number
: 任务单号reason
: 移库原因 (库存调整、优化储位、盘点移位等)source_warehouse_id
(FK, 可选): 源仓库ID (跨仓移库)target_warehouse_id
(FK, 可选): 目标仓库ID (跨仓移库)status
: 状态 (创建、分配中、执行中、部分完成、已完成、取消)assigned_to
(FK, 可选): 操作员priority
: 优先级created_by
,created_at
,updated_by
,updated_at
move_task_detail
(移库任务明细)move_detail_id
(PK)move_task_id
(FK): 关联移库任务IDinventory_id
(FK): 要移动的库存记录IDfrom_location_id
(FK): 源储位IDto_location_id
(FK): 目标储位IDquantity_to_move
: 计划移动数量quantity_moved
: 实际移动数量status
: 明细状态 (待移动、移动中、已完成)
inventory_adjustment
(库存调整单)adjustment_id
(PK)adjustment_number
: 调整单号reason
: 调整原因 (盘点差异、报损、报溢、其他)warehouse_id
(FK): 仓库IDstatus
: 状态 (草稿、已审核、已过账)created_by
,created_at
,approved_by
(可选),approved_at
(可选),posted_by
(可选),posted_at
(可选)
inventory_adjustment_detail
(库存调整明细)adjustment_detail_id
(PK)adjustment_id
(FK): 关联调整单IDlocation_id
(FK): 储位IDsku_id
(FK): 商品IDowner_id
(FK): 货主IDbatch_number
(可选): 批次号production_date
(可选): 生产日期expiry_date
(可选): 失效日期serial_number
(可选): 序列号inventory_status
: 库存状态quantity_before
: 调整前数量quantity_after
: 调整后数量quantity_difference
: 调整量 (正数增加,负数减少)cost_difference
(可选, 财务): 成本差异
盘点管理
cycle_count_plan
(循环盘点计划表, 可选)plan_id
(PK)name
: 计划名称warehouse_id
(FK): 仓库IDzone_id
(FK, 可选): 目标库区sku_id
(FK, 可选): 目标商品owner_id
(FK, 可选): 目标货主frequency
: 盘点频率 (每天、每周、每月、自定义)method
: 盘点方法 (动碰、盲盘、明盘)status
: 状态 (启用、禁用)last_run_time
: 上次执行时间next_run_time
: 下次计划执行时间
inventory_count
(盘点单表)count_id
(PK)count_number
: 盘点单号count_type
: 盘点类型 (全盘、循环盘点、动碰盘点、抽查、定期盘点)plan_id
(FK, 可选): 关联计划ID (如果是循环盘点)warehouse_id
(FK): 仓库IDzone_id
(FK, 可选): 目标库区start_time
: 计划开始时间end_time
(可选): 计划结束时间status
: 状态 (初始化、盘点中、差异核对、调整中、已完成、取消)is_blind
: 是否盲盘 (是/否)created_by
,created_at
,closed_by
(可选),closed_at
(可选)
count_detail
(盘点单明细)count_detail_id
(PK)count_id
(FK): 关联盘点单IDlocation_id
(FK): 储位IDsku_id
(FK): 商品IDowner_id
(FK): 货主IDbatch_number
(可选): 批次号production_date
(可选): 生产日期expiry_date
(可选): 失效日期serial_number
(可选): 序列号inventory_status
: 库存状态system_quantity
: 系统账面数量 (盘点时冻结的数量)counted_quantity
: 实际盘点数量difference
: 差异 =counted_quantity
-system_quantity
counted_by
(FK, 可选): 盘点人counted_time
(可选): 盘点时间is_recounted
(可选): 是否复盘recounted_quantity
(可选): 复盘数量recounted_by
(可选): 复盘人recounted_time
(可选): 复盘时间adjustment_id
(FK, 可选): 关联的库存调整单ID (盘点差异生成调整单)
基础数据与系统管理
user
(用户表)user_id
(PK)username
: 用户名 (登录名)password_hash
: 密码哈希值real_name
: 真实姓名role_id
(FK): 角色ID (外键到role
)warehouse_id
(FK, 可选): 默认仓库IDcontact_phone
: 联系电话status
: 状态 (启用/禁用)last_login
: 最后登录时间- … (其他用户信息)
role
(角色表)role_id
(PK)role_name
: 角色名称 (如:系统管理员、仓库经理、仓管员、拣货员、收货员、质检员)description
: 描述
permission
(权限表)permission_id
(PK)permission_code
: 权限编码 (唯一标识一个操作或资源, 如wms:inventory:view
,wms:order:create
)name
: 权限名称description
: 描述
role_permission
(角色权限关联表)role_id
(FK)permission_id
(FK)- (联合主键)
system_config
(系统配置表)config_id
(PK)config_key
: 配置项键 (唯一, 如inventory.fifo.enabled
,putaway.strategy
)config_value
: 配置项值description
: 描述is_enabled
: 是否启用
关键点说明:
inventory
表是核心: 它精确记录了哪个货主的哪个SKU的哪个批次/序列号的多少数量,在哪个状态(良品/残品等),具体存放在哪个储位上。唯一约束是设计的精髓。inventory_transaction
表是审计追踪的核心: 所有引起库存变化的操作都必须记录在此,确保数据的可追溯性。它是inventory
表变化的流水账。- 货主 (
owner_id
) 贯穿始终: 所有关键表(sku
,inventory
,asn
,order
,transaction
等)都应有owner_id
字段,这是支持多货主共用一个WMS的基础。 - 批次/序列号管理: 通过
sku.is_batch_managed
,sku.is_serialized
控制是否启用,并在inventory
,inventory_transaction
,asn_detail
,order_detail
,count_detail
等表中记录具体的批次号或序列号。序列号在inventory
表中通常是唯一的。 - 任务驱动: 上架 (
putaway_task
)、拣货 (picking_task
)、移库 (move_task
) 等操作通常通过任务单来管理和追踪执行过程。 - 状态管理: 几乎所有业务单据 (
asn
,order
,count
,task
) 和储位 (location
) 都有状态字段,用于控制业务流程和资源可用性。 - 权限控制: 通过
user
->role
->role_permission
->permission
实现细粒度的功能权限控制。 - 性能优化:
- 高频查询表 (
inventory
,location
) 需要精心设计索引 (如location_id
,sku_id
,owner_id
,status
,batch_number
,expiry_date
)。 - 考虑对
inventory_transaction
等增长非常快的表进行分区 (如按时间分区)。 - 适当冗余常用字段 (如
inventory.available_quantity
,location.current_volume
) 以避免频繁计算。 - 使用乐观锁 (
inventory.version
) 处理高并发库存扣减。
- 高频查询表 (
- 扩展性:
- 表结构设计考虑未来可能的扩展字段。
- 使用类型字段 (
type
) 区分不同类别(仓库类型、库区类型、储位类型、订单类型、事务类型等)。 - 预留自定义字段接口(或使用单独的
entity_attribute
表)满足特定业务需求。
ER图 (简化版概念模型):
+---------------+ 1 +----------+ * +--------------+
| Owner |------------<| SKU |>-------------| Category |
+---------------+ +----------+ +--------------+
| 1 ^
| | |
| * 1
| | |
| +---------------+ * +----------------+ |
| | ASN |<------| ASN_Detail | |
| +---------------+ 1 +----------------+ |
| | | |
| 1 * |
| | | |
| V | |
| +---------------+ +-------+ |
| | Putaway_Task |<>----| P_Det | |
| +---------------+ +-------+ |
| | | |
| 1 * |
| | | |
V V | |
+---------------+ * +-------------+ | +----------+ |
| Warehouse |<------| Zone |<------| Location | |
+---------------+ 1 +-------------+ * +----------+ |
| | 1 | |
| 1| | | |
| | | * |
| V | | |
| +-------------------+ 1 | | |
| | Inventory |<---------+ | |
| +-------------------+ | |
| | | |
| * | |
| | | |
| +------------------+ | |
| | Inv_Transaction | | |
| +------------------+ | |
| 1 | |
| | | |
| * | |
| | | |
| +---------+ | |
| | Order |<>-----------------+ |
| +---------+ 1 |
| | |
| * |
| | |
| +--------------+ |
| | Order_Detail| |
| +--------------+ |
| | |
| * |
| | |
| +---------------+ |
| | Picking_Task |<>-------+ |
| +---------------+ | |
| | | |
| 1| | |
| | | |
| +---------------+ | |
| | Picking_Detail|---------+ (FK to Inventory)
| +---------------+ |
| |
+--------------------------------------+
重要提示:
- 这只是一个基础框架。 实际项目需要根据具体业务需求深入设计每个字段的数据类型、长度、约束、默认值、索引等。
- 考虑查询需求。 设计时要思考最常见的查询场景是什么,如何优化这些查询。
- 安全性。 数据库访问权限控制至关重要。
- 备份与恢复。 必须有完善的数据库备份和恢复策略。
- 文档化。 详细的数据库设计文档是必不可少的。
这个设计提供了一个坚实的起点,你可以在此基础上进行细化、调整和扩展,以满足特定仓库的独特需求。
1️⃣ 参考 1
好的,设计一个WMS(仓库管理系统)的数据库表结构是一个复杂但关键的任务,因为它需要精确地建模仓库的物理布局、物料流动、库存状态和操作流程。核心在于准确性、实时性、可追溯性和效率。
以下是一个核心且通用的WMS数据库表结构设计,涵盖了主要功能模块。实际设计中,需要根据具体业务需求(如行业特性:电商、制造业、冷链、医药;仓库类型:平面仓、立体仓、自动化仓;业务流程等)进行调整和扩展。
核心设计原则:
- 数据原子性: 每个表只负责一个核心实体(如物料、库位、订单)。
- 关系清晰: 通过外键明确表之间的关联(如库存属于哪个物料、在哪个库位)。
- 状态跟踪: 关键实体(库存、任务、订单)需要有状态字段,记录生命周期。
- 事务完整性: 关键操作(入库、出库、移位)需要事务保证数据一致性。
- 可扩展性: 考虑预留字段或设计可扩展的结构(如JSON字段存储动态属性)。
- 审计追踪: 记录关键数据的变化(创建人、创建时间、修改人、修改时间)。
- 唯一标识: 使用主键(自增ID或UUID)和业务唯一键(如物料编码、库位编码)结合。
一、 基础主数据 (Master Data)
物料表 (
item
) - 核心item_id
(PK): 主键 (自增ID 或 UUID)sku
(UQ): 物料编码/商品编码/SKU (唯一) - 核心业务标识name
: 物料名称description
: 物料描述specification
: 规格型号barcode
: 主条码 (可多个用分隔符,或单独条码表)category_id
(FK): 外键,关联物料分类表uom_id
(FK): 外键,关联计量单位表 (个、箱、千克、米等)length
,width
,height
,weight
,volume
: 长宽高重体 (用于库位匹配和运输计算)is_active
: 是否启用is_serialized
: 是否序列号管理 (重要!)is_batch_tracked
: 是否批次管理 (重要!)shelf_life_days
: 保质期天数 (可选)storage_condition
: 存储条件 (常温、冷藏、冷冻等)custom_fields
(JSON): 自定义扩展属性created_by
,created_at
,updated_by
,updated_at
: 审计字段
物料分类表 (
item_category
)category_id
(PK)parent_category_id
(FK): 父分类ID (实现树形结构)category_code
(UQ): 分类编码category_name
: 分类名称description
: 描述
计量单位表 (
unit_of_measure - uom
)uom_id
(PK)uom_code
(UQ): 单位代码 (如 ‘EA’, ‘BOX’, ‘KG’, ‘M’)uom_name
: 单位名称 (如 ‘个’, ‘箱’, ‘千克’, ‘米’)uom_type
: 单位类型 (基本单位、包装单位等)
仓库表 (
warehouse
)warehouse_id
(PK)warehouse_code
(UQ): 仓库代码 (如 ‘WH01’)warehouse_name
: 仓库名称location
: 仓库地址contact_person
: 联系人contact_phone
: 联系电话is_active
: 是否启用description
: 描述
库区表 (
zone
)zone_id
(PK)warehouse_id
(FK): 所属仓库zone_code
(UQ): 库区代码 (如 ‘ZONE-A’) - 在仓库内唯一zone_name
: 库区名称 (如 ‘收货区’, ‘存储区’, ‘拣货区’, ‘发货区’, ‘退货区’, ‘不良品区’)zone_type
: 库区类型 (收货、存储、拣选、发货、暂存、质检等)description
: 描述pick_sequence
: 拣货路径顺序 (优化用)
库位表 (
location
) - 核心location_id
(PK)zone_id
(FK): 所属库区location_code
(UQ): 库位编码 (唯一) (如 ‘A-01-01-01’ 表示 区-排-列-层)location_type
: 库位类型 (地面堆码、货架位、托盘位、流利架位、自动化立库位等)max_volume
: 最大可容纳体积max_weight
: 最大承重length
,width
,height
: 库位物理尺寸x_coord
,y_coord
,z_coord
: 库位坐标 (用于路径计算,可选)is_pickable
: 是否可拣货 (拣货位)is_storable
: 是否可存储 (存储位)is_active
: 是否启用current_volume
,current_weight
: 当前占用体积/重量 (冗余,需维护)location_group
: 库位分组 (用于波次拣货或优化)
供应商表 (
supplier
)supplier_id
(PK)supplier_code
(UQ): 供应商代码supplier_name
: 供应商名称contact_info
: 联系方式address
: 地址is_active
: 是否启用
客户表 (
customer
)customer_id
(PK)customer_code
(UQ): 客户代码customer_name
: 客户名称contact_info
: 联系方式address
: 地址is_active
: 是否启用
承运商表 (
carrier
)carrier_id
(PK)carrier_code
(UQ): 承运商代码carrier_name
: 承运商名称contact_info
: 联系方式service_type
: 服务类型 (快递、零担、整车等)
用户/员工表 (
user
)user_id
(PK)username
(UQ): 登录用户名password_hash
: 密码哈希real_name
: 真实姓名role_id
(FK): 外键,关联角色表 (用于权限控制)warehouse_id
(FK): 默认所属仓库 (可选)is_active
: 是否启用last_login
: 最后登录时间
角色权限表 (
role
,permission
,role_permission
)- 这是一个标准RBAC模型,包含角色表、权限点表、角色权限关联表。控制用户能访问哪些菜单、执行哪些操作(创建入库单、确认出库、盘点等)。
二、 库存核心表 (Inventory Core)
库存表 (
inventory
) - 最核心inventory_id
(PK)location_id
(FK): 所在库位 - 核心关联item_id
(FK): 物料ID - 核心关联quantity
: 当前可用数量 (正数)quantity_locked
: 锁定数量 (已分配未出库、待质检等状态)quantity_damaged
: 不良品数量 (可选,或单独不良品库存表)quantity_in_transit
: 在途数量 (可选,用于更精确的ATP计算)batch_number
: 批次号 (如果物料启用批次管理)serial_number
: 序列号 (如果物料启用序列号管理且按件管理,通常序列号会单独管理)production_date
: 生产日期 (批次相关)expiration_date
: 过期日期 (批次/保质期相关)inventory_status
: 库存状态 (可用、冻结、质检中、待报废等) - 极其重要last_count_date
: 最后盘点日期last_receipt_date
: 最后收货日期last_issue_date
: 最后发货日期custom_fields
(JSON): 扩展属性 (如客户所属、项目号)created_at
,updated_at
: 时间戳关键索引:
(location_id, item_id, batch_number, inventory_status)
,(item_id, batch_number, expiration_date)
,(serial_number)
(如果在此表)重要设计点:
- 通常序列号管理需要单独的表 (
inventory_serial
),包含serial_id
,inventory_id
(FK),serial_number
(UQ),status
。库存表里的serial_number
字段可能只用于记录一个主序列号或改为标志位。 - 批次属性:如果批次属性复杂(如多个生产日期、供应商批号),可能需要单独的
batch
表,库存表关联batch_id
。
- 通常序列号管理需要单独的表 (
库存事务表 (
inventory_transaction
) - 核心流水transaction_id
(PK)transaction_type
: 事务类型 (入库、出库、移库、调整、盘点调整、库存状态转换、冻结/解冻等) - 关键item_id
(FK): 物料IDfrom_location_id
(FK): 来源库位 (移库、出库)to_location_id
(FK): 目标库位 (移库、入库)quantity
: 事务数量 (正负表示增减方向)batch_number
: 批次号 (相关时)serial_number
: 序列号 (相关时,或关联序列号事务表)reference_id
: 关联单据ID (如receipt_id
,shipment_id
,move_order_id
,adjustment_id
,count_id
) - 关键,用于溯源reference_type
: 关联单据类型 (如 ‘RECEIPT’, ‘SHIPMENT’, ‘MOVE’, ‘ADJUST’, ‘COUNT’) - 与reference_id
配合使用transaction_time
: 事务发生时间transacted_by
: 操作人 (用户ID)notes
: 备注关键索引:
(item_id)
,(location_id)
,(reference_type, reference_id)
,(transaction_time)
,(batch_number)
,(serial_number)
设计点: 这是库存变化的完整流水账,是库存对账和追溯的基石。所有改变库存数量或状态的操作都必须记录在此。
三、 入库管理 (Receiving)
入库单表 (
receiving_order
/asn - advance shipment notice
)receipt_id
(PK)receipt_number
(UQ): 入库单号receipt_type
: 入库类型 (采购入库、生产入库、退货入库、调拨入库等)supplier_id
(FK): 供应商ID (采购/退货入库)customer_id
(FK): 客户ID (退货入库)expected_arrival_date
: 预计到货日期actual_arrival_date
: 实际到货日期warehouse_id
(FK): 目标仓库status
: 状态 (创建、在途、部分收货、已收货、已上架、已关闭、已取消)reference_number
: 外部参考单号 (如采购订单号PO)notes
: 备注created_by
,created_at
,updated_by
,updated_at
入库单明细表 (
receiving_order_line
)line_id
(PK)receipt_id
(FK): 关联入库单line_number
: 行号item_id
(FK): 物料IDexpected_quantity
: 预期数量received_quantity
: 已收数量 (累计)putaway_quantity
: 已上架数量 (累计)uom_id
(FK): 单位batch_number
: 预期批次 (可选)notes
: 行备注
收货任务表 (
receiving_task
)task_id
(PK)receipt_id
(FK): 关联入库单line_id
(FK): 关联入库单明细 (可选,任务可能按行也可能按单)item_id
(FK): 物料IDquantity_to_receive
: 待收数量quantity_received
: 已收数量status
: 任务状态 (待执行、执行中、已完成、已取消)assigned_to
: 分配给的员工 (用户ID)start_time
,complete_time
: 开始/完成时间location_id
(FK): 临时收货库位 (如收货暂存区)
上架单/任务表 (
putaway_order
/putaway_task
)putaway_id
(PK)type
: 类型 (入库上架、补货上架、移库上架)source_reference_id
: 来源单据ID (如receipt_id
,replenishment_id
,move_task_id
)source_reference_type
: 来源单据类型 (‘RECEIPT’, ‘REPLENISH’, ‘MOVE’)source_location_id
(FK): 来源库位 (收货暂存区、拣货位)item_id
(FK): 物料IDbatch_number
: 批次号 (相关时)quantity_to_putaway
: 待上架数量quantity_putaway
: 已上架数量suggested_location_id
(FK): 系统推荐的目标库位actual_location_id
(FK): 实际上架的目标库位status
: 状态 (待分配、已分配、执行中、已完成、已取消)assigned_to
: 分配给的员工priority
: 优先级created_at
,start_time
,complete_time
四、 出库管理 (Shipping / Picking)
出库单/发货单 (
shipment_order
)shipment_id
(PK)shipment_number
(UQ): 发货单号shipment_type
: 发货类型 (销售出库、退货出库、调拨出库、领料出库等)customer_id
(FK): 客户ID (销售出库)warehouse_id
(FK): 发货仓库carrier_id
(FK): 承运商IDtracking_number
: 物流追踪号expected_ship_date
: 预计发货日期actual_ship_date
: 实际发货日期status
: 状态 (创建、部分分配、已分配、部分拣货、已拣货、部分打包、已打包、部分发货、已发货、已关闭、已取消)reference_number
: 外部参考单号 (如销售订单号SO)notes
: 备注created_by
,created_at
,updated_by
,updated_at
出库单明细表 (
shipment_order_line
)line_id
(PK)shipment_id
(FK): 关联发货单line_number
: 行号item_id
(FK): 物料IDordered_quantity
: 订单需求数量allocated_quantity
: 已分配数量 (锁定库存)picked_quantity
: 已拣数量 (累计)packed_quantity
: 已打包数量 (累计)shipped_quantity
: 已发货数量 (累计)uom_id
(FK): 单位batch_requirement
: 批次要求 (可选)notes
: 行备注
波次表 (
wave
)wave_id
(PK)wave_number
(UQ): 波次号wave_type
: 波次类型 (按单、按客户、按路线、紧急)status
: 状态 (创建、计划中、已释放、部分完成、已完成、已关闭)release_time
: 释放时间 (开始执行)planned_completion_time
: 计划完成时间created_by
,created_at
波次明细表 (
wave_line
)wave_line_id
(PK)wave_id
(FK): 关联波次shipment_line_id
(FK): 关联发货单明细行quantity_to_pick
: 该波次需要拣货的数量 (可能小于行需求总量)status
: 状态 (待拣、已拣)
拣货任务表 (
picking_task
)pick_task_id
(PK)wave_id
(FK): 关联波次 (可选,可能有直接按单拣货)shipment_line_id
(FK): 关联发货单明细行item_id
(FK): 物料IDbatch_number
: 指定批次 (如果波次或行指定)quantity_to_pick
: 需拣数量quantity_picked
: 已拣数量from_location_id
(FK): 来源拣货库位to_container_id
(FK): 目标容器 (拣货车、周转箱) - 关联容器表status
: 状态 (待分配、已分配、执行中、已完成、已取消)assigned_to
: 分配给的员工priority
: 优先级sequence
: 在拣货路径中的顺序start_time
,complete_time
容器表 (
container
)container_id
(PK)container_code
(UQ): 容器编码 (周转箱号、托盘号、小车号)container_type
: 容器类型 (纸箱、托盘、料箱、手推车)current_location_id
(FK): 当前位置current_operator_id
(FK): 当前操作员 (谁推着车)status
: 状态 (空闲、拣货中、打包中、待发运)associated_shipment_id
(FK): 关联的发货单 (打包后)
打包表 (
packing
)pack_id
(PK)shipment_id
(FK): 关联发货单container_id
(FK): 关联容器 (打包后的箱子/托盘)packed_by
: 打包人packed_at
: 打包时间weight
: 包裹重量 (实际称重)dimensions
: 包裹尺寸notes
: 打包备注
发货任务表 (
shipping_task
)task_id
(PK)shipment_id
(FK): 关联发货单container_id
(FK): 关联容器/包裹from_location_id
(FK): 来源库位 (发货暂存区)to_dock_id
(FK): 目标月台 (关联库位表或单独月台表)status
: 状态 (待发运、装车中、已发运)assigned_to
: 分配给的员工/司机shipped_at
: 实际发运时间
五、 库内管理 (Warehouse Internal Operations)
移库单/任务表 (
move_order
/move_task
)move_id
(PK)move_type
: 移库类型 (库位调整、补货上架、盘点移位、整理移库)reason
: 移库原因from_location_id
(FK): 来源库位to_location_id
(FK): 目标库位item_id
(FK): 物料IDbatch_number
: 批次号quantity_to_move
: 需移动数量quantity_moved
: 已移动数量status
: 状态 (创建、已分配、执行中、已完成、已取消)assigned_to
: 分配给的员工priority
: 优先级created_at
,start_time
,complete_time
补货单/任务表 (
replenishment_order
/replenishment_task
)replen_id
(PK)replen_type
: 补货类型 (从存储位到拣货位、按需补货、预警补货)source_location_id
(FK): 来源库位 (存储位)target_location_id
(FK): 目标库位 (拣货位)item_id
(FK): 物料IDbatch_number
: 批次号quantity_to_replen
: 需补货数量quantity_replenished
: 已补货数量status
: 状态 (创建、已分配、执行中、已完成、已取消)triggered_by
: 触发来源 (如拣货缺货触发、最低库存触发)trigger_reference_id
: 触发来源单据ID (如pick_task_id
)assigned_to
: 分配给的员工priority
: 优先级 (通常较高)created_at
,start_time
,complete_time
盘点单表 (
cycle_count
/stock_take
)count_id
(PK)count_number
(UQ): 盘点单号count_type
: 盘点类型 (明盘、盲盘、动碰盘点、周期盘点、全盘)warehouse_id
(FK): 仓库zone_id
(FK): 库区 (可选)start_date
,end_date
: 计划开始/结束日期actual_start_date
,actual_end_date
: 实际开始/结束日期status
: 状态 (计划中、执行中、待审核、已完成、已取消)created_by
,created_at
,approved_by
,approved_at
盘点单明细表 (
cycle_count_line
)count_line_id
(PK)count_id
(FK): 关联盘点单location_id
(FK): 库位item_id
(FK): 物料ID (明盘时已知)batch_number
: 批次号 (明盘时已知)system_quantity
: 系统库存数量 (盘点时刻快照)counted_quantity
: 盘点数量 (人工/设备录入)counted_by
: 盘点人counted_at
: 盘点时间variance_quantity
: 差异数量 (counted_quantity - system_quantity
)adjusted_quantity
: 调整数量 (经审核确认的调整量)adjustment_reason
: 调整原因status
: 行状态 (待盘点、已盘点、待审核、已调整)
六、 报表与审计 (Reporting & Auditing)
- 操作日志表 (
operation_log
)log_id
(PK)log_time
: 操作时间user_id
(FK): 操作用户module
: 操作模块 (入库、出库、库存、基础数据等)operation
: 具体操作 (创建入库单、确认收货、分配库存、拣货完成、修改物料等)object_type
: 操作对象类型 (如 ‘RECEIPT’, ‘ITEM’, ‘INVENTORY’)object_id
: 操作对象ID (如具体的receipt_id
,item_id
)details_before
(JSON/TEXT): 操作前详情 (可选,用于关键数据修改审计)details_after
(JSON/TEXT): 操作后详情 (可选)ip_address
: 操作IPnotes
: 备注
关键关系与流程示意
- 入库流程:
receiving_order
->receiving_order_line
->receiving_task
(收货) ->inventory_transaction
(增加收货暂存区库存)putaway_task
(上架) ->inventory_transaction
(减少收货暂存区库存,增加目标库位库存)
- 出库流程:
shipment_order
->shipment_order_line
(分配库存:更新inventory.quantity_locked
)wave
(可选) ->wave_line
->picking_task
(拣货) ->inventory_transaction
(减少拣货位库存,可能先到容器)packing
(打包) ->shipping_task
(发货) ->inventory_transaction
(最终减少库存 - 如果打包时未减)
- 库存移动:
move_task
->inventory_transaction
(减少源库位库存,增加目标库位库存)
- 补货:
replenishment_task
->inventory_transaction
(减少存储位库存,增加拣货位库存) -> 可能触发新的putaway_task
逻辑
- 盘点:
cycle_count
->cycle_count_line
(记录盘点数) -> 审核确认差异 -> 生成inventory_adjustment
(库存调整单) ->inventory_transaction
(调整库存)
重要设计考虑
- 库存快照 vs 实时计算: 核心库存 (
inventory
) 表是实时状态,但复杂报表可能需要定期快照 (inventory_snapshot
)。 - 序列号深度管理: 如果需要详细跟踪序列号的生命周期(收货、入库、移库、关联订单、出库、维修、报废),需要更强大的序列号跟踪表 (
item_serial_tracking
),关联各种事务单据。 - 批次属性扩展: 如果批次属性复杂且需要查询,单独
batch
表 (batch_id
,item_id
,supplier_batch
,manufacture_date
,expiry_date
,custom_attrs...
)。 - 容器管理: 在自动化程度高的仓库,容器 (
container
) 的管理及其内部库存 (container_content
) 非常重要。 - 路径优化: 库位坐标 (
x, y, z
) 和库位分组 (location_group
) 用于计算最优拣货路径。 - 并发控制与锁: 库存分配、拣货确认等操作需要数据库事务和乐观锁/悲观锁机制保证在高并发下数据准确。
- 性能: 对高频操作的表 (
inventory
,inventory_transaction
,task
表) 建立合适的索引至关重要。考虑分区表(如按时间分区事务表)。 - 扩展性: 使用 JSON 字段 (
custom_fields
) 存储非核心的动态属性。考虑微服务架构拆分不同领域(基础数据、库存、订单执行)。 - 多租户: 如果服务于多个客户(货主),需要在几乎所有核心表 (
item
,inventory
,order
等) 增加tenant_id
或owner_id
字段。
总结
这个设计提供了一个全面的WMS数据库表结构蓝图。实际实施时,必须深入理解具体业务需求、流程规则和性能要求,在此基础上进行裁剪、细化、优化。数据库设计是WMS成功实施的基石,需要谨慎规划和反复验证。在开发过程中,ER图工具 (如MySQL Workbench, Lucidchart, DbSchema) 对于可视化和沟通表结构非常有帮助。
2️⃣ 参考 2
设计一个完善的WMS(仓库管理系统)数据库是系统高效稳定运行的核心。下面是一个核心模块的表结构设计,涵盖了仓库管理的主要业务场景。设计遵循关系型数据库(如MySQL, PostgreSQL, SQL Server)的范式要求,并考虑了扩展性和性能。
核心设计原则:
- 模块化: 按业务功能划分模块。
- 规范化: 尽量减少数据冗余(达到3NF或BCNF)。
- 可扩展性: 预留字段,使用外键关联,考虑未来业务变化。
- 性能: 合理设计索引(主键、外键、频繁查询字段),考虑分区/分表(大数据量时)。
- 数据完整性: 使用约束(主键、外键、唯一键、非空、检查约束)。
- 审计性: 关键操作记录操作人和时间。
- 灵活性: 使用状态码、类型码表管理枚举值,方便扩展。
核心模块与表设计:
1. 基础数据模块
- 1.1 仓库表 (
warehouse
)warehouse_id
(PK): 主键,仓库唯一标识warehouse_code
: 仓库编码 (唯一)warehouse_name
: 仓库名称address
: 仓库地址contact_person
: 联系人contact_phone
: 联系电话status
(FK ->status_codes
): 状态 (启用、停用、盘点中…) - 关联状态码表description
: 描述created_by
: 创建人created_time
: 创建时间modified_by
: 修改人modified_time
: 修改时间
- 1.2 库区表 (
zone
)zone_id
(PK): 主键,库区唯一标识warehouse_id
(FK ->warehouse
): 所属仓库IDzone_code
: 库区编码 (仓库内唯一)zone_name
: 库区名称zone_type
(FK ->zone_type_codes
): 库区类型 (收货区、存储区、拣货区、发货区、不良品区、退货区…) - 关联库区类型码表status
(FK ->status_codes
): 状态temperature_zone
: 温区要求 (常温、冷藏、冷冻、恒温)description
: 描述created_by
,created_time
,modified_by
,modified_time
- 1.3 货架/库位表 (
location
)location_id
(PK): 主键,库位唯一标识 (最小存储单元)zone_id
(FK ->zone
): 所属库区IDlocation_code
: 库位编码 (建议全局唯一,常用层级编码如A-01-01-01
)location_type
(FK ->location_type_codes
): 库位类型 (地面堆垛、货架位、托盘位、流利架位…) - 关联库位类型码表status
(FK ->status_codes
): 状态 (空闲、占用、锁定、盘点中…)x_coordinate
,y_coordinate
,z_coordinate
: 坐标 (可选,用于可视化或路径规划)max_volume
: 最大体积容量max_weight
: 最大承重max_quantity
: 最大数量容量 (可选)is_pick_location
: 是否是拣货位 (True/False)is_staging_location
: 是否是暂存位 (True/False)description
: 描述created_by
,created_time
,modified_by
,modified_time
- 1.4 物料主数据表 (
item_master
)item_id
(PK): 主键,物料唯一标识 (企业内部)item_code
: 物料编码 (企业唯一)item_name
: 物料名称item_specification
: 规格型号unit_of_measure
(FK ->uom_codes
): 基本计量单位 (个、箱、千克、米…) - 关联单位码表item_category_id
(FK ->item_category
): 物料分类IDlength
,width
,height
: 尺寸 (计算体积用)weight
: 重量shelf_life
: 保质期 (天)is_serial_controlled
: 是否序列号管理 (True/False)is_lot_controlled
: 是否批次管理 (True/False)is_sensitive
(温度、湿度等): 是否特殊存储要求 (True/False)description
: 描述created_by
,created_time
,modified_by
,modified_time
- 1.5 物料供应商信息表 (
item_supplier
)item_id
(FK ->item_master
): 物料IDsupplier_id
(FK ->supplier
): 供应商ID (供应商表需单独设计)supplier_item_code
: 供应商物料编码 (同一物料不同供应商编码不同)supplier_item_name
: 供应商物料名称lead_time
: 采购提前期min_order_quantity
: 最小起订量is_preferred
: 是否首选供应商 (True/False)created_by
,created_time
,modified_by
,modified_time
- (PK:
item_id
,supplier_id
)
- 1.6 物料-库位存储策略表 (
item_location_strategy
)item_id
(FK ->item_master
): 物料IDlocation_id
(FK ->location
): 库位ID (可空,表示一类库位)zone_id
(FK ->zone
): 库区ID (可空,优先级低于location_id
)warehouse_id
(FK ->warehouse
): 仓库ID (可空,优先级最低)strategy_type
(FK ->strategy_type_codes
): 策略类型 (推荐上架位、固定拣货位、禁止存储…) - 关联策略类型码表priority
: 优先级 (数值越小优先级越高)created_by
,created_time
,modified_by
,modified_time
- (PK:
item_id
,location_id
,zone_id
,warehouse_id
,strategy_type
) - 需根据业务逻辑确定唯一约束
2. 库存管理模块
- 2.1 库存快照表 (
inventory_snapshot
)inventory_id
(PK): 主键 (可选,也可用业务主键)item_id
(FK ->item_master
): 物料IDlocation_id
(FK ->location
): 库位IDlot_number
: 批次号 (如果物料启用批次管理)serial_number
: 序列号 (如果物料启用序列号管理)quantity
: 当前数量 (必须 >=0)inventory_status
(FK ->inventory_status_codes
): 库存状态 (良品、待检、冻结、不良品…) - 关联库存状态码表production_date
: 生产日期expiration_date
: 过期日期last_transaction_id
(FK ->inventory_transaction
): 最后一次交易ID (可选,用于追踪)last_counted_time
: 最后盘点时间created_by
,created_time
,modified_by
,modified_time
- (关键业务主键/唯一索引): (
item_id
,location_id
,lot_number
,serial_number
,inventory_status
) - 精确标识一笔特定库存
- 2.2 库存事务表 (
inventory_transaction
)transaction_id
(PK): 主键,事务唯一标识transaction_type
(FK ->transaction_type_codes
): 事务类型 (入库、出库、移库、调整、盘点…) - 关联事务类型码表transaction_time
: 事务发生时间item_id
(FK ->item_master
): 物料IDfrom_location_id
(FK ->location
): 源库位ID (可空,如入库)to_location_id
(FK ->location
): 目标库位ID (可空,如出库)lot_number
: 批次号serial_number
: 序列号quantity
: 交易数量 (正数表示增加,负数表示减少)inventory_status
(FK ->inventory_status_codes
): 交易涉及的库存状态related_order_type
(FK ->order_type_codes
): 关联单据类型 (采购单、销售单、调拨单、盘点单…) - 关联单据类型码表related_order_id
: 关联单据ID (如采购单号、销售单号、盘点单号)related_order_line_id
: 关联单据行ID (可选)operator
: 操作员description
: 描述/备注created_by
,created_time
(通常等同于operator
和transaction_time
)- (重要索引):
transaction_time
,item_id
,related_order_type
,related_order_id
3. 入库管理模块
- 3.1 入库预约单表 (
asn
- Advanced Shipping Notice)asn_id
(PK): 主键asn_number
: 入库预约单号 (唯一)supplier_id
(FK ->supplier
): 供应商IDpurchase_order_id
: 关联采购订单ID (外系统关联)expected_arrival_time
: 预计到货时间carrier
: 承运商tracking_number
: 运单号status
(FK ->asn_status_codes
): 状态 (新建、部分收货、完成收货、取消…) - 关联预约单状态码表created_by
,created_time
,modified_by
,modified_time
- 3.2 入库预约单明细表 (
asn_detail
)asn_detail_id
(PK): 主键asn_id
(FK ->asn
): 关联预约单IDline_number
: 行号item_id
(FK ->item_master
): 物料IDexpected_quantity
: 预约数量received_quantity
: 已收货数量 (初始0)unit
: 单位created_by
,created_time
- 3.3 收货单/入库单表 (
receiving_order
)receiving_id
(PK): 主键receiving_number
: 收货单号 (唯一)asn_id
(FK ->asn
): 关联预约单ID (可为空,如非预约入库)receiving_time
: 实际收货时间operator
: 收货操作员status
(FK ->receiving_status_codes
): 状态 (收货中、待质检、质检中、部分上架、已完成、取消…) - 关联收货单状态码表created_by
,created_time
,modified_by
,modified_time
- 3.4 收货单明细表 (
receiving_detail
)receiving_detail_id
(PK): 主键receiving_id
(FK ->receiving_order
): 关联收货单IDline_number
: 行号item_id
(FK ->item_master
): 物料IDlot_number
: 实际收货批次 (如供应商提供)serial_number
: 序列号 (逐个扫描时)received_quantity
: 本次收货数量inventory_status
(FK ->inventory_status_codes
): 收货后初始库存状态 (通常为"待检")qc_status
(FK ->qc_status_codes
): 质检状态 (待检、合格、不合格、让步接收…) - 关联质检状态码表qc_by
: 质检员qc_time
: 质检时间created_by
,created_time
- 3.5 上架任务表 (
putaway_task
)task_id
(PK): 主键task_number
: 上架任务单号task_type
(FK ->task_type_codes
): 任务类型 (收货上架、移库上架、退货上架…) - 关联任务类型码表related_id
: 关联单据ID (如receiving_detail_id
,inventory_transaction_id
)item_id
(FK ->item_master
): 物料IDquantity_to_putaway
: 待上架数量from_location_id
(FK ->location
): 来源库位 (通常是收货暂存区或质检区)suggested_location_id
(FK ->location
): 系统推荐库位actual_location_id
(FK ->location
): 实际上架库位operator
: 操作员start_time
: 任务开始时间complete_time
: 任务完成时间status
(FK ->task_status_codes
): 状态 (待分配、已分配、执行中、已完成、取消…) - 关联任务状态码表created_by
,created_time
,modified_by
,modified_time
4. 出库管理模块
- 4.1 出库订单表 (
outbound_order
)order_id
(PK): 主键order_number
: 出库单号 (唯一,通常关联销售订单或调拨申请单)order_type
(FK ->order_type_codes
): 订单类型 (销售出库、调拨出库、退货出库、领料出库…) - 关联订单类型码表customer_id
(FK ->customer
): 客户ID (外系统关联)priority
: 优先级 (高、中、低)required_ship_date
: 要求发货日期status
(FK ->outbound_order_status_codes
): 状态 (新建、部分分配、已分配、部分拣货、已拣货、部分发货、已发货、完成、取消…) - 关联出库单状态码表wave_id
(FK ->wave
): 关联波次ID (可空)created_by
,created_time
,modified_by
,modified_time
- 4.2 出库订单明细表 (
outbound_order_detail
)order_detail_id
(PK): 主键order_id
(FK ->outbound_order
): 关联出库单IDline_number
: 行号item_id
(FK ->item_master
): 物料IDordered_quantity
: 订单需求数量allocated_quantity
: 已分配库存数量picked_quantity
: 已拣货数量packed_quantity
: 已打包数量shipped_quantity
: 已发货数量unit
: 单位created_by
,created_time
- 4.3 波次表 (
wave
)wave_id
(PK): 主键wave_number
: 波次号 (唯一)wave_type
(FK ->wave_type_codes
): 波次策略类型 (按订单、按路线、按品类…) - 关联波次类型码表status
(FK ->wave_status_codes
): 状态 (新建、已计划、已释放、执行中、完成、取消…) - 关联波次状态码表release_time
: 波次释放时间completed_time
: 波次完成时间created_by
,created_time
,modified_by
,modified_time
- 4.4 波次明细表 (
wave_detail
)wave_detail_id
(PK): 主键wave_id
(FK ->wave
): 关联波次IDorder_id
(FK ->outbound_order
): 关联出库单IDcreated_by
,created_time
- 4.5 拣货任务表 (
picking_task
)task_id
(PK): 主键task_number
: 拣货任务单号wave_id
(FK ->wave
): 关联波次ID (可空,非波次拣货)order_id
(FK ->outbound_order
): 关联出库单ID (如果按单拣货)item_id
(FK ->item_master
): 物料IDlocation_id
(FK ->location
): 拣货库位IDlot_number
: 批次号 (如果指定)quantity_to_pick
: 需拣货数量picked_quantity
: 已拣货数量operator
: 拣货操作员start_time
: 任务开始时间complete_time
: 任务完成时间status
(FK ->task_status_codes
): 状态 (同putaway_task
)picking_method
(FK ->picking_method_codes
): 拣货方式 (摘果、播种…) - 关联拣货方法码表to_staging_location_id
(FK ->location
): 目标暂存库位IDcreated_by
,created_time
,modified_by
,modified_time
- 4.6 复核打包表 (
packing
)packing_id
(PK): 主键packing_number
: 复核/打包单号order_id
(FK ->outbound_order
): 关联出库单IDoperator
: 操作员packing_time
: 打包时间carton_id
: 箱号/容器号weight
: 包裹重量volume
: 包裹体积shipping_carrier
: 物流承运商tracking_number
: 物流运单号status
(FK ->packing_status_codes
): 状态 (待复核、已复核、已打包、已称重…) - 关联打包状态码表created_by
,created_time
,modified_by
,modified_time
- 4.7 发货单表 (
shipping_order
)shipping_id
(PK): 主键shipping_number
: 发货单号order_id
(FK ->outbound_order
): 关联出库单IDshipping_time
: 实际发货时间operator
: 发货操作员carrier
: 最终承运商tracking_number
: 最终运单号vehicle_number
: 车牌号driver
: 司机姓名status
(FK ->shipping_status_codes
): 状态 (已发货、在途、签收…) - 关联发货状态码表created_by
,created_time
,modified_by
,modified_time
5. 库内管理模块
- 5.1 移库任务表 (
movement_task
)task_id
(PK): 主键task_number
: 移库任务单号task_type
(FK ->task_type_codes
): 任务类型 (库存转移、补货…) - 关联任务类型码表item_id
(FK ->item_master
): 物料IDfrom_location_id
(FK ->location
): 源库位IDto_location_id
(FK ->location
): 目标库位IDlot_number
: 批次号serial_number
: 序列号quantity_to_move
: 需移动数量moved_quantity
: 已移动数量operator
: 操作员start_time
: 任务开始时间complete_time
: 任务完成时间status
(FK ->task_status_codes
): 状态 (同putaway_task
,picking_task
)reason
: 移库原因 (整理库位、补货、调整存储策略…)created_by
,created_time
,modified_by
,modified_time
- 5.2 补货任务表 (
replenishment_task
)- (结构基本同
movement_task
,但task_type
固定为补货。可能增加触发条件字段trigger_reason
(如拣货位低于安全库存)) task_id
(PK)- … (参考
movement_task
) trigger_reason
(FK ->replenishment_trigger_codes
): 补货触发原因 (安全库存、固定补货点、订单触发…) - 关联补货触发码表
- (结构基本同
- 5.3 盘点单表 (
cycle_count
)count_id
(PK): 主键count_number
: 盘点单号 (唯一)count_type
(FK ->count_type_codes
): 盘点类型 (明盘、暗盘、动碰盘点、循环盘点、全盘…) - 关联盘点类型码表warehouse_id
(FK ->warehouse
): 仓库IDzone_id
(FK ->zone
): 库区ID (可空)start_time
: 计划开始时间complete_time
: 实际完成时间status
(FK ->count_status_codes
): 状态 (计划中、进行中、已完成、已审核、已过账…) - 关联盘点状态码表created_by
,created_time
,modified_by
,modified_time
- 5.4 盘点单明细表 (
cycle_count_detail
)count_detail_id
(PK): 主键count_id
(FK ->cycle_count
): 关联盘点单IDlocation_id
(FK ->location
): 库位IDitem_id
(FK ->item_master
): 物料IDlot_number
: 批次号serial_number
: 序列号system_quantity
: 系统账面数量counted_quantity
: 实际盘点数量variance_quantity
: 差异数量 (counted_quantity
-system_quantity
)counted_by
: 盘点人counted_time
: 盘点时间status
(FK ->count_detail_status_codes
): 明细状态 (待盘、已盘、差异…) - 关联盘点明细状态码表created_by
,created_time
- 5.5 库存调整单表 (
inventory_adjustment
)adjustment_id
(PK): 主键adjustment_number
: 调整单号reason
(FK ->adjustment_reason_codes
): 调整原因 (盘点差异、报损、报溢…) - 关联调整原因码表status
(FK ->adjustment_status_codes
): 状态 (草稿、待审批、已审批、已过账…) - 关联调整单状态码表approved_by
: 审批人approved_time
: 审批时间created_by
,created_time
,modified_by
,modified_time
- 5.6 库存调整单明细表 (
inventory_adjustment_detail
)adjustment_detail_id
(PK): 主键adjustment_id
(FK ->inventory_adjustment
): 关联调整单IDitem_id
(FK ->item_master
): 物料IDlocation_id
(FK ->location
): 库位IDlot_number
: 批次号serial_number
: 序列号inventory_status
(FK ->inventory_status_codes
): 调整的库存状态system_quantity
: 调整前系统数量adjusted_quantity
: 调整后数量 (目标数量)variance_quantity
: 调整量 (adjusted_quantity
-system_quantity
)created_by
,created_time
6. 系统管理模块
- 6.1 用户表 (
user
)user_id
(PK): 主键username
: 用户名 (唯一)password_hash
: 密码哈希值real_name
: 真实姓名email
: 邮箱phone
: 电话status
(FK ->user_status_codes
): 状态 (启用、禁用) - 关联用户状态码表last_login_time
: 最后登录时间created_by
,created_time
,modified_by
,modified_time
- 6.2 角色表 (
role
)role_id
(PK): 主键role_name
: 角色名称 (唯一)description
: 描述created_by
,created_time
,modified_by
,modified_time
- 6.3 权限表 (
permission
)permission_id
(PK): 主键permission_code
: 权限代码 (唯一,如INVENTORY_VIEW
,RECEIVE_CREATE
)permission_name
: 权限名称module
: 所属模块 (入库、出库、库存…)description
: 描述created_by
,created_time
,modified_by
,modified_time
- 6.4 用户-角色关联表 (
user_role
)user_id
(FK ->user
)role_id
(FK ->role
)- (PK:
user_id
,role_id
)
- 6.5 角色-权限关联表 (
role_permission
)role_id
(FK ->role
)permission_id
(FK ->permission
)- (PK:
role_id
,permission_id
)
- 6.6 用户-仓库/库区权限表 (
user_warehouse_access
)user_id
(FK ->user
)warehouse_id
(FK ->warehouse
) (可空)zone_id
(FK ->zone
) (可空)access_level
(FK ->access_level_codes
): 访问级别 (查看、操作、管理) - 关联访问级别码表- (唯一约束需根据业务确定,如一个用户在一个库区只能有一种权限)
- 6.7 操作日志表 (
audit_log
)log_id
(PK): 主键user_id
(FK ->user
): 操作用户IDoperation_time
: 操作时间module
: 操作模块operation_type
(FK ->operation_type_codes
): 操作类型 (新增、修改、删除、查询、登录、登出…) - 关联操作类型码表target_object
: 操作对象 (表名)target_id
: 操作对象ID (记录主键)operation_details
: 操作详情 (修改前后的值变化,可用JSON存储)ip_address
: 操作IP地址result
: 操作结果 (成功、失败)error_message
: 错误信息 (如果失败)
7. 码表模块
status_codes
(状态码表)status_code
(PK): 状态代码 (如ACTIVE
,INACTIVE
,PENDING
,LOCKED
)status_name
: 状态名称description
: 描述category
: 类别 (通用、入库单、出库单…)
*_type_codes
(各种类型码表): 如zone_type_codes
,location_type_codes
,transaction_type_codes
,order_type_codes
,task_type_codes
,uom_codes
,inventory_status_codes
等。结构类似:type_code
(PK): 类型代码type_name
: 类型名称description
: 描述category
(可选): 分类
关键点与优化建议:
- 索引策略:
- 所有主键 (PK) 自动创建聚集索引 (Clustered Index)。
- 所有外键 (FK) 字段创建非聚集索引 (Non-Clustered Index)。
- 高频查询条件字段 (如
item_code
,location_code
,order_number
,status
,transaction_time
) 创建非聚集索引。 - 组合索引:根据实际查询SQL的WHERE条件和JOIN条件创建组合索引。
- 性能考虑:
- 库存快照 (
inventory_snapshot
): 查询极频繁。确保主键/唯一索引设计最优。考虑按仓库分区 (Partitioning)。定期归档历史数据。 - 库存事务 (
inventory_transaction
): 写入频繁且数据量增长快。考虑按时间分区。归档历史数据。 - 任务表 (
*_task
): 状态查询频繁。在status
字段上建索引。
- 库存快照 (
- 数据一致性:
- 事务(Transaction): 对库存的操作(增删改)务必放在数据库事务中,保证ACID特性。例如,创建库存事务记录和更新库存快照必须在同一事务内完成。
- 触发器(Trigger) 慎用: 尽量避免在核心表(如
inventory_snapshot
,inventory_transaction
)上使用复杂触发器,因其影响性能且难调试。业务逻辑尽量在应用层控制。
- 软删除: 考虑在重要业务表增加
is_deleted
(True/False) 和deleted_time
字段,标记删除而非物理删除,便于审计和数据恢复。 - 预留扩展字段: 在核心业务表增加若干
ext_field1
,ext_field2
(VARCHAR) 或ext_info
(JSON/TEXT) 字段,用于存储未来可能需要的非结构化信息或扩展属性。 - JSON字段的应用: 对于结构可能变化或需要存储灵活属性的地方 (如批次扩展属性、操作日志详情
operation_details
),使用数据库支持的JSON类型字段 (如PostgreSQL的jsonb
, MySQL的json
) 是一个不错的选择。 - 序列号/批次管理:
- 序列号管理 (
is_serial_controlled=True
): 库存记录和交易记录必须精确到serial_number
。serial_number
在 (item_id
,location_id
,inventory_status
) 组合下需唯一 (通常在库存快照表约束)。 - 批次管理 (
is_lot_controlled=True
): 库存记录和交易记录需记录lot_number
。lot_number
在 (item_id
,location_id
,inventory_status
) 组合下需唯一 (通常在库存快照表约束)。需关联批次属性(生产日期、失效日期等)。
- 序列号管理 (
- 并发控制: 对于高频更新的核心表(如
inventory_snapshot
),在应用层使用乐观锁(如版本号version
字段)或数据库的悲观锁机制来防止更新冲突。
总结:
以上设计提供了一个全面的WMS核心数据库表结构蓝图。实际实施时,需要根据具体的业务需求、流程、规模、性能要求和所选数据库的特性进行以下工作:
- 裁剪与调整: 并非所有表都是必需的。根据业务复杂度选择需要的模块和表。
- 字段细化: 根据具体业务规则细化字段定义、约束和默认值。
- 索引优化: 基于实际查询模式进行索引设计和调整。
- 分区策略: 对于海量数据表,设计合理的分区方案。
- 安全设计: 加强用户密码存储安全(加盐哈希)、数据传输安全(TLS)、访问控制。
- 备份与恢复策略: 制定完善的数据库备份和灾难恢复计划。
设计良好的WMS数据库是系统高效、稳定、灵活运行的基础。务必在项目初期投入足够精力进行详细设计和评审。
3️⃣ 参考 3
好的,设计一个WMS(仓库管理系统)的数据库表结构是一个复杂的过程,需要根据具体的业务需求、仓库规模、流程复杂度进行调整。以下是一个核心且相对通用的WMS数据库表设计蓝图,涵盖了主要功能模块:
核心原则:
- 标准化: 使用主键、外键确保数据完整性。
- 模块化: 清晰划分功能模块对应的表。
- 可扩展性: 考虑未来业务增长,预留扩展空间(如预留字段、使用类型表)。
- 性能: 合理设计索引(尤其是外键、常用查询字段),考虑分区(针对海量流水数据)。
- 审计性: 记录关键操作日志。
- 状态管理: 清晰定义各种单据、库存、库位的状态。
核心表结构:
1. 基础信息模块
warehouse
(仓库表)warehouse_id
(PK): 仓库唯一标识 (主键)warehouse_code
: 仓库编码 (唯一)warehouse_name
: 仓库名称location
: 仓库地理位置contact_person
: 联系人contact_phone
: 联系电话status
: 仓库状态 (启用/禁用/维护中)description
: 描述created_at
: 创建时间updated_at
: 更新时间
area
(库区表)area_id
(PK): 库区唯一标识warehouse_id
(FK): 所属仓库ID (外键 -> warehouse.warehouse_id)area_code
: 库区编码 (仓库内唯一)area_name
: 库区名称 (如:收货区、存储区、拣货区、发货区、退货区、不良品区)area_type
: 库区类型 (可关联area_type
字典表)temperature_zone
: 温区 (常温/冷藏/冷冻/恒温)status
: 库区状态 (启用/禁用)description
: 描述
location
(库位表 - 核心!)location_id
(PK): 库位唯一标识area_id
(FK): 所属库区ID (外键 -> area.area_id)location_code
: 库位编码 (全仓库唯一, 通常有规则如 A-01-01-01)location_type
: 库位类型 (存储位/拣货位/收货暂存位/发货暂存位/…) (可关联location_type
字典表)max_volume
: 最大体积容量max_weight
: 最大承重max_quantity
: 最大存放数量 (可选,取决于管理粒度)current_volume
: 当前占用体积 (可计算)current_weight
: 当前占用重量 (可计算)status
: 库位状态 (空闲/占用/锁定/盘点中/禁用) 非常重要!x_coord
,y_coord
,z_coord
: 坐标信息 (用于可视化或路径规划)is_pick_location
: 是否是拣货位 (True/False)is_storage_location
: 是否是存储位 (True/False)
sku
(商品表 - 核心!)sku_id
(PK): 商品(SKU)唯一标识sku_code
: SKU编码 (唯一)sku_name
: 商品名称barcode
: 主条码 (可多个条码用另一个表管理)specification
: 规格型号unit
: 基本单位 (个/箱/千克/米…)length
: 长width
: 宽height
: 高volume
: 体积 (长宽高,可计算)weight
: 重量 (单件毛重)safety_stock
: 安全库存category_id
(FK): 商品分类ID (外键 -> category.category_id)supplier_id
(FK): 默认供应商ID (外键 -> supplier.supplier_id)is_batch_managed
: 是否批次管理 (True/False)is_sn_managed
: 是否序列号管理 (True/False)is_expiry_managed
: 是否效期管理 (True/False)shelf_life_days
: 保质期天数 (如果启用效期管理)status
: 商品状态 (启用/禁用)
category
(商品分类表)category_id
(PK)parent_category_id
(FK): 父分类ID (自引用,实现多级分类)category_code
: 分类编码category_name
: 分类名称level
: 分类层级
supplier
(供应商表)supplier_id
(PK)supplier_code
: 供应商编码supplier_name
: 供应商名称contact_person
: 联系人contact_phone
: 联系电话address
: 地址status
: 状态 (启用/禁用)
customer
(客户表)customer_id
(PK)customer_code
: 客户编码customer_name
: 客户名称contact_person
: 联系人contact_phone
: 联系电话shipping_address
: 收货地址status
: 状态 (启用/禁用)
carrier
(承运商表)carrier_id
(PK)carrier_code
: 承运商编码carrier_name
: 承运商名称contact_person
: 联系人contact_phone
: 联系电话status
: 状态 (启用/禁用)
uom
(计量单位表)uom_id
(PK)uom_code
: 单位编码 (如 EA, BOX, KG)uom_name
: 单位名称 (如 个,箱,千克)base_uom_id
(FK): 基准单位ID (用于换算,如果是基准单位则指向自身)conversion_factor
: 相对于基准单位的换算因子 (基准单位=1)
user
(用户表 / 操作员表)user_id
(PK)username
: 登录用户名password_hash
: 密码哈希值real_name
: 真实姓名role_id
(FK): 角色ID (外键 -> role.role_id) 用于权限控制warehouse_id
(FK): 默认所属仓库ID (外键 -> warehouse.warehouse_id)status
: 状态 (启用/禁用)
role
(角色表)role_id
(PK)role_name
: 角色名称 (如 管理员、收货员、拣货员、发货员、库存管理员)permissions
: 权限集合 (JSON或关联权限表)
2. 库存管理模块 (核心!)
inventory
(库存表 - 核心!)inventory_id
(PK): 库存记录唯一标识 (通常是原子库存的最小单位记录)location_id
(FK): 所在库位ID (外键 -> location.location_id)sku_id
(FK): 商品ID (外键 -> sku.sku_id)batch_no
: 批次号 (如果启用批次管理)serial_no
: 序列号 (如果启用序列号管理,通常序列号级别库存单独管理)expiry_date
: 过期日期 (如果启用效期管理)production_date
: 生产日期 (可选)quantity
: 当前实际数量allocated_quantity
: 已分配数量 (被出库单、调拨单等锁定但未实际出库的数量)in_transit_quantity
: 在途数量 (针对调拨入库)inventory_status
: 库存状态 (良品/待检/冻结/残次品/…) (外键 -> inventory_status.status_id) 极其重要!supplier_id
(FK): 供应商ID (可选,记录批次来源)last_inbound_time
: 最后入库时间last_outbound_time
: 最后出库时间last_count_time
: 最后盘点时间version
: 版本号 (用于乐观锁并发控制) 强烈推荐!
inventory_status
(库存状态字典表)status_id
(PK)status_code
: 状态编码status_name
: 状态名称 (如:良品、待检、冻结、残次品)is_available
: 是否可用 (用于销售/出库)
inventory_transaction
(库存事务流水表 - 核心! 审计溯源)transaction_id
(PK)transaction_type
: 事务类型 (入库/出库/移库/调整/盘点/…) (外键 -> transaction_type.type_id)transaction_time
: 事务发生时间related_id
: 关联单据ID (如入库单ID、出库单ID、盘点单ID、调拨单ID)related_line_id
: 关联单据行ID (可选)location_id
(FK): 库位ID (外键 -> location.location_id)sku_id
(FK): 商品ID (外键 -> sku.sku_id)batch_no
: 批次号serial_no
: 序列号from_inventory_status
: 源库存状态ID (移库、调整时用)to_inventory_status
: 目标库存状态IDquantity_change
: 数量变动 (+/-)operator_id
(FK): 操作员ID (外键 -> user.user_id)remark
: 备注
transaction_type
(事务类型字典表)type_id
(PK)type_code
: 类型编码type_name
: 类型名称 (如:采购入库、销售出库、生产退料、盘点调整、库内移库、状态转换)
3. 入库管理模块
asn
(到货通知单 / 入库预约单)asn_id
(PK)asn_no
: ASN单号 (唯一)asn_type
: ASN类型 (采购入库/退货入库/调拨入库/生产入库)supplier_id
(FK): 供应商ID (外键 -> supplier.supplier_id, 采购/退货时)from_warehouse_id
(FK): 源仓库ID (外键 -> warehouse.warehouse_id, 调拨入库时)expected_arrival_time
: 预计到货时间status
: 单据状态 (创建/部分收货/收货完成/关闭/取消)created_by
(FK): 创建人 (外键 -> user.user_id)created_at
: 创建时间updated_at
: 更新时间
asn_detail
(到货通知单明细)asn_detail_id
(PK)asn_id
(FK): 所属ASN单ID (外键 -> asn.asn_id)line_num
: 行号sku_id
(FK): 商品ID (外键 -> sku.sku_id)expected_quantity
: 预期数量received_quantity
: 已收数量 (可计算)uom
: 单位
receiving_order
(收货单)ro_id
(PK)ro_no
: 收货单号 (唯一)asn_id
(FK): 关联的ASN单ID (可为空,无预约收货)ro_type
: 收货类型 (同ASN类型)supplier_id
(FK): 供应商IDfrom_warehouse_id
(FK): 源仓库ID (调拨入库时)receiving_time
: 实际收货时间status
: 单据状态 (收货中/部分上架/上架完成/关闭/取消)operator_id
(FK): 收货操作员 (外键 -> user.user_id)created_at
: 创建时间
receiving_order_detail
(收货单明细)ro_detail_id
(PK)ro_id
(FK): 所属收货单ID (外键 -> receiving_order.ro_id)line_num
: 行号asn_detail_id
(FK): 关联的ASN明细ID (可为空)sku_id
(FK): 商品ID (外键 -> sku.sku_id)received_quantity
: 实际收货数量uom
: 单位batch_no
: 收货批次号 (如果由收货环节决定)expiry_date
: 收货效期 (如果由收货环节决定或记录)inventory_status
: 收货时记录的初始库存状态 (通常是待检) (外键 -> inventory_status.status_id)
putaway_order
(上架单)pwo_id
(PK)pwo_no
: 上架单号 (唯一)ro_id
(FK): 关联的收货单ID (外键 -> receiving_order.ro_id)status
: 单据状态 (待上架/上架中/已完成/关闭/取消)created_by
: 创建人 (通常是系统或计划员)created_at
: 创建时间completed_by
(FK): 完成人 (外键 -> user.user_id)completed_at
: 完成时间
putaway_order_detail
(上架单明细)pwo_detail_id
(PK)pwo_id
(FK): 所属上架单ID (外键 -> putaway_order.pwo_id)ro_detail_id
(FK): 关联的收货单明细ID (外键 -> receiving_order_detail.ro_detail_id)line_num
: 行号sku_id
(FK): 商品ID (外键 -> sku.sku_id)from_location_id
(FK): 源库位ID (通常是收货暂存区) (外键 -> location.location_id)to_location_id
(FK): 目标库位ID (上架目的地) (外键 -> location.location_id)quantity_to_putaway
: 待上架数量putaway_quantity
: 实际上架数量batch_no
: 批次号 (继承或确认)expiry_date
: 效期 (继承或确认)from_inventory_status
: 源库存状态 (待检)to_inventory_status
: 目标库存状态 (通常是良品) (外键 -> inventory_status.status_id)
4. 出库管理模块
order
(订单表 / 出库请求单)order_id
(PK)order_no
: 订单号 (唯一)order_type
: 订单类型 (销售出库/采购退货/调拨出库/生产领料/委外发料)customer_id
(FK): 客户ID (外键 -> customer.customer_id, 销售/退货时)to_warehouse_id
(FK): 目标仓库ID (外键 -> warehouse.warehouse_id, 调拨出库时)priority
: 优先级required_ship_time
: 要求发货时间status
: 单据状态 (新建/已分配/部分拣货/拣货完成/部分发货/发货完成/关闭/取消)created_by
: 创建人/来源系统created_at
: 创建时间updated_at
: 更新时间
order_detail
(订单明细)order_detail_id
(PK)order_id
(FK): 所属订单ID (外键 -> order.order_id)line_num
: 行号sku_id
(FK): 商品ID (外键 -> sku.sku_id)ordered_quantity
: 订单需求数量allocated_quantity
: 已分配数量 (生成拣货任务时更新)picked_quantity
: 已拣货数量packed_quantity
: 已打包数量shipped_quantity
: 已发货数量uom
: 单位
picking_order
(拣货单)po_id
(PK)po_no
: 拣货单号 (唯一)order_id
(FK): 关联的订单ID (可为空,支持按单/汇总拣货)wave_id
(FK): 关联的波次ID (可为空) 如果使用波次管理picker_id
(FK): 拣货员ID (外键 -> user.user_id)status
: 单据状态 (待拣货/拣货中/部分完成/已完成/关闭/取消)start_time
: 开始拣货时间complete_time
: 完成拣货时间created_at
: 创建时间
picking_order_detail
(拣货单明细)po_detail_id
(PK)po_id
(FK): 所属拣货单ID (外键 -> picking_order.po_id)order_detail_id
(FK): 关联的订单明细ID (外键 -> order_detail.order_detail_id)line_num
: 行号sku_id
(FK): 商品ID (外键 -> sku.sku_id)location_id
(FK): 源库位ID (拣货来源库位) (外键 -> location.location_id)batch_no
: 批次号 (如果指定批次)quantity_to_pick
: 计划拣货数量picked_quantity
: 实际拣货数量to_container
: 放入的容器/周转箱 (可选,关联container
表)
packing_order
(打包单)pko_id
(PK)pko_no
: 打包单号 (唯一)order_id
(FK): 关联的订单IDpacker_id
(FK): 打包员ID (外键 -> user.user_id)status
: 单据状态 (待打包/打包中/已完成)packed_time
: 打包完成时间shipping_no
: 运单号 (发货后回填)carrier_id
(FK): 承运商ID (外键 -> carrier.carrier_id)
packing_order_detail
(打包单明细) - 可选,取决于打包粒度pko_detail_id
(PK)pko_id
(FK): 所属打包单ID (外键 -> packing_order.pko_id)order_detail_id
(FK): 关联的订单明细ID (外键 -> order_detail.order_detail_id)sku_id
(FK): 商品IDpacked_quantity
: 打包数量
shipping_order
(发货单)so_id
(PK)so_no
: 发货单号 (唯一)order_id
(FK): 关联的订单IDpko_id
(FK): 关联的打包单IDshipping_time
: 实际发货时间shipping_no
: 运单号carrier_id
(FK): 承运商ID (外键 -> carrier.carrier_id)driver
: 司机/提货人license_plate
: 车牌号status
: 发货状态 (已发货/在途/签收/异常)
5. 库内管理模块
inventory_count
(盘点单)count_id
(PK)count_no
: 盘点单号 (唯一)count_type
: 盘点类型 (明盘/盲盘/周期盘点/动碰盘点/…)warehouse_id
(FK): 仓库IDarea_id
(FK): 库区ID (可选)start_time
: 计划开始时间end_time
: 计划结束时间status
: 单据状态 (计划中/进行中/已完成/已复盘/关闭)created_by
(FK): 创建人created_at
: 创建时间completed_by
(FK): 完成人completed_at
: 完成时间
inventory_count_detail
(盘点单明细)count_detail_id
(PK)count_id
(FK): 所属盘点单ID (外键 -> inventory_count.count_id)location_id
(FK): 库位ID (外键 -> location.location_id)sku_id
(FK): 商品ID (外键 -> sku.sku_id)batch_no
: 批次号inventory_status
: 库存状态 (外键 -> inventory_status.status_id)system_quantity
: 系统库存数量 (盘点时冻结或快照)counted_quantity
: 盘点实盘数量difference_quantity
: 差异数量 (counted_quantity - system_quantity)counted_by
(FK): 盘点人counted_at
: 盘点时间is_recounted
: 是否复盘
adjustment_order
(库存调整单)adj_id
(PK)adj_no
: 调整单号 (唯一)reason_type
: 调整原因类型 (盘点差异/报损/报溢/…) (可关联字典表)reason_desc
: 调整原因描述warehouse_id
(FK): 仓库IDstatus
: 单据状态 (草稿/已提交/已审核/已完成)created_by
(FK): 创建人created_at
: 创建时间approved_by
(FK): 审核人approved_at
: 审核时间completed_by
(FK): 完成人completed_at
: 完成时间
adjustment_order_detail
(库存调整单明细)adj_detail_id
(PK)adj_id
(FK): 所属调整单ID (外键 -> adjustment_order.adj_id)location_id
(FK): 库位ID (外键 -> location.location_id)sku_id
(FK): 商品ID (外键 -> sku.sku_id)batch_no
: 批次号inventory_status
: 库存状态 (外键 -> inventory_status.status_id)from_status
: 原状态 (移库或状态转换时)to_status
: 目标状态 (移库或状态转换时)quantity_change
: 调整数量 (+ 表示增加, - 表示减少)current_system_quantity
: 调整前系统库存 (记录)after_system_quantity
: 调整后系统库存 (记录)
transfer_order
(库内移库单)to_id
(PK)to_no
: 移库单号 (唯一)transfer_type
: 移库类型 (库位调整/补货/…) (可关联字典表)reason
: 移库原因status
: 单据状态 (计划中/执行中/已完成/取消)created_by
(FK): 创建人created_at
: 创建时间completed_by
(FK): 完成人completed_at
: 完成时间
transfer_order_detail
(库内移库单明细)to_detail_id
(PK)to_id
(FK): 所属移库单ID (外键 -> transfer_order.to_id)sku_id
(FK): 商品ID (外键 -> sku.sku_id)batch_no
: 批次号from_location_id
(FK): 源库位ID (外键 -> location.location_id)to_location_id
(FK): 目标库位ID (外键 -> location.location_id)from_inventory_status
: 源库存状态 (外键 -> inventory_status.status_id)to_inventory_status
: 目标库存状态 (通常与源状态一致,也可转换)quantity_to_transfer
: 计划移库数量transferred_quantity
: 实际移库数量operator_id
(FK): 操作员
replenishment_order
(补货单) - 由系统生成rpl_id
(PK)rpl_no
: 补货单号 (唯一)from_location_id
(FK): 源库位 (存储位) (外键 -> location.location_id)to_location_id
(FK): 目标库位 (拣货位) (外键 -> location.location_id)sku_id
(FK): 商品ID (外键 -> sku.sku_id)batch_no
: 批次号 (FIFO/FEFO规则)quantity_to_replenish
: 需要补货的数量priority
: 补货优先级status
: 单据状态 (待执行/执行中/已完成/取消)created_at
: 创建时间 (系统)completed_by
(FK): 完成人completed_at
: 完成时间
6. 字典与配置表 (可选但重要)
dict_*
(各种字典表): 如dict_order_type
,dict_inventory_status
,dict_location_type
,dict_area_type
,dict_transaction_type
,dict_count_type
,dict_adjust_reason
,dict_transfer_type
等。存储编码、名称、是否启用等信息。减少硬编码,方便维护。config
(系统配置表): 存储系统级参数,如库存冻结阈值、盘点规则、补货策略参数、波次策略参数等。
重要说明
- 主键(PK) / 外键(FK): 必须明确定义,确保数据关系完整。
- 索引(Index): 对高频查询字段(如
location_id
,sku_id
,batch_no
,status
,created_at
,transaction_time
)和连接字段(外键)建立索引,大幅提升查询性能。 - 事务(Transaction): 对库存变动操作(入库、出库、移库、调整)必须使用数据库事务保证操作的原子性、一致性、隔离性、持久性 (ACID)。
inventory_transaction
表是审计的关键。 - 并发控制:
inventory
表强烈建议使用乐观锁 (version
字段) 或悲观锁来防止超卖等并发问题。 - 状态管理: 所有单据(ASN, RO, PWO, Order, PO, Count, Adjust, Transfer)和库存 (
inventory.inventory_status
,location.status
) 都需要清晰的状态机定义和流转。 - 软删除: 考虑对重要主表(如
warehouse
,sku
,location
)添加is_deleted
标志位实现软删除,避免物理删除导致关联数据断裂。 - 数据量: 对于海量流水数据(如
inventory_transaction
),考虑历史数据归档和分区表策略。 - 灵活性: 预留一些
extended_info
(JSON类型) 或自定义字段 (custom_field1
,custom_field2
) 以适应未来可能的扩展需求(但不要滥用)。 - 序列号管理: 如果涉及高价值或强追溯性商品,序列号 (
serial_no
) 的管理需要更精细,可能需要单独的serial_number
表记录每个序列号的状态、位置、历史。 - 波次管理(Wave Picking): 如果使用波次,需要增加
wave
(波次表) 和wave_detail
(波次明细表),关联order
和picking_order
。
这个设计是一个基础框架。实际项目中,需要根据以下因素进行详细设计和调整:
- 行业特性: 电商、医药、冷链、制造业等差异巨大。
- 仓库自动化程度: 自动化立库、AGV、输送线等需要额外的表记录设备状态、任务调度。
- 业务流程复杂度: 越库、供应商管理库存、加工、质检等环节需要扩展。
- 集成需求: 与ERP、TMS、OMS、MES等系统的接口字段映射。
- 报表需求: 支撑报表的预计算或视图。
建议在开始编码前,使用数据库设计工具(如MySQL Workbench, pgAdmin, ERwin, PowerDesigner等)绘制详细的ER图,并反复与业务方确认流程和规则。分模块迭代开发也是一个好策略。
希望这个蓝图能为您设计WMS数据库提供一个坚实的起点!
4️⃣ 参考 4
好的,设计一个健壮且高效的WMS(仓库管理系统)数据库是系统成功的关键。核心在于精准建模仓库实体、状态流转和业务流程,并确保数据一致性、实时性、可追溯性和高性能。
以下是一个核心、精简且可扩展的WMS数据库表设计,覆盖了主要功能模块。实际设计需根据具体业务(如电商仓、生产仓、冷链仓)、规模、自动化程度和流程深度进行调整。
核心设计原则:
- 实体清晰: 每张表代表一个核心业务实体(物料、库位、库存、任务、单据)。
- 关系明确: 使用外键定义清晰的关联(如库存属于哪个物料、在哪个库位)。
- 状态驱动: 关键实体(库存、任务、单据)必须有状态字段,记录生命周期。
- 事务保障: 库存变动、任务执行等关键操作需在数据库事务中进行。
- 审计追踪: 记录关键数据的创建/修改人和时间。
- 唯一标识: 主键(自增ID或UUID) + 业务唯一键(如库位编码、SKU、单号)。
- 性能考量: 高频查询表(库存、事务)需精心设计索引,考虑分区。
核心表清单与说明
1. 基础主数据 (Master Data)
表名 | 字段 (关键字段加粗) | 说明 |
---|---|---|
warehouse |
warehouse_id (PK), code , name , location , is_active , … |
仓库信息。code 唯一标识仓库。 |
zone |
zone_id (PK), warehouse_id (FK), code , name , type (收货区/存储区/拣货区/发货区/…), pick_sequence , … |
库区信息。type 定义功能。code 在仓库内唯一。 |
location |
location_id (PK), zone_id (FK), code , type (货架位/地面堆码/月台/…), max_volume , max_weight , x_coord , y_coord , is_pickable , is_storable , is_active , current_volume (冗余), current_weight (冗余), … |
核心! 物理库位。code 全局唯一(如 A-01-01-01 )。坐标用于路径优化。状态和容量限制至关重要。 |
item |
item_id (PK), sku , name , description , barcode , category_id (FK), uom_id (FK), length , width , height , weight , volume , is_serialized , is_batch_tracked , shelf_life_days , storage_condition , is_active , … |
核心! 物料/商品主数据。sku 唯一标识商品。is_serialized /is_batch_tracked 决定库存管理粒度。 |
item_category |
category_id (PK), parent_id , code , name , … |
物料分类。支持层级。 |
uom |
uom_id (PK), code (EA, BOX, KG, …), name , … |
计量单位。 |
supplier |
supplier_id (PK), code , name , … |
供应商。 |
customer |
customer_id (PK), code , name , … |
客户。 |
carrier |
carrier_id (PK), code , name , … |
承运商。 |
user |
user_id (PK), username , password_hash , real_name , role_id (FK), is_active , … |
系统用户/操作员。关联角色权限表 (role , permission , role_permission - 标准RBAC)。 |
2. 库存核心 (Inventory Core)
表名 | 字段 (关键字段加粗) | 说明 |
---|---|---|
inventory |
inventory_id (PK), location_id (FK), item_id (FK), quantity (可用), quantity_locked (锁定), quantity_damaged , batch_number , inventory_status (可用/冻结/质检中/…), expiration_date , last_count_date , … |
最核心表! 代表物料在特定库位、特定批次下的实时库存状态。quantity 和 quantity_locked 是库存分配与扣减的基础。batch_number 和 status 是精细化管理和控制的关键。索引:(location_id, item_id, batch_number, inventory_status) 极其重要! |
inventory_serial |
serial_id (PK), inventory_id (FK), serial_number (UQ), status (在库/出库/…) |
序列号明细表。当物料 is_serialized = true 时使用。每个序列号关联到一个 inventory 记录。记录序列号状态和生命周期。 |
inventory_transaction |
transaction_id (PK), transaction_type (入库/出库/移库/调整/…), item_id (FK), from_location_id (FK), to_location_id (FK), quantity , batch_number , serial_number , reference_type (Receipt/Shipment/Move/…), reference_id , transaction_time , transacted_by , … |
核心流水账! 记录所有引起库存变化的操作。reference_type + reference_id 精确溯源到源头单据(入库单、出库单、移库单等)。这是对账、审计和追溯的生命线。索引:(item_id) , (location_id) , (reference_type, reference_id) , (transaction_time) 。 |
3. 入库管理 (Receiving & Putaway)
表名 | 字段 (关键字段加粗) | 说明 |
---|---|---|
receiving_order |
receipt_id (PK), receipt_number , type (采购/生产/退货/…), supplier_id (FK), expected_arrival , actual_arrival , warehouse_id (FK), status (创建/在途/部分收货/已收货/已上架/关闭), reference_number (PO#), … |
入库单头。记录入库业务整体信息。status 驱动流程。 |
receiving_line |
line_id (PK), receipt_id (FK), line_num , item_id (FK), expected_qty , received_qty , putaway_qty , uom_id (FK), … |
入库单行。记录预期和实际收到的物料及数量。received_qty 和 putaway_qty 跟踪收货和上架进度。 |
putaway_task |
task_id (PK), source_ref_type (‘RECEIPT’), source_ref_id , source_location_id (FK), item_id (FK), batch_number , qty_to_putaway , qty_putaway , suggested_location_id (FK), actual_location_id (FK), status (待分配/执行中/完成), assigned_to , … |
上架任务。由收货或补货触发。记录从来源库位(如收货暂存区)到目标存储/拣货库位的移动任务。系统推荐库位 (suggested_location_id ) 和实际操作库位 (actual_location_id ) 可能不同。 |
4. 出库管理 (Shipping, Picking & Packing)
表名 | 字段 (关键字段加粗) | 说明 |
---|---|---|
shipment_order |
shipment_id (PK), shipment_number , type (销售/退货/调出/…), customer_id (FK), carrier_id (FK), tracking_number , expected_ship , actual_ship , warehouse_id (FK), status (创建/部分分配/已分配/部分拣货/已拣货/部分打包/已打包/部分发货/已发货/关闭), reference_number (SO#), … |
发货单头。记录出库业务整体信息。复杂的状态反映多阶段流程。 |
shipment_line |
line_id (PK), shipment_id (FK), line_num , item_id (FK), ordered_qty , allocated_qty , picked_qty , packed_qty , shipped_qty , uom_id (FK), … |
发货单行。记录客户需求的物料及数量。allocated_qty 锁定库存,picked_qty /packed_qty /shipped_qty 跟踪拣货、打包、发货进度。 |
wave |
wave_id (PK), wave_number , type (按单/按区/紧急), status (创建/已释放/完成), release_time , … |
波次。将多个发货单/行组合起来一起拣货,优化路径和效率。 |
wave_line |
wave_line_id (PK), wave_id (FK), shipment_line_id (FK), qty_to_pick , status (待拣/已拣), … |
波次明细。关联具体的发货单行和该波次要拣的数量。 |
picking_task |
pick_task_id (PK), wave_id (FK - 可选), shipment_line_id (FK), item_id (FK), batch_number , qty_to_pick , qty_picked , from_location_id (FK), to_container_id (FK), status (待分配/执行中/完成), assigned_to , sequence , … |
拣货任务。指导操作员从哪个库位 (from_location_id ) 拣多少数量放到哪个容器 (to_container_id )。sequence 用于路径优化。 |
container |
container_id (PK), code , type (纸箱/托盘/小车), current_location_id (FK), current_operator_id (FK), status (空闲/拣货中/打包中/待发运), associated_shipment_id (FK), … |
容器管理。用于在拣货、打包、运输过程中盛放货物。状态和位置跟踪很重要。 |
packing |
pack_id (PK), shipment_id (FK), container_id (FK), packed_by , packed_at , weight , dimensions , … |
打包记录。记录哪个容器被打包进了哪个发货单,以及打包的物理信息(称重、量尺寸)。 |
shipping_task |
task_id (PK), shipment_id (FK), container_id (FK), from_location_id (FK), to_dock_id (FK - 月台), status (待发运/已发运), shipped_at , … |
发运任务。指导将打包好的容器从暂存区 (from_location_id ) 移动到月台 (to_dock_id ) 并装车发运。 |
5. 库内管理 (Internal Operations)
表名 | 字段 (关键字段加粗) | 说明 |
---|---|---|
move_task |
move_id (PK), type (调整/补货/盘点移/…), reason , from_location_id (FK), to_location_id (FK), item_id (FK), batch_number , qty_to_move , qty_moved , status (创建/执行中/完成), assigned_to , … |
移库任务。指导在仓库内部移动库存。type 区分移动原因(库位优化、补货上架、盘点整理等)。 |
replenishment_task |
replen_id (PK), type (存储->拣货), source_location_id (FK - 存储位), target_location_id (FK - 拣货位), item_id (FK), batch_number , qty_to_replen , qty_replenished , status (创建/执行中/完成), triggered_by (缺货触发/PICK ID), … |
补货任务。当拣货位库存不足时,触发从存储位向拣货位补充库存的任务。triggered_by 记录触发源(如某个拣货任务ID)。 |
cycle_count |
count_id (PK), count_number , type (明盘/盲盘/动碰/…), warehouse_id (FK), zone_id (FK), start_date , end_date , actual_start , actual_end , status (计划/执行/待审核/完成), … |
盘点单头。组织盘点活动。 |
count_line |
count_line_id (PK), count_id (FK), location_id (FK), item_id (FK - 明盘), batch_number (明盘), system_qty , counted_qty , counted_by , counted_at , variance_qty , adjusted_qty , adjust_reason , status (待盘/已盘/已调整), … |
盘点明细。记录某个库位、某个物料(明盘时)、某个批次的系统库存 (system_qty )、实际盘点数量 (counted_qty )、差异 (variance_qty )、最终审核调整量 (adjusted_qty ) 和调整原因。status 跟踪行的进度。盘点结果审核通过后,会生成库存调整事务 (inventory_transaction type=‘ADJUST’)。 |
6. 辅助与审计 (Auxiliary & Auditing)
表名 | 字段 (关键字段加粗) | 说明 |
---|---|---|
operation_log |
log_id , log_time , user_id (FK), module , operation , object_type , object_id , details_before (JSON), details_after (JSON), ip_address , … |
操作日志。记录关键操作行为,用于审计和安全追踪。记录变更前后的值(可选但推荐)。 |
关键流程与表交互示例
采购入库:
- 创建
receiving_order
(类型=采购) 和receiving_line
。 - 货物到达:创建
receiving_task
-> 操作员收货 -> 更新receiving_line.received_qty
-> 触发inventory_transaction
(类型=收货, to_location=收货暂存区) -> 更新inventory
(在收货暂存区增加数量)。 - 系统生成
putaway_task
(来源=收货暂存区, 目标=推荐存储库位)。 - 操作员执行上架 -> 更新
putaway_task.qty_putaway
&receiving_line.putaway_qty
-> 触发inventory_transaction
(类型=移库, from=收货暂存区, to=目标库位) -> 更新inventory
(收货暂存区减少, 目标库位增加)。 - 当所有行上架完成,
receiving_order.status
更新为“已上架”或“关闭”。
- 创建
销售出库:
- 创建
shipment_order
(类型=销售) 和shipment_line
。 - 库存分配: 系统根据策略为
shipment_line
分配库存 -> 更新inventory.quantity_locked
(增加锁定数) -> 更新shipment_line.allocated_qty
。 - 波次生成 (可选): 创建
wave
,将相关的shipment_line
加入wave_line
。 - 生成拣货任务: 为
wave_line
或单个shipment_line
创建picking_task
(指定从哪个拣货库位from_location_id
拣多少到哪个容器to_container_id
)。 - 拣货: 操作员执行拣货 -> 扫描库位、物料、容器 -> 更新
picking_task.qty_picked
&wave_line.status
(若适用) &shipment_line.picked_qty
-> 触发inventory_transaction
(类型=出库, from=拣货库位) -> 更新inventory
(减少quantity
和quantity_locked
)。(注:扣减时机可在拣货时或发货时) - 打包: 操作员将容器中的货物打包 -> 创建
packing
记录 -> 更新container.status
和shipment_line.packed_qty
。 - 发运: 创建
shipping_task
-> 操作员将打包好的容器运到月台装车 -> 更新shipping_task.status
&container.status
&shipment_line.shipped_qty
&shipment_order.status
-> 可能触发最终扣减库存的事务 (如果拣货时未扣)。 - 发货完成,更新
shipment_order.status
为“已发货”。
- 创建
库内移库:
- 创建
move_task
(指定来源库位、目标库位、物料、数量、批次)。 - 操作员执行移动 -> 更新
move_task.qty_moved
-> 触发inventory_transaction
(类型=移库, from=源库位, to=目标库位) -> 更新inventory
(源库位减少, 目标库位增加)。
- 创建
盘点:
- 创建
cycle_count
和count_line
(指定库位,明盘时指定物料/批次)。 - 操作员盘点 -> 录入
count_line.counted_qty
-> 系统计算variance_qty
-> 更新count_line.status
= 已盘点。 - 主管审核差异 -> 确认调整 (
adjusted_qty
) -> 更新count_line.status
= 已调整 -> 触发inventory_transaction
(类型=调整, 调整量 =adjusted_qty - system_qty
) -> 更新inventory.quantity
。 - 所有行审核完成,更新
cycle_count.status
= 完成。
- 创建
关键设计决策与优化点
库存表 (
inventory
) 设计:- 粒度:
(location_id, item_id, batch_number, inventory_status)
是核心粒度。序列号单独管理 (inventory_serial
)。 - 锁定库存:
quantity_locked
字段实现高效的预占,避免超卖和并发冲突。分配操作只需更新此字段,无需事务流水。 - 状态管理:
inventory_status
控制库存可用性(冻结、质检隔离等)。 - 冗余字段:
current_volume
/weight
用于快速库位容量检查,需在移库/上架时维护。 - 性能: 该表读写频率极高。
(location_id, item_id, batch_number, status)
联合索引是必须的。考虑按仓库分区。
- 粒度:
事务表 (
inventory_transaction
) 设计:- 溯源:
reference_type
+reference_id
是生命线。务必准确记录。 - 性能: 数据量增长极快。按时间分区 (
transaction_time
)。索引(item_id)
,(location_id)
,(reference_type, reference_id)
,(transaction_time)
。 - 完整性: 所有库存变动必须通过此表记录。
- 溯源:
库位表 (
location
) 设计:- 编码:
code
需有规则(如区-排-列-层
),便于理解和系统处理。 - 类型与属性:
type
和is_pickable
/is_storable
驱动库位分配策略和任务生成。容量限制是硬约束。 - 坐标:
x_coord
/y_coord
/z_coord
用于计算最优拣货路径(如TSP算法)。
- 编码:
任务表 (
*_task
) 设计:- 状态驱动:
status
字段管理任务生命周期(待分配、执行中、完成、取消)。操作员APP主要与这些表交互。 - 分配与执行:
assigned_to
记录责任人。start_time
/complete_time
用于绩效分析。 - 来源与目标: 清晰定义
from_*
和to_*
(库位/容器)。
- 状态驱动:
单据行进度: (
receiving_line
,shipment_line
,count_line
)- 使用多个字段 (
received_qty
/allocated_qty
/picked_qty
/packed_qty
/shipped_qty
/putaway_qty
/counted_qty
) 精确跟踪业务流程各阶段完成情况,驱动单据头状态 (status
)。
- 使用多个字段 (
灵活性:
- 预留字段: 如
custom_fields
(JSON) 存储非核心动态属性。 - 枚举类型: 使用数据库枚举或小表管理
status
,type
等字段值,确保一致性和可维护性。
- 预留字段: 如
多租户/多仓库: 如果系统需要支持多个独立客户(货主)或多个物理仓库:
- 在几乎所有核心表 (
item
,inventory
,*_order
,*_task
,location
) 增加tenant_id
或owner_id
字段。 - 在
warehouse
表明确区分,并在关联表中包含warehouse_id
。
- 在几乎所有核心表 (
总结
这个设计提供了一个坚实的WMS数据库基础。务必结合您的具体业务场景进行深度定制:
- 电商仓: 重点优化海量SKU、快速订单履行(波次、拣货路径)、退货处理(增加
return
相关表)。 - 生产仓/原材料仓: 强调批次追踪、先进先出 (FIFO/FEFO)、与MES/ERP的集成、领料管理。
- 第三方物流 (3PL): 需要强大的多货主 (
tenant
) 支持、计费模块、更复杂的报表。 - 自动化仓 (AS/RS): 需要增加设备控制、容器管理 (
container
更复杂)、任务调度队列。
强烈建议:
- 绘制详细的ER图: 可视化表之间的关系。
- 进行原型验证: 用模拟数据测试核心流程(入库、出库、移库、盘点)的数据流转和性能。
- 持续迭代: 数据库设计不是一次性的,随着业务理解和需求变化,需要不断调整优化。
希望这个设计能为您提供一个清晰的起点!
5️⃣ 参考 5
好的,设计一个通用型WMS(仓库管理系统)的数据库表结构需要兼顾核心功能、灵活性、可扩展性和一定的行业适应性。以下是一个经过提炼的、相对通用的核心表结构设计,它覆盖了WMS最基础且必不可少的功能模块,并考虑了未来的扩展性。
设计核心原则:
- 模块化: 按功能模块划分表(基础数据、库存、入库、出库、库内、盘点)。
- 实体清晰: 每张表代表一个核心业务实体(如物料、库位、库存、单据、任务)。
- 关系明确: 使用外键定义清晰的关联关系。
- 状态驱动: 关键实体(库存、单据、任务)使用状态字段 (
status
) 管理其生命周期。 - 事务保障: 库存变动操作必须在数据库事务中进行,保证数据一致性。
- 可追溯性: 通过单据关联 (
reference_type
/reference_id
) 和事务流水 (inventory_transaction
) 实现全链路追踪。 - 扩展性:
- 使用
type
字段区分不同类型(如入库类型、出库类型、任务类型)。 - 预留
custom_fields
(JSON) 存储非核心动态属性。 - 考虑多租户 (
tenant_id
) 或货主 (owner_id
) 支持。
- 使用
- 性能: 高频操作表(库存、事务)需精心设计索引,考虑分区策略。
核心表清单与字段说明 (精简通用版)
1. 基础主数据 (Master Data)
表名 | 主键 | 核心字段 (加粗为关键/常用) | 说明 |
---|---|---|---|
warehouse |
warehouse_id |
code (UQ), name , location , contact_info , is_active |
仓库信息。code 唯一标识仓库。 |
zone |
zone_id |
warehouse_id (FK), code (UQ), name , type (收货区/存储区/拣货区/发货区/退货区/…), description |
库区信息。code 在仓库内唯一。type 定义功能分区。 |
location |
location_id |
zone_id (FK), code (UQ), type (货架位/地面位/月台/暂存位/…), max_volume , max_weight , x_coord , y_coord , is_pickable , is_storable , is_active , current_volume , current_weight |
物理库位核心表。 code 需有规则且全局唯一。坐标用于路径优化。容量、类型、状态至关重要。current_* 为冗余字段需维护。 |
item |
item_id |
sku (UQ), name , description , barcode (主条码), category_id (FK), uom_id (FK), length , width , height , weight , volume , is_serialized , is_batch_tracked , shelf_life_days , storage_condition , is_active |
物料/商品主数据核心。 sku 唯一标识。is_serialized /is_batch_tracked 决定库存管理粒度。 |
item_category |
category_id |
parent_id (FK), code , name , description |
物料分类。支持树形结构。 |
unit_of_measure |
uom_id |
code (UQ), name (如 ‘个’, ‘箱’, ‘千克’) |
计量单位。 |
supplier |
supplier_id |
code (UQ), name , contact_info , address , is_active |
供应商信息。 |
customer |
customer_id |
code (UQ), name , contact_info , address , is_active |
客户信息。 |
carrier |
carrier_id |
code (UQ), name , contact_info , service_types |
承运商信息。 |
user |
user_id |
username (UQ), password_hash , real_name , role_id (FK), is_active |
系统用户/操作员。关联角色权限表 (RBAC模型: role , permission , role_permission )。 |
container |
container_id |
code (UQ), type (纸箱/托盘/料箱/小车), current_location_id (FK), current_user_id (FK), status (空闲/使用中/待发运) |
容器管理。用于拣货、打包、运输过程。 |
2. 库存核心 (Inventory Core)
表名 | 主键 | 核心字段 (加粗为关键/常用) | 说明 |
---|---|---|---|
inventory |
inventory_id |
location_id (FK), item_id (FK), quantity (可用数量), quantity_locked (锁定数量), quantity_damaged (不良品), batch_number , inventory_status (可用/冻结/质检中/待报废/…), expiration_date , last_count_date |
库存状态核心表! 粒度:(location_id, item_id, batch_number, inventory_status) 。quantity 和 quantity_locked 是核心。status 控制可用性。必须索引:(location_id, item_id, batch, status) 。 |
inventory_serial |
serial_id |
inventory_id (FK), serial_number (UQ), status (在库/已出库/…) |
序列号明细表。 当物料 is_serialized=true 时使用。关联到具体的 inventory 记录。记录序列号状态。 |
inventory_transaction |
transaction_id |
transaction_type (收货/上架/拣货/发货/移库/调整/状态转换/…), item_id (FK), from_location_id (FK), to_location_id (FK), quantity (带符号), batch_number , serial_number , reference_type (单据类型), reference_id (单据ID), transaction_time , transacted_by |
库存流水账核心! 记录所有库存变动。reference_type + reference_id 用于溯源到源头单据(如入库单、出库单)。必须索引:(item_id) , (location_id) , (ref_type, ref_id) , (trans_time) 。建议按时间分区。 |
3. 入库管理 (Receiving & Putaway)
表名 | 主键 | 核心字段 (加粗为关键/常用) | 说明 |
---|---|---|---|
receipt_order |
receipt_id |
receipt_number (UQ), type (采购入库/生产入库/退货入库/调拨入库/…), supplier_id (FK), expected_arrival , actual_arrival , warehouse_id (FK), status (创建/部分收货/已收货/已上架/关闭) |
入库单头。记录入库业务整体信息。status 驱动流程。 |
receipt_line |
line_id |
receipt_id (FK), line_num , item_id (FK), expected_qty , received_qty , putaway_qty , uom_id (FK) |
入库单行。跟踪物料收货和上架进度。 |
putaway_task |
task_id |
source_ref_type (‘RECEIPT’), source_ref_id , source_location_id (FK), item_id (FK), batch_number , qty_to_putaway , qty_putaway , suggested_to_location_id (FK), actual_to_location_id (FK), status (待分配/执行中/完成), assigned_to |
上架任务。指导将货物从来源库位(如收货区)移动到目标存储/拣货库位。suggested 是系统推荐,actual 是实际操作。 |
4. 出库管理 (Shipping, Picking & Packing)
表名 | 主键 | 核心字段 (加粗为关键/常用) | 说明 |
---|---|---|---|
shipment_order |
shipment_id |
shipment_number (UQ), type (销售出库/退货出库/调拨出库/领料出库/…), customer_id (FK), carrier_id (FK), tracking_number , expected_ship , actual_ship , warehouse_id (FK), status (创建/已分配/部分拣货/已拣货/已打包/已发货/关闭) |
发货单头。记录出库业务整体信息。复杂的状态反映多阶段流程。 |
shipment_line |
line_id |
shipment_id (FK), line_num , item_id (FK), ordered_qty , allocated_qty , picked_qty , packed_qty , shipped_qty , uom_id (FK) |
发货单行。核心跟踪字段: allocated (库存锁定), picked (已从库位移出), packed (已打包), shipped (已离库)。 |
picking_task |
pick_task_id |
wave_id (FK - 可选), shipment_line_id (FK), item_id (FK), batch_number , qty_to_pick , qty_picked , from_location_id (FK), to_container_id (FK), status (待分配/执行中/完成), assigned_to , sequence |
拣货任务。指导操作员从指定库位 (from_location_id ) 拣多少数量放到哪个容器 (to_container_id )。sequence 用于优化拣货路径。 |
packing |
pack_id |
shipment_id (FK), container_id (FK), packed_by , packed_at , weight , dimensions |
打包记录。记录哪个容器被打包进了哪个发货单,以及打包的物理信息。 |
5. 库内管理 (Internal Operations)
表名 | 主键 | 核心字段 (加粗为关键/常用) | 说明 |
---|---|---|---|
move_task |
move_id |
type (库位调整/补货上架/盘点移位/整理移库/…), reason , from_location_id (FK), to_location_id (FK), item_id (FK), batch_number , qty_to_move , qty_moved , status (待分配/执行中/完成), assigned_to |
移库任务。指导在仓库内部移动库存。type 区分移动原因。 |
replenishment_task |
replen_id |
type (存储->拣货), source_location_id (FK - 存储位), target_location_id (FK - 拣货位), item_id (FK), batch_number , qty_to_replen , qty_replenished , status (待分配/执行中/完成), triggered_by (如 PICK ID) |
补货任务。当拣货位库存不足时触发,从存储位补货到拣货位。triggered_by 记录触发源。 |
cycle_count |
count_id |
count_number (UQ), type (明盘/盲盘/动碰盘点/…), warehouse_id (FK), zone_id (FK), start_date , end_date , status (计划/执行/待审核/完成) |
盘点单头。组织盘点活动。 |
count_line |
count_line_id |
count_id (FK), location_id (FK), item_id (FK - 明盘), batch_number (明盘), system_qty , counted_qty , counted_by , counted_at , variance_qty , adjusted_qty , adjust_reason , status (待盘/已盘/已调整) |
盘点明细。记录盘点结果和差异处理。审核通过后,差异 (adjusted_qty - system_qty) 会生成库存调整事务 (inventory_transaction type=‘ADJUST’)。 |
6. 辅助与审计 (Auxiliary & Auditing)
表名 | 主键 | 核心字段 (加粗为关键/常用) | 说明 |
---|---|---|---|
operation_log |
log_id |
log_time , user_id (FK), module , operation , object_type , object_id , details (JSON), ip_address |
操作日志。记录关键操作行为,用于审计和安全追踪。details 可存储操作前后快照。 |
通用性设计要点
- 核心实体覆盖: 包含了WMS最基础的实体:仓库、库区、库位、物料、供应商、客户、库存状态、库存流水、入库单、出库单、移库任务、盘点单。这是任何WMS的基石。
- 状态驱动流程 (
status
字段): 几乎所有核心业务单据和任务都有status
字段,通过状态变迁来驱动业务流程(如receipt_order.status
从 “创建” -> “部分收货” -> “已收货” -> “已上架” -> “关闭”)。这使得流程逻辑清晰且易于扩展。 - 单据关联溯源 (
reference_type
+reference_id
):inventory_transaction
表通过这两个字段精确关联到源头业务单据(如入库单行、出库单行、移库任务、盘点行)。这是实现库存操作全链路追溯的关键。 - 类型字段 (
type
): 广泛使用type
字段来区分不同业务场景(如receipt_order.type
区分采购入库还是退货入库,move_task.type
区分移库原因)。这大大增强了表的通用性,避免了为每种场景单独建表。 - 灵活扩展:
- JSON 字段 (
custom_fields
): 在关键表(如item
,inventory
,*_order
)中加入custom_fields
JSON字段,用于存储业务特定的、非核心的动态属性(如物料颜色、客户特殊要求、库位特殊属性),无需频繁修改表结构。 - 预留字段: 在关键表中预留1-2个
reserved_field1
(VARCHAR) 或reserved_int1
等字段,应对短期内未知的小需求。 - 模块化扩展: 此设计是核心骨架。特定行业需求(如冷链的温度记录、医药的GMP合规、电商的赠品管理、3PL的计费规则)可以在这些表基础上通过新增关联表或扩展字段实现。
- JSON 字段 (
- 多租户/多货主支持: 如果需要支持多个独立客户(货主)使用同一套WMS:
- 在几乎所有核心业务表 (
item
,inventory
,*_order
,*_task
,location
) 增加tenant_id
或owner_id
(FK 关联tenant
或customer
表)。 - 在
warehouse
表明确仓库归属 (tenant_id
/owner_id
)。 - 确保所有查询和操作都严格按
tenant_id
/owner_id
过滤。
- 在几乎所有核心业务表 (
- 性能考量:
- 高频表索引:
inventory
,inventory_transaction
,location
,*_task
是高频读写表,必须根据查询模式设计高效索引(如inventory
的(location_id, item_id, batch, status)
索引)。 - 事务表分区:
inventory_transaction
数据量增长极快,按transaction_time
(如按月或按年) 进行分区是常见优化手段。 - 乐观锁: 对
inventory
表的更新操作(尤其是分配、扣减库存)使用乐观锁(如version
字段)或数据库行锁,防止超卖和并发冲突。
- 高频表索引:
总结
这个通用型WMS数据库设计提供了:
- 核心功能完备性: 覆盖了仓库管理最基本的收货、上架、存储、拣货、打包、发货、移库、盘点等核心业务流程。
- 高度灵活性: 通过
status
,type
,custom_fields
等设计,能够适应不同行业和业务场景的基本需求。 - 坚实基础与可扩展性: 清晰的核心实体和关系为后续添加复杂功能(波次管理、越库作业、供应商协同、AGV调度集成、高级报表等)奠定了坚实的基础。扩展可以通过新增表、在现有表加字段(谨慎)或利用
custom_fields
实现。 - 可追溯性: 通过
inventory_transaction
和单据关联实现了库存变动的完整追踪。 - 通用架构: 这是一个经过验证的、适用于大多数中小型仓库或作为大型WMS核心模块的设计范式。
实施建议:
- 结合业务深入理解: 即使是通用设计,也需要理解您具体的仓库类型(电商仓、生产仓、分销仓?)、主要业务流程和痛点。
- 绘制ER图: 使用工具(如MySQL Workbench, Lucidchart, Draw.io)绘制实体关系图,可视化表之间的联系,便于团队理解和沟通。
- 原型验证: 创建核心表,用模拟数据测试主要流程(如:创建物料 -> 创建入库单 -> 收货 -> 上架 -> 创建出库单 -> 分配库存 -> 拣货 -> 发货 -> 查看库存流水),验证设计的可行性和逻辑正确性。
- 迭代演进: 数据库设计不是一次完成的。随着业务发展和需求细化,需要不断调整和优化表结构。保持设计的文档化。
这个设计为构建一个健壮、灵活且可持续演进的通用WMS系统提供了坚实的数据库基础。
6️⃣ 参考 6
以下是针对通用WMS(仓库管理系统)的数据库表设计,包含核心模块的规范化设计,满足基础仓储业务需求:
1. 仓库基础信息表
CREATE TABLE warehouse (
id INT PRIMARY KEY AUTO_INCREMENT,
code VARCHAR(20) UNIQUE NOT NULL COMMENT '仓库编码',
name VARCHAR(50) NOT NULL COMMENT '仓库名称',
type ENUM('常温','冷藏','冷冻','危险品') NOT NULL COMMENT '仓库类型',
address VARCHAR(100) COMMENT '仓库地址',
status TINYINT DEFAULT 1 COMMENT '状态(0停用,1启用)',
capacity DECIMAL(10,2) COMMENT '总容量(m³)',
manager_id INT COMMENT '负责人ID',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
2. 库区/货架表
CREATE TABLE storage_location (
id INT PRIMARY KEY AUTO_INCREMENT,
warehouse_id INT NOT NULL COMMENT '所属仓库ID',
parent_id INT DEFAULT 0 COMMENT '父区域ID(用于多级货架)',
code VARCHAR(20) NOT NULL COMMENT '库位编码',
type ENUM('存储区','拣货区','暂存区','退货区') NOT NULL,
max_quantity INT COMMENT '最大存放数量',
max_weight DECIMAL(10,2) COMMENT '最大承重(kg)',
coordinates VARCHAR(50) COMMENT '坐标位置(A-01-02)',
status TINYINT DEFAULT 1 COMMENT '状态(0禁用,1可用)',
FOREIGN KEY (warehouse_id) REFERENCES warehouse(id)
);
3. 商品主数据表
CREATE TABLE product (
id INT PRIMARY KEY AUTO_INCREMENT,
sku VARCHAR(30) UNIQUE NOT NULL COMMENT '商品SKU',
name VARCHAR(100) NOT NULL COMMENT '商品名称',
spec VARCHAR(50) COMMENT '规格型号',
unit VARCHAR(10) NOT NULL COMMENT '计量单位',
category_id INT NOT NULL COMMENT '分类ID',
weight DECIMAL(8,2) COMMENT '单件重量(kg)',
volume DECIMAL(8,2) COMMENT '单件体积(m³)',
shelf_life INT COMMENT '保质期(天)',
is_batch TINYINT DEFAULT 0 COMMENT '是否批次管理',
is_sn TINYINT DEFAULT 0 COMMENT '是否序列号管理'
);
4. 库存明细表
CREATE TABLE inventory (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
product_id INT NOT NULL,
location_id INT NOT NULL,
quantity INT NOT NULL COMMENT '当前数量',
batch_no VARCHAR(30) COMMENT '批次号',
production_date DATE COMMENT '生产日期',
expiration_date DATE COMMENT '失效日期',
status ENUM('正常','锁定','质检中','冻结') DEFAULT '正常',
last_inbound_time DATETIME COMMENT '最后入库时间',
FOREIGN KEY (product_id) REFERENCES product(id),
FOREIGN KEY (location_id) REFERENCES storage_location(id),
UNIQUE KEY idx_unique_stock (product_id, location_id, batch_no) -- 批次唯一约束
);
5. 入库单管理
-- 入库主单
CREATE TABLE inbound_order (
id INT PRIMARY KEY AUTO_INCREMENT,
order_no VARCHAR(30) UNIQUE NOT NULL COMMENT '入库单号',
order_type ENUM('采购','退货','调拨','生产') NOT NULL,
supplier_id INT COMMENT '供应商ID',
warehouse_id INT NOT NULL,
total_quantity INT NOT NULL,
status ENUM('草稿','待收货','部分入库','已完成','已取消') DEFAULT '草稿',
plan_arrive_time DATETIME COMMENT '计划到货时间',
actual_arrive_time DATETIME COMMENT '实际到货时间',
created_by INT NOT NULL COMMENT '创建人'
);
-- 入库明细
CREATE TABLE inbound_detail (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
order_id INT NOT NULL,
product_id INT NOT NULL,
plan_quantity INT NOT NULL COMMENT '计划数量',
actual_quantity INT DEFAULT 0 COMMENT '实际入库数量',
location_id INT NOT NULL COMMENT '上架库位',
batch_no VARCHAR(30) COMMENT '批次号',
FOREIGN KEY (order_id) REFERENCES inbound_order(id),
FOREIGN KEY (product_id) REFERENCES product(id),
FOREIGN KEY (location_id) REFERENCES storage_location(id)
);
6. 出库单管理
-- 出库主单
CREATE TABLE outbound_order (
id INT PRIMARY KEY AUTO_INCREMENT,
order_no VARCHAR(30) UNIQUE NOT NULL COMMENT '出库单号',
order_type ENUM('销售','退货','调拨','领用') NOT NULL,
customer_id INT COMMENT '客户ID',
warehouse_id INT NOT NULL,
total_quantity INT NOT NULL,
status ENUM('草稿','待分配','拣货中','已发货','已取消') DEFAULT '草稿',
plan_ship_time DATETIME COMMENT '计划发货时间',
actual_ship_time DATETIME COMMENT '实际发货时间'
);
-- 出库明细
CREATE TABLE outbound_detail (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
order_id INT NOT NULL,
product_id INT NOT NULL,
quantity INT NOT NULL COMMENT '需求数量',
picked_quantity INT DEFAULT 0 COMMENT '已拣数量',
from_location_id INT NOT NULL COMMENT '下架库位',
batch_no VARCHAR(30) COMMENT '批次号',
FOREIGN KEY (order_id) REFERENCES outbound_order(id),
FOREIGN KEY (product_id) REFERENCES product(id),
FOREIGN KEY (from_location_id) REFERENCES storage_location(id)
);
7. 库存操作记录表
CREATE TABLE inventory_transaction (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
product_id INT NOT NULL,
location_id INT NOT NULL,
quantity INT NOT NULL COMMENT '变动数量(正数入库/负数出库)',
batch_no VARCHAR(30) COMMENT '批次号',
ref_type ENUM('入库','出库','调整','盘点') NOT NULL,
ref_id VARCHAR(30) NOT NULL COMMENT '关联单据号',
operator_id INT NOT NULL COMMENT '操作人',
transaction_time DATETIME DEFAULT CURRENT_TIMESTAMP,
remark VARCHAR(200) COMMENT '操作备注'
);
8. 盘点管理表
-- 盘点任务
CREATE TABLE stocktake_task (
id INT PRIMARY KEY AUTO_INCREMENT,
task_no VARCHAR(30) UNIQUE NOT NULL,
warehouse_id INT NOT NULL,
plan_time DATETIME COMMENT '计划盘点时间',
start_time DATETIME COMMENT '实际开始时间',
finish_time DATETIME COMMENT '完成时间',
status ENUM('待开始','进行中','已完成','已取消') DEFAULT '待开始',
operator_id INT COMMENT '操作人'
);
-- 盘点明细
CREATE TABLE stocktake_detail (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
task_id INT NOT NULL,
product_id INT NOT NULL,
location_id INT NOT NULL,
system_quantity INT NOT NULL COMMENT '系统数量',
counted_quantity INT COMMENT '盘点数量',
variance INT GENERATED ALWAYS AS (counted_quantity - system_quantity) STORED COMMENT '差异值',
batch_no VARCHAR(30) COMMENT '批次号',
FOREIGN KEY (task_id) REFERENCES stocktake_task(id)
);
关键设计说明:
批次管理
- 通过
batch_no
字段实现批次跟踪 - 库存表(Inventory)使用复合唯一键保证同库位同批次商品唯一性
- 通过
库位精细化管理
- 库位表支持多级结构(仓库 > 区域 > 货架 > 储位)
- 坐标字段实现物理位置快速定位
库存状态机
- 库存状态(status)支持正常/锁定/质检等多状态
- 事务记录表完整跟踪库存变动轨迹
效率优化
- 出入库单分主单/明细两级结构
- 系统数量与盘点数量分离存储,自动计算差异
- 为高频查询字段(SKU、库位码、单据号)建立索引
扩展性考虑
- 商品表预留批次/序列号管理标识
- 仓库类型、库位类型使用枚举字段方便扩展
- 所有核心表包含操作时间戳和操作人字段
建议根据实际业务需求添加以下扩展:
- 序列号管理表(SN管理)
- 供应商/客户信息表
- 库存预警规则表
- 波次策略配置表(用于优化拣货)
- 作业任务调度表
此设计满足WMS系统的基础功能需求,支持多仓库、多货主、批次管理、库存状态控制等核心场景,同时保证数据的完整性和可追溯性。
7️⃣ 参考 7
一个完整的WMS(仓库管理系统)数据库设计需要覆盖仓库的核心业务流程。以下是一个核心表结构设计及其说明,基于常见的仓库管理需求设计:
核心表清单 & 关键字段说明
1. 仓库基础信息
warehouse
(仓库表)id
(PK, 主键)name
(仓库名称)code
(仓库编码, 唯一)address
(地址)manager
(负责人)status
(状态: 启用/禁用)capacity
(总容量)type
(仓库类型: 普通仓、冷链仓、保税仓…)
location
(库位表) - 核心!id
(PK)warehouse_id
(FK, 所属仓库)zone
(库区: 如A区、B区、收货区、发货区、质检区、退货区、残品区)aisle
(通道号)rack
(货架号)shelf
(层号)position
(列号/位号)location_code
(完整库位编码, e.g.,A-01-02-03
, 唯一)type
(库位类型: 货架位、地面堆位、托盘位…)status
(状态: 空置、占用、锁定、禁用)capacity
(容量限制, e.g., 体积、重量、托盘数)current_quantity
(当前存放数量/体积/重量 - 冗余设计,便于快速查询)
2. 物料/商品信息
sku
(Stock Keeping Unit, 库存最小单元表) - 核心!id
(PK)sku_code
(SKU编码, 唯一, e.g., 商品条码或内部编码)name
(商品名称)specification
(规格型号)unit
(基本单位: 个、箱、千克、米…)length
,width
,height
,volume
(长宽高体积)weight
(重量)category_id
(FK, 商品分类)supplier_id
(FK, 默认供应商)safety_stock
(安全库存)shelf_life
(保质期, 天)is_batch
(是否管理批次)is_serial
(是否管理序列号)custom_attrs
(JSON, 扩展自定义属性)
sku_category
(商品分类表)id
(PK)name
(分类名)parent_id
(父分类ID, 树形结构)
3. 库存管理 - 核心!
inventory
(库存表) - 最核心!id
(PK)sku_id
(FK, 商品ID)location_id
(FK, 库位ID)batch_number
(批次号, 若管理批次) - 重要!production_date
(生产日期)expiration_date
(过期日期) - 重要!quantity
(当前数量) - 核心数据!locked_quantity
(锁定数量, e.g., 待出库、移库中) - 核心!available_quantity
(可用数量 =quantity - locked_quantity
) - 冗余,核心!status
(库存状态: 正常、待检、冻结、残损…) - 重要!last_inbound_time
(最后入库时间)last_outbound_time
(最后出库时间)inventory_version
(库存版本号, 用于乐观锁) - 并发控制关键!-
注意: 此表设计决定了库存精度(库位+批次级别)。组合唯一索引通常为
(sku_id, location_id, batch_number, status)
。
4. 供应商与客户
supplier
(供应商表)id
(PK)name
(名称)code
(编码)contact_info
(联系方式)
customer
(客户表)id
(PK)name
(名称)code
(编码)contact_info
(联系方式)
5. 入库管理
asn
(Advance Shipping Notice, 预收货通知单/入库单)id
(PK)asn_number
(单号, 唯一)type
(入库类型: 采购入库、调拨入库、退货入库、生产入库…)supplier_id
(FK, 供应商)expected_arrival_time
(预计到货时间)status
(状态: 新建、部分收货、已完成、关闭)warehouse_id
(FK, 目标仓库)
asn_detail
(入库单明细)id
(PK)asn_id
(FK)sku_id
(FK)expected_quantity
(预期数量)received_quantity
(已收数量) - 更新中batch_number
(预期批次, 可选)
receiving
(收货任务/记录)id
(PK)asn_id
(FK)operator
(操作员)receiving_time
(收货时间)status
(状态: 进行中、完成)
putaway_task
(上架任务表)id
(PK)source_doc_id
(关联单据ID, e.g., ASN ID 或 Receiving ID)source_doc_type
(单据类型)sku_id
(FK)quantity
(待上架数量)from_location_id
(来源库位, 通常是收货暂存区)to_location_id
(目标库位)status
(状态: 待分配、已分配、进行中、已完成、取消)operator
(操作员)assigned_time
,start_time
,completion_time
(分配/开始/完成时间)
6. 出库管理
order
(出库单/订单) - (可能是销售订单、调拨出库单、退货出库单等)id
(PK)order_number
(单号, 唯一)type
(出库类型: 销售出库、调拨出库、退货出库、领料出库…)customer_id
(FK, 客户, 销售出库时)warehouse_id
(FK, 发货仓库)status
(状态: 新建、部分拣货、部分发货、已完成、关闭)priority
(优先级)required_ship_time
(要求发货时间)
order_detail
(出库单明细)id
(PK)order_id
(FK)sku_id
(FK)requested_quantity
(申请数量)allocated_quantity
(已分配库存数量) - 更新中picked_quantity
(已拣货数量) - 更新中shipped_quantity
(已发货数量) - 更新中
picking_task
(拣货任务表)id
(PK)order_id
(FK, 关联出库单)order_detail_id
(FK, 关联明细)wave_number
(波次号, 用于波次拣货)sku_id
(FK)quantity
(需拣货数量)from_location_id
(来源库位)status
(状态: 待分配、已分配、进行中、已完成、取消)picking_method
(拣货方式: 按单拣、按波次拣、按库位拣…)operator
(操作员)assigned_time
,start_time
,completion_time
shipping
(发货单/装运单)id
(PK)order_id
(FK)carrier
(承运商)tracking_number
(物流单号)shipping_time
(发货时间)operator
(操作员)status
(状态: 待发货、已发货)
7. 库存移动与调整
move_task
(移库任务表)id
(PK)sku_id
(FK)batch_number
(批次)quantity
(移动数量)from_location_id
(源库位)to_location_id
(目标库位)reason
(移库原因: 库存调整、补货、库位优化…)status
(状态: 创建、进行中、完成、取消)operator
created_time
,completion_time
inventory_adjustment
(库存调整单)id
(PK)adjust_number
(调整单号)warehouse_id
(FK)type
(调整类型: 盘盈、盘亏、报损、报溢、成本调整…)reason
(详细原因)status
(状态: 草稿、已审核)operator
,approver
,approve_time
adjustment_detail
(调整明细)id
(PK)adjustment_id
(FK)sku_id
(FK)location_id
(FK)batch_number
(批次)before_quantity
(调整前数量)after_quantity
(调整后数量)adjusted_quantity
(调整量 = after - before)
8. 盘点管理
stocktake_plan
(盘点计划)id
(PK)plan_number
(计划号)warehouse_id
(FK)type
(盘点方式: 全盘、循环盘点、动碰盘点、指定库位/商品)start_time
,end_time
(计划时间)status
(状态: 计划中、进行中、已完成、取消)
stocktake_task
(盘点任务)id
(PK)plan_id
(FK)location_id
(FK, 盘点的库位)operator
(盘点人)status
(状态: 待盘点、盘点中、已提交、已复盘)counting_time
(初盘时间)recounting_time
(复盘时间)
stocktake_record
(盘点记录)id
(PK)task_id
(FK)sku_id
(FK)batch_number
(批次)system_quantity
(系统账面数量)counted_quantity
(初盘数量)recounted_quantity
(复盘数量)adjusted_quantity
(最终确认调整量) -> 最终会生成库存调整单
9. 系统基础与权限 (可选但重要)
user
(用户表)id
(PK)username
(登录名, 唯一)password
(加密存储)real_name
(真实姓名)role_id
(FK, 角色)status
(状态: 启用/禁用)
role
(角色表)id
(PK)name
(角色名)description
(描述)
permission
(权限表)id
(PK)name
(权限名, e.g.,inventory:view
,asn:create
)description
(描述)
role_permission
(角色-权限关联表)role_id
(FK)permission_id
(FK)
关键设计要点与优化建议
- 库位管理是核心 (
location
): 精确的库位管理是实现高效作业的基础。库位编码规则需清晰且可扩展。 - 库存模型 (
inventory
): 采用 库位 + SKU + 批次 (+状态) 的精细化管理模型。available_quantity
是业务逻辑的关键。 - 库存事务与并发控制: 任何改变库存的操作(入库、出库、移库、调整)都必须通过事务处理,并考虑高并发下的数据一致性。
inventory_version
字段是实现乐观锁的常见手段。 - 任务驱动 (
*_task
表): 将仓库作业(上架、拣货、移库)分解为任务,是WMS调度和人员管理的基础。任务状态机设计要清晰。 - 批次与效期管理:
batch_number
,production_date
,expiration_date
对于食品、药品、化工等行业至关重要。查询和作业(如FIFO)需依赖这些字段。 - 单据状态流: ASN、Order、Adjustment等单据的状态流转需要明确定义,并在数据库和业务逻辑中严格管理。
- 冗余字段: 适当使用冗余字段(如
current_quantity
inlocation
,available_quantity
ininventory
,received_quantity
inasn_detail
,picked_quantity
inorder_detail
)可以极大提升高频查询性能,但需注意在事务中维护一致性。 - 索引优化:
- 高频查询字段必建索引 (e.g.,
sku.sku_code
,location.location_code
,inventory
表的(sku_id, location_id, batch_number, status)
,asn.asn_number
,order.order_number
)。 - 任务表的状态字段通常需要索引。
- 日期范围查询字段建索引 (e.g.,
inventory.expiration_date
,asn.expected_arrival_time
,order.required_ship_time
)。
- 高频查询字段必建索引 (e.g.,
- 数据归档: 考虑历史任务记录、过期的库存记录(
inventory
中quantity=0
的记录)的归档策略,保证主业务表的高性能。 - 扩展性:
- 使用
type
字段区分不同类型(仓库、库位、入库单、出库单、调整单等)。 - 使用
JSON
字段(如sku.custom_attrs
)存储非核心或可变的扩展属性。 - 预留一些
reserved
字段以备不时之需。
- 使用
示例关系图 (简化版)
┌──────────┐ ┌──────────┐ ┌────────────┐ ┌─────────────┐
│ Warehouse│1───n──│ Location │1───n──│ Inventory │n───1──│ SKU │
└──────────┘ └──────────┘ └────────────┘ └─────────────┘
^ ^ ▲
| | │
| └──────┐ │
┌──────────┐ ┌─────┴─────┐ │ ┌──────────┐ │
│ Supplier │1──n│ ASN │n──1──┼─────n──│ASN Detail├────┘
└──────────┘ └───────────┘ │ └──────────┘
│ │
▼ (生成) ▼ (生成)
┌──────────┐ ┌───────────┐
│Receiving│ │PutawayTask│
└──────────┘ └───────────┘
┌──────────┐ ┌──────────┐ ┌───────────┐ ┌─────────────┐
│ Customer │1──n│ Order │n──1──│OrderDetail├──n───┼──┐ │
└──────────┘ └──────────┘ └───────────┘ │ ▼ │
│ │┌───────────┐│
▼ (生成) ││PickingTask││
┌───────────┐ ┌──────────┐ │└───────────┘│
│PickingTask├─────►│ Inventory│◄─────────┘ │
└───────────┘ └──────────┘ │
(消耗) ▲ ▲ (补充) │
│ │ │
│ └───────────────┐ │
│ │ │
┌──────┴──────┐ ┌──────┴─────┐ │
│ MoveTask │ │Stocktake │ │
└─────────────┘ │ Record/Plan│ │
└────────────┘ │
▼
┌──────────────────┐
│InventoryAdjustment
└──────────────────┘
技术选型建议
- 数据库: MySQL, PostgreSQL (推荐,功能强大), SQL Server, Oracle。
- ORM 框架: MyBatis (灵活), Hibernate/JPA (开发快)。
- 缓存: Redis (库存缓存、任务队列、配置缓存)。
- 消息队列: RabbitMQ, Kafka (异步处理任务、库存变更通知、集成其他系统)。
这个设计提供了一个坚实的基础,实际项目中需要根据具体的业务场景、行业规范(如医药GSP)、仓库规模、自动化程度等进行详细调整和扩展。务必进行充分的业务需求分析和数据模型评审。
8️⃣ 参考 8
以下是一个通用WMS(仓库管理系统)的核心数据库表设计,包含关键实体及其关系,采用规范化设计满足基本业务需求:
-- 仓库基础信息
CREATE TABLE warehouse (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NOT NULL UNIQUE, -- 仓库名称
code VARCHAR(20) NOT NULL UNIQUE, -- 仓库编码
address VARCHAR(100), -- 仓库地址
manager VARCHAR(30), -- 负责人
status TINYINT DEFAULT 1, -- 状态(0:停用 1:启用)
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 库区设置(仓库内分区)
CREATE TABLE storage_zone (
id INT PRIMARY KEY AUTO_INCREMENT,
warehouse_id INT NOT NULL, -- 所属仓库
name VARCHAR(50) NOT NULL, -- 库区名称(如:A区、B区)
type VARCHAR(20), -- 类型(常温区、冷藏区、危险品区)
capacity INT, -- 库位容量
FOREIGN KEY (warehouse_id) REFERENCES warehouse(id) ON DELETE CASCADE
);
-- 货架管理
CREATE TABLE shelf (
id INT PRIMARY KEY AUTO_INCREMENT,
zone_id INT NOT NULL, -- 所属库区
code VARCHAR(20) NOT NULL UNIQUE, -- 货架编码(如:A-01)
max_level TINYINT DEFAULT 5, -- 最大层数
max_column TINYINT DEFAULT 10, -- 最大列数
status TINYINT DEFAULT 1, -- 状态(0:禁用 1:启用)
FOREIGN KEY (zone_id) REFERENCES storage_zone(id) ON DELETE CASCADE
);
-- 库位设计(最小存储单元)
CREATE TABLE storage_location (
id INT PRIMARY KEY AUTO_INCREMENT,
shelf_id INT NOT NULL,
location_code VARCHAR(30) NOT NULL UNIQUE, -- 库位编码(如:A-01-02-03)
level TINYINT NOT NULL, -- 货架层数
column_num TINYINT NOT NULL, -- 货架列数
volume DECIMAL(10,2), -- 容积(m³)
max_weight DECIMAL(10,2), -- 最大承重(kg)
status TINYINT DEFAULT 1, -- 状态(0:禁用 1:空位 2:已占用)
FOREIGN KEY (shelf_id) REFERENCES shelf(id) ON DELETE CASCADE
);
-- 商品/物料主数据
CREATE TABLE sku (
id INT PRIMARY KEY AUTO_INCREMENT,
sku_code VARCHAR(50) NOT NULL UNIQUE, -- 商品唯一编码
name VARCHAR(100) NOT NULL, -- 商品名称
specification VARCHAR(100), -- 规格型号
unit VARCHAR(20), -- 单位(件/箱/千克)
category VARCHAR(50), -- 商品类别
weight DECIMAL(10,2), -- 单件重量(kg)
volume DECIMAL(10,2), -- 单件体积(m³)
shelf_life INT, -- 保质期(天)
is_batch TINYINT DEFAULT 0, -- 是否批次管理(0:否 1:是)
is_sn TINYINT DEFAULT 0 -- 是否序列号管理(0:否 1:是)
);
-- 库存表(核心)
CREATE TABLE inventory (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
location_id INT NOT NULL, -- 库位ID
sku_id INT NOT NULL, -- 商品ID
quantity INT NOT NULL DEFAULT 0, -- 当前数量
batch_no VARCHAR(50), -- 批次号
production_date DATE, -- 生产日期
expiry_date DATE, -- 过期日期
last_in_time DATETIME, -- 最后入库时间
last_out_time DATETIME, -- 最后出库时间
lock_status TINYINT DEFAULT 0, -- 锁定状态(0:正常 1:锁定)
UNIQUE KEY (location_id, sku_id, batch_no), -- 唯一约束
FOREIGN KEY (location_id) REFERENCES storage_location(id),
FOREIGN KEY (sku_id) REFERENCES sku(id)
);
-- 入库单主表
CREATE TABLE inbound_order (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
order_no VARCHAR(30) NOT NULL UNIQUE, -- 入库单号
order_type TINYINT NOT NULL, -- 入库类型(1:采购 2:调拨 3:退货...)
warehouse_id INT NOT NULL, -- 目标仓库
supplier_id INT, -- 供应商ID
status TINYINT DEFAULT 0, -- 状态(0:创建 1:部分入库 2:完成)
total_quantity INT, -- 计划总数
received_quantity INT DEFAULT 0, -- 已收数量
created_time DATETIME NOT NULL,
completed_time DATETIME,
FOREIGN KEY (warehouse_id) REFERENCES warehouse(id)
);
-- 入库明细表
CREATE TABLE inbound_detail (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
order_id BIGINT NOT NULL, -- 入库单ID
sku_id INT NOT NULL, -- 商品ID
plan_quantity INT NOT NULL, -- 计划数量
actual_quantity INT DEFAULT 0, -- 实际数量
location_id INT, -- 上架库位
batch_no VARCHAR(50), -- 批次号
production_date DATE, -- 生产日期
status TINYINT DEFAULT 0, -- 明细状态(0:待入库 1:完成)
FOREIGN KEY (order_id) REFERENCES inbound_order(id) ON DELETE CASCADE,
FOREIGN KEY (sku_id) REFERENCES sku(id),
FOREIGN KEY (location_id) REFERENCES storage_location(id)
);
-- 出库单主表
CREATE TABLE outbound_order (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
order_no VARCHAR(30) NOT NULL UNIQUE, -- 出库单号
order_type TINYINT NOT NULL, -- 出库类型(1:销售 2:调拨 3:退货...)
warehouse_id INT NOT NULL, -- 源仓库
customer_id INT, -- 客户ID
status TINYINT DEFAULT 0, -- 状态(0:创建 1:部分出库 2:完成)
total_quantity INT, -- 计划总数
shipped_quantity INT DEFAULT 0, -- 已出数量
created_time DATETIME NOT NULL,
completed_time DATETIME,
FOREIGN KEY (warehouse_id) REFERENCES warehouse(id)
);
-- 出库明细表
CREATE TABLE outbound_detail (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
order_id BIGINT NOT NULL, -- 出库单ID
sku_id INT NOT NULL, -- 商品ID
plan_quantity INT NOT NULL, -- 计划数量
actual_quantity INT DEFAULT 0, -- 实际数量
from_location_id INT, -- 下架库位
batch_no VARCHAR(50), -- 批次号
status TINYINT DEFAULT 0, -- 明细状态(0:待出库 1:完成)
FOREIGN KEY (order_id) REFERENCES outbound_order(id) ON DELETE CASCADE,
FOREIGN KEY (sku_id) REFERENCES sku(id),
FOREIGN KEY (from_location_id) REFERENCES storage_location(id)
);
-- 库存移动记录(库内操作)
CREATE TABLE inventory_movement (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
ref_no VARCHAR(30) NOT NULL, -- 移动单号
sku_id INT NOT NULL, -- 商品ID
batch_no VARCHAR(50), -- 批次号
from_location INT NOT NULL, -- 源库位
to_location INT NOT NULL, -- 目标库位
quantity INT NOT NULL, -- 移动数量
operator VARCHAR(30) NOT NULL, -- 操作人
move_time DATETIME DEFAULT CURRENT_TIMESTAMP,
reason VARCHAR(100), -- 移动原因
FOREIGN KEY (sku_id) REFERENCES sku(id),
FOREIGN KEY (from_location) REFERENCES storage_location(id),
FOREIGN KEY (to_location) REFERENCES storage_location(id)
);
-- 盘点表
CREATE TABLE inventory_check (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
check_no VARCHAR(30) NOT NULL UNIQUE, -- 盘点单号
warehouse_id INT NOT NULL,
check_type TINYINT, -- 盘点类型(1:周期盘点 2:动碰盘点...)
status TINYINT DEFAULT 0, -- 状态(0:进行中 1:已完成)
start_time DATETIME,
end_time DATETIME,
FOREIGN KEY (warehouse_id) REFERENCES warehouse(id)
);
-- 盘点明细
CREATE TABLE check_detail (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
check_id BIGINT NOT NULL,
location_id INT NOT NULL,
sku_id INT NOT NULL,
batch_no VARCHAR(50),
system_qty INT NOT NULL, -- 系统数量
actual_qty INT, -- 实际数量
variance INT, -- 差异数量
checker VARCHAR(30), -- 盘点人
check_time DATETIME,
FOREIGN KEY (check_id) REFERENCES inventory_check(id) ON DELETE CASCADE,
FOREIGN KEY (location_id) REFERENCES storage_location(id),
FOREIGN KEY (sku_id) REFERENCES sku(id)
);
核心设计说明:
层级结构设计
仓库 → 库区 → 货架 → 库位
四级结构,支持灵活的仓库布局库存管理关键特性:
- 批次管理(batch_no + 有效期)
- 库位状态管理(空位/占用/禁用)
- 库存锁定机制(lock_status)
- 双单位管理(基本单位+包装单位,需扩展)
事务单据设计:
- 入库单:支持采购入库、退货入库、调拨入库等
- 出库单:支持销售出库、退货出库、调拨出库等
- 库内移动:记录库位调整
- 盘点单:支持差异自动计算
扩展性考虑:
- 添加
supplier
(供应商)和customer
(客户)表关联 - 增加
unit_conversion
表处理多单位转换 - 添加
user
表管理操作员权限 - 增加
warehouse_area
表支持多仓库网络
- 添加
性能优化:
- 库存表建立
(location_id, sku_id, batch_no)
联合索引 - 单据表使用独立编号生成器(非自增ID)
- 频繁查询字段添加索引(如sku_code、location_code)
- 库存表建立
关键业务表关系图:
此设计满足WMS基础功能需求,实际生产环境需根据业务场景扩展以下模块:
- 序列号管理(SN管理)
- 质检管理(QC模块)
- 越库操作(Cross-Docking)
- 库存预警策略
- 作业策略引擎(上架策略、拣货策略)
- 报表分析模块(库存周转率、库龄分析)
9️⃣ 参考 9
以下是针对通用型WMS仓库管理系统的核心数据库表设计精简版,聚焦关键模块(基础信息、库存管理、入库、出库、库内操作),满足80%的业务场景需求:
一、基础信息模块
表名 | 核心字段 | 说明 |
---|---|---|
warehouse |
id, code, name, status | 仓库主信息 |
location |
id, warehouse_id, code, type, max_qty, status | 库位(核心!状态字段必选) |
sku |
id, code, name, spec, unit, volume, weight, is_batch | 商品(批次管理标志) |
supplier |
id, code, name, contact | 供应商 |
customer |
id, code, name, address | 客户 |
user |
id, name, role, warehouse_id | 操作员及权限 |
二、库存管理模块(核心)
表名 | 核心字段 | 说明 |
---|---|---|
inventory (核心表) |
id, location_id, sku_id, batch_no, quantity, allocated_qty, status | 原子级库存(库位+SKU+批次唯一) |
inventory_transaction |
id, type, sku_id, location_id, qty_change, ref_id, operator_id | 所有库存变动的流水记录(审计溯源) |
✅ 关键设计原则:
- 库存原子性:库存表按
location_id + sku_id + batch_no
唯一组合- 状态字段:
inventory.status
(正常/冻结/残次品)- 双重锁机制:
allocated_qty
(已分配数) + 事务流水表防超卖
三、入库流程
表名 | 核心字段 | 关联关系 |
---|---|---|
asn (到货通知单) |
id, no, supplier_id, status | → 供应商 |
asn_detail |
asn_id, sku_id, plan_qty | → 商品 |
receiving (收货单) |
id, asn_id, status, operator_id | → ASN单 |
receiving_detail |
receiving_id, sku_id, actual_qty, batch_no | 生成批次号 |
putaway_task (上架任务) |
receiving_detail_id, to_location_id, status | → 目标库位 |
四、出库流程
表名 | 核心字段 | 关键操作 |
---|---|---|
order (出库单) |
id, no, customer_id, status | 状态驱动流程 |
order_detail |
order_id, sku_id, demand_qty, picked_qty | 跟踪拣货进度 |
picking_task (拣货任务) |
order_detail_id, from_location_id, pick_qty | 关联库存分配 |
shipping (发货单) |
order_id, carrier_no, status | 最终出库确认 |
🔄 状态流转:
订单状态:新建 → 已分配 → 部分拣货 → 拣货完成 → 已发货
五、库内操作
表名 | 核心字段 | 业务场景 |
---|---|---|
stock_move (移库单) |
sku_id, batch_no, from_loc, to_loc, qty | 库位调整/补货 |
stock_count (盘点单) |
location_id, sku_id, batch_no, sys_qty, actual_qty | 库存校对 |
stock_adjust (调整单) |
sku_id, location_id, batch_no, qty_change, reason | 盈亏处理 |
六、扩展设计建议
索引优化:
- 高频查询字段:
sku_id
+location_id
+status
- 事务流水表:
ref_id
(关联单据ID) +transaction_time
- 高频查询字段:
并发控制:
UPDATE inventory SET quantity = quantity - 10, version = version + 1 WHERE id = 100 AND version = 5; -- 乐观锁防止超卖
数据归档:
- 将
inventory_transaction
按月分区,历史数据压缩存储
- 将
字典表(可选但推荐):
dict_inv_status
(库存状态)dict_order_type
(订单类型)dict_location_type
(库位类型)
关键ER图关系
为什么这样设计?
库存准确性:
- 通过
inventory
表原子化记录(库位+SKU+批次),避免汇总误差 inventory_transaction
记录每次变动,支持溯源
- 通过
流程驱动:
- 单据状态机(如订单状态)驱动业务流程
- 上架/拣货任务与库位强绑定
扩展性:
- 批次管理通过
is_batch
标志和batch_no
字段实现 - 库位类型(存储位/拣货位)通过
location.type
区分
- 批次管理通过
💡 适合场景:电商仓库、制造业成品仓、零售配送中心等通用仓储场景,可根据业务增减模块(如序列号管理、质检流程)。
🔟 参考 10
下面是一个通用WMS(仓库管理系统)的数据库表设计,包含核心模块和关键字段。设计遵循数据库规范化原则,同时考虑了扩展性和实际业务需求:
核心表结构设计
1. 仓库基础信息表
CREATE TABLE warehouse (
warehouse_id INT PRIMARY KEY AUTO_INCREMENT,
warehouse_code VARCHAR(20) UNIQUE NOT NULL, -- 仓库编码
warehouse_name VARCHAR(100) NOT NULL, -- 仓库名称
address VARCHAR(200), -- 地址
manager VARCHAR(50), -- 负责人
status TINYINT DEFAULT 1 NOT NULL, -- 状态(0:停用 1:启用)
create_time DATETIME DEFAULT CURRENT_TIMESTAMP,
update_time DATETIME ON UPDATE CURRENT_TIMESTAMP
);
2. 库区/库位表
CREATE TABLE location (
location_id INT PRIMARY KEY AUTO_INCREMENT,
warehouse_id INT NOT NULL, -- 所属仓库
parent_location_id INT, -- 父库位(库区>库位)
location_code VARCHAR(20) NOT NULL, -- 库位编码
location_type TINYINT NOT NULL, -- 类型(1:库区 2:货架 3:储位)
capacity DECIMAL(10,2), -- 容量限制(kg/m³)
current_capacity DECIMAL(10,2) DEFAULT 0, -- 当前容量
status TINYINT DEFAULT 1, -- 状态(0:禁用 1:空闲 2:占用)
is_pick_location BOOLEAN DEFAULT FALSE, -- 是否为拣货位
FOREIGN KEY (warehouse_id) REFERENCES warehouse(warehouse_id)
);
3. 物料主数据表
CREATE TABLE material (
material_id INT PRIMARY KEY AUTO_INCREMENT,
sku VARCHAR(50) UNIQUE NOT NULL, -- 唯一物料编码
material_name VARCHAR(100) NOT NULL,
specification VARCHAR(200), -- 规格型号
unit VARCHAR(20) NOT NULL, -- 计量单位
material_type VARCHAR(30), -- 物料分类
weight DECIMAL(10,2), -- 单件重量(kg)
volume DECIMAL(10,2), -- 单件体积(m³)
shelf_life INT, -- 保质期(天)
is_batch_control BOOLEAN DEFAULT FALSE, -- 批次管理
is_sn_control BOOLEAN DEFAULT FALSE, -- 序列号管理
min_stock INT, -- 安全库存
max_stock INT, -- 最大库存
create_time DATETIME DEFAULT CURRENT_TIMESTAMP
);
4. 库存表 (核心)
CREATE TABLE inventory (
inventory_id BIGINT PRIMARY KEY AUTO_INCREMENT,
warehouse_id INT NOT NULL,
location_id INT NOT NULL,
material_id INT NOT NULL,
quantity DECIMAL(12,4) NOT NULL DEFAULT 0, -- 当前数量
batch_no VARCHAR(50), -- 批次号
serial_no VARCHAR(100), -- 序列号(JSON数组)
production_date DATE, -- 生产日期
expiry_date DATE, -- 过期日期
inventory_status TINYINT NOT NULL DEFAULT 1, -- 状态(1:正常 2:冻结 3:质检)
last_inbound_time DATETIME, -- 最后入库时间
last_outbound_time DATETIME, -- 最后出库时间
version INT NOT NULL DEFAULT 0, -- 乐观锁版本号
UNIQUE KEY uq_stock (warehouse_id, location_id, material_id, batch_no),
FOREIGN KEY (warehouse_id) REFERENCES warehouse(warehouse_id),
FOREIGN KEY (location_id) REFERENCES location(location_id),
FOREIGN KEY (material_id) REFERENCES material(material_id)
);
5. 入库单表
CREATE TABLE inbound_order (
order_id BIGINT PRIMARY KEY AUTO_INCREMENT,
order_no VARCHAR(50) UNIQUE NOT NULL, -- 入库单号
order_type TINYINT NOT NULL, -- 类型(1:采购 2:退货 3:调拨)
warehouse_id INT NOT NULL,
supplier_id INT, -- 供应商
reference_no VARCHAR(50), -- 关联单号(采购单等)
total_quantity DECIMAL(12,4) NOT NULL,
actual_quantity DECIMAL(12,4) DEFAULT 0, -- 实际入库量
status TINYINT NOT NULL DEFAULT 0, -- 状态(0:草稿 1:已审核 2:部分入库 3:完成)
operator VARCHAR(50), -- 操作员
create_time DATETIME DEFAULT CURRENT_TIMESTAMP,
complete_time DATETIME
);
6. 入库明细表
CREATE TABLE inbound_detail (
detail_id BIGINT PRIMARY KEY AUTO_INCREMENT,
order_id BIGINT NOT NULL,
material_id INT NOT NULL,
plan_quantity DECIMAL(12,4) NOT NULL, -- 计划数量
actual_quantity DECIMAL(12,4) DEFAULT 0, -- 实际数量
location_id INT NOT NULL, -- 上架库位
batch_no VARCHAR(50), -- 批次号
serial_nos JSON, -- 序列号列表
quality_status TINYINT, -- 质检状态
FOREIGN KEY (order_id) REFERENCES inbound_order(order_id)
);
7. 出库单表
CREATE TABLE outbound_order (
order_id BIGINT PRIMARY KEY AUTO_INCREMENT,
order_no VARCHAR(50) UNIQUE NOT NULL, -- 出库单号
order_type TINYINT NOT NULL, -- 类型(1:销售 2:退货 3:调拨)
warehouse_id INT NOT NULL,
customer_id INT, -- 客户
reference_no VARCHAR(50), -- 关联单号(销售单等)
total_quantity DECIMAL(12,4) NOT NULL,
actual_quantity DECIMAL(12,4) DEFAULT 0, -- 实际出库量
status TINYINT NOT NULL DEFAULT 0, -- 状态(0:草稿 1:已分配 2:部分出库 3:完成)
operator VARCHAR(50), -- 操作员
create_time DATETIME DEFAULT CURRENT_TIMESTAMP,
complete_time DATETIME
);
8. 出库明细表
CREATE TABLE outbound_detail (
detail_id BIGINT PRIMARY KEY AUTO_INCREMENT,
order_id BIGINT NOT NULL,
material_id INT NOT NULL,
plan_quantity DECIMAL(12,4) NOT NULL, -- 计划数量
actual_quantity DECIMAL(12,4) DEFAULT 0, -- 实际数量
from_location_id INT NOT NULL, -- 下架库位
batch_no VARCHAR(50), -- 批次号
serial_nos JSON, -- 序列号列表
FOREIGN KEY (order_id) REFERENCES outbound_order(order_id)
);
9. 库存移动表
CREATE TABLE inventory_movement (
movement_id BIGINT PRIMARY KEY AUTO_INCREMENT,
from_location_id INT NOT NULL, -- 源库位
to_location_id INT NOT NULL, -- 目标库位
material_id INT NOT NULL,
quantity DECIMAL(12,4) NOT NULL,
batch_no VARCHAR(50),
movement_type TINYINT NOT NULL, -- 移动类型(1:补货 2:调整)
operator VARCHAR(50),
movement_time DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (from_location_id) REFERENCES location(location_id),
FOREIGN KEY (to_location_id) REFERENCES location(location_id)
);
10. 盘点表
CREATE TABLE inventory_check (
check_id BIGINT PRIMARY KEY AUTO_INCREMENT,
warehouse_id INT NOT NULL,
check_no VARCHAR(50) UNIQUE NOT NULL,
check_time DATETIME NOT NULL, -- 盘点时间
operator VARCHAR(50),
status TINYINT DEFAULT 0, -- 状态(0:进行中 1:已完成)
create_time DATETIME DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE check_detail (
detail_id BIGINT PRIMARY KEY AUTO_INCREMENT,
check_id BIGINT NOT NULL,
location_id INT NOT NULL,
material_id INT NOT NULL,
system_quantity DECIMAL(12,4) NOT NULL, -- 系统数量
actual_quantity DECIMAL(12,4) NOT NULL, -- 实盘数量
batch_no VARCHAR(50),
variance DECIMAL(12,4) AS (actual_quantity - system_quantity), -- 差异计算
variance_reason VARCHAR(200),
FOREIGN KEY (check_id) REFERENCES inventory_check(check_id)
);
关键设计说明
库存管理核心
- 库存表(inventory)采用
(仓库+库位+物料+批次)
唯一键设计 - 支持批次/序列号双管理模式
- 包含乐观锁(version字段)解决并发更新
- 库存表(inventory)采用
业务单据设计
- 入库/出库单采用
主单+明细
结构 - 状态机管理(草稿->审核->执行->完成)
- 支持关联业务单据(采购单/销售单等)
- 入库/出库单采用
库位管理
- 树形结构库位设计(库区->货架->储位)
- 容量管理(物理限制+当前容量)
- 拣货位标记(is_pick_location)
扩展性设计
- 物料类型字段支持自定义分类
- 单据类型字段支持多种业务场景
- JSON字段存储序列号(兼容不同物料管理要求)
性能优化
- 大表使用BIGINT主键
- 关键查询字段建立索引(sku、库位编码、单据号)
- 计算字段(variance)减少业务逻辑复杂度
补充表建议
-- 供应商表
CREATE TABLE supplier (
supplier_id INT PRIMARY KEY AUTO_INCREMENT,
supplier_code VARCHAR(20) UNIQUE,
supplier_name VARCHAR(100) NOT NULL
);
-- 客户表
CREATE TABLE customer (
customer_id INT PRIMARY KEY AUTO_INCREMENT,
customer_code VARCHAR(20) UNIQUE,
customer_name VARCHAR(100) NOT NULL
);
-- 库存事务日志表(用于追溯)
CREATE TABLE inventory_transaction (
trans_id BIGINT PRIMARY KEY AUTO_INCREMENT,
material_id INT NOT NULL,
warehouse_id INT NOT NULL,
location_id INT NOT NULL,
quantity_change DECIMAL(12,4) NOT NULL, -- 库存变动量
trans_type VARCHAR(20) NOT NULL, -- 事务类型(IN/OUT/MOVE)
ref_no VARCHAR(50) NOT NULL, -- 关联单据号
trans_time DATETIME DEFAULT CURRENT_TIMESTAMP
);
设计原则
- 数据一致性:通过事务保证库存操作的原子性
- 可追溯性:事务日志记录所有库存变动
- 灵活性:支持批次/序列号/非批次多种管理模式
- 性能考虑:读写分离设计,高频查询字段单独索引
- 扩展能力:预留自定义字段(如物料分类、单据类型)
此设计可满足中小型WMS系统需求,大型系统可根据业务场景增加分库分表、历史数据归档等机制。实际实施时需根据具体业务流程调整字段细节和索引策略。
🧠 参考 11
以下是针对通用型WMS仓库管理系统的核心数据库表设计,聚焦关键业务模块,兼顾灵活性与可扩展性。设计精简至 20张核心表,满足大多数仓库场景需求(电商、零售、制造业、物流等)。
核心表清单及字段说明
1. 基础数据模块
表名 | 核心字段 | 说明 |
---|---|---|
warehouse |
id , code (唯一), name , address , status (启用/停用), contact_info |
仓库主信息 |
location |
id , warehouse_id , zone_code (库区), loc_code (库位编码唯一), type (存储/拣货/暂存), max_volume , status |
库位管理(最小存储单元) |
item |
id , sku (唯一), name , spec , uom (单位), volume , weight , is_batch (是否批次管理), is_serial (是否序列号) |
商品/物料主数据 |
supplier |
id , code , name , contact |
供应商信息 |
customer |
id , code , name , contact |
客户信息(用于出库) |
2. 库存管理模块
表名 | 核心字段 | 说明 |
---|---|---|
inventory |
id , item_id , location_id , batch_no , serial_no , qty , status (良品/冻结/不良品), prod_date , exp_date |
库存快照(核心表) |
inventory_txn |
id , txn_type (入库/出库/移库/调整), item_id , from_loc , to_loc , qty , batch_no , ref_order_id (关联单据), operator , txn_time |
库存流水(所有操作记录) |
关键设计
inventory
唯一索引:(item_id, location_id, batch_no, serial_no, status)
inventory_txn
高频查询索引:(txn_time, item_id, ref_order_id)
3. 入库管理模块
表名 | 核心字段 | 说明 |
---|---|---|
asn |
id , asn_no (唯一), supplier_id , expected_time , status (新建/收货中/完成) |
预约入库单 |
asn_detail |
id , asn_id , item_id , plan_qty , received_qty |
预约单明细 |
receiving |
id , asn_id , receiving_time , operator , status (待质检/质检完成) |
实际收货单 |
putaway_task |
id , item_id , from_loc (收货区), to_loc (目标库位), qty , operator , status (待执行/完成) |
上架任务 |
4. 出库管理模块
表名 | 核心字段 | 说明 |
---|---|---|
outbound_order |
id , order_no (唯一), customer_id , type (销售/退货), priority , status (新建/拣货中/已发货) |
出库订单 |
outbound_detail |
id , order_id , item_id , order_qty , picked_qty , packed_qty |
出库订单明细 |
picking_task |
id , order_id , item_id , location_id , qty , operator , status |
拣货任务 |
shipping |
id , order_id , shipping_no , carrier , operator , shipped_time |
发货记录 |
5. 库内作业模块
表名 | 核心字段 | 说明 |
---|---|---|
movement_task |
id , item_id , from_loc , to_loc , qty , reason (补货/整理), operator , status |
库内移库/补货任务 |
cycle_count |
id , count_no , warehouse_id , status (进行中/完成), start_time , end_time |
盘点任务单 |
count_detail |
id , count_id , location_id , item_id , batch_no , sys_qty , actual_qty , variance |
盘点明细 |
关键设计原则
去过度范式化
- 允许适度冗余(如
outbound_detail
中存储sku
名称),减少多表关联。 - 库位编码
location.loc_code
全局唯一(例:A-01-02-003
),直接定位仓库位置。
- 允许适度冗余(如
库存双表驱动
inventory
:实时库存快照(高频查询)。inventory_txn
:操作流水(用于对账、追溯)。
状态机设计
- 关键业务表(
asn
,outbound_order
,task
)包含status
字段,用枚举值驱动流程(如出库单状态: 新建→分配→拣货→发货
)。
- 关键业务表(
批次/序列号灵活管理
item.is_batch
/is_serial
控制是否启用批次序列号。- 库存操作时按需填写
batch_no
/serial_no
。
任务驱动作业
- 所有仓库操作(上架、拣货、移库)均通过任务表(
*_task
)驱动,记录操作人、时间、状态。
- 所有仓库操作(上架、拣货、移库)均通过任务表(
核心表关系图
性能优化建议
索引策略
inventory
:(item_id, location_id, status)
+batch_no
(复合索引)inventory_txn
:(txn_time DESC, item_id)
(时间倒序查最新记录)- 任务表:
(status, operator)
(快速查待办任务)
分区表
inventory_txn
按月份分区,避免单表过大。
异步写日志
- 库存流水(
inventory_txn
)通过消息队列异步写入,保证主流程性能。
- 库存流水(
热点数据缓存
- 实时库存(
inventory
)缓存到Redis,KEY设计:WH{warehouse_id}:SKU{item_id}:LOC{location_id}
。
- 实时库存(
扩展性设计
- 预留字段
- 核心表加
ext_info
(JSON类型),存储自定义属性(如温湿度要求、货主信息)。
- 核心表加
- 策略配置化
- 上架/拣货策略单独建表(
strategy_rule
),动态分配库位。
- 上架/拣货策略单独建表(
- 多仓库支持
- 所有表包含
warehouse_id
,天然支持多仓架构。
- 所有表包含
精简版核心表数量:20张(满足90%通用场景)
适用场景:电商仓库、第三方物流、制造业原材料仓、零售配送中心
数据库兼容:MySQL 8.0+ / PostgreSQL / SQL Server
此设计平衡了复杂度与灵活性,可直接用于中小型WMS系统,或作为大型系统的核心基础。
🧠 参考 12
设计一个通用的WMS(仓库管理系统)数据库表结构需覆盖核心仓储业务流程。以下是关键表的设计方案,采用模块化设计并遵循数据库规范化原则:
1. 基础信息模块
仓库表 (warehouse)
字段名 | 类型 | 描述 |
---|---|---|
warehouse_id | INT PK | 仓库ID(主键) |
warehouse_code | VARCHAR(20) | 仓库编码(唯一) |
name | VARCHAR(50) | 仓库名称 |
address | VARCHAR(100) | 地址 |
manager | VARCHAR(20) | 负责人 |
status | TINYINT | 状态(0停用,1启用) |
库区/货架/库位表 (location)
字段名 | 类型 | 描述 |
---|---|---|
location_id | INT PK | 库位ID(主键) |
parent_id | INT FK | 父级ID(货架>库区>仓库) |
location_type | CHAR(1) | 类型(R库区/S货架/B库位) |
location_code | VARCHAR(20) | 编码(如:A-01-001) |
capacity | DECIMAL(10,2) | 容量(单位:立方米) |
status | TINYINT | 状态(0禁用,1启用) |
2. 物料管理模块
物料表 (material)
字段名 | 类型 | 描述 |
---|---|---|
material_id | INT PK | 物料ID |
sku_code | VARCHAR(30) | SKU编码(唯一) |
name | VARCHAR(50) | 物料名称 |
spec | VARCHAR(50) | 规格型号 |
unit | VARCHAR(10) | 单位(件/箱等) |
category_id | INT FK | 分类ID(关联分类表) |
物料分类表 (material_category)
字段名 | 类型 | 描述 |
---|---|---|
category_id | INT PK | 分类ID |
category_name | VARCHAR(30) | 分类名称(如:电子产品) |
parent_id | INT | 父级分类ID(树形结构) |
3. 库存管理模块
库存表 (inventory)
字段名 | 类型 | 描述 |
---|---|---|
inventory_id | BIGINT PK | 库存ID |
warehouse_id | INT FK | 仓库ID |
location_id | INT FK | 库位ID |
material_id | INT FK | 物料ID |
batch_no | VARCHAR(30) | 批次号(可为空) |
quantity | DECIMAL(10,2) | 当前数量 |
lock_quantity | DECIMAL(10,2) | 锁定数量(用于冻结库存) |
status | TINYINT | 状态(0正常,1冻结) |
4. 作业管理模块
入库单表 (inbound_order)
字段名 | 类型 | 描述 |
---|---|---|
order_id | BIGINT PK | 入库单ID |
order_no | VARCHAR(30) | 入库单号(唯一) |
warehouse_id | INT FK | 仓库ID |
supplier_id | INT FK | 供应商ID |
status | TINYINT | 状态(0草稿,1已入库) |
total_quantity | DECIMAL(10,2) | 计划总数 |
actual_quantity | DECIMAL(10,2) | 实际入库数 |
入库明细表 (inbound_detail)
字段名 | 类型 | 描述 |
---|---|---|
detail_id | BIGINT PK | 明细ID |
order_id | BIGINT FK | 入库单ID |
material_id | INT FK | 物料ID |
plan_quantity | DECIMAL(10,2) | 计划数量 |
actual_quantity | DECIMAL(10,2) | 实际数量 |
location_id | INT FK | 上架库位ID |
出库单表 (outbound_order)
(结构与入库单类似,增加 customer_id
字段关联客户)
5. 作业任务模块
上架任务表 (putaway_task)
字段名 | 类型 | 描述 |
---|---|---|
task_id | BIGINT PK | 任务ID |
inbound_id | BIGINT FK | 入库单ID |
material_id | INT FK | 物料ID |
from_location | INT | 来源位置(如收货区) |
to_location | INT FK | 目标库位ID |
quantity | DECIMAL(10,2) | 上架数量 |
operator | VARCHAR(20) | 操作员 |
status | TINYINT | 状态(0待处理,1完成) |
拣货任务表 (picking_task)
(结构与上架任务类似,关联出库单)
6. 扩展模块
盘点表 (stocktake)
字段名 | 类型 | 描述 |
---|---|---|
stocktake_id | BIGINT PK | 盘点ID |
warehouse_id | INT FK | 仓库ID |
location_id | INT FK | 库位ID |
material_id | INT FK | 物料ID |
system_qty | DECIMAL(10,2) | 系统库存数 |
counted_qty | DECIMAL(10,2) | 盘点数量 |
variance | DECIMAL(10,2) | 差异数量 |
库存移动表 (inventory_move)
(记录库内调拨,包含源库位、目标库位、移动数量)
关键关系说明
- 层级结构
warehouse
→location
(通过parent_id
构建树形结构) - 库存事务
入库/出库操作通过事务更新inventory
表,确保数据一致性 - 任务驱动
入库生成inbound_order
→ 触发putaway_task
→ 更新inventory
- 批次管理
inventory.batch_no
支持先进先出(FIFO)策略
优化设计建议
- 索引优化
CREATE INDEX idx_inventory_location ON inventory(location_id); CREATE UNIQUE INDEX idx_sku_warehouse ON inventory(material_id, warehouse_id);
- 分区表
对inventory
表按warehouse_id
分区,提升查询性能 - 冗余字段
在inbound_order
中冗余total_quantity
,避免实时聚合计算 - 并发控制
使用乐观锁(如版本号字段)处理库存更新冲突
ER图核心关系
此设计满足通用WMS的核心需求,可根据实际业务扩展(如序列号管理、质检模块)。建议结合具体业务场景调整字段细节。