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图 (简化版概念模型):
sql
+---------------+ 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): 物料ID -
from_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图: 可视化表之间的关系。
- 进行原型验证: 用模拟数据测试核心流程(入库、出库、移库、盘点)的数据流转和性能。
- 持续迭代: 数据库设计不是一次性的,随着业务理解和需求变化,需要不断调整优化。
希望这个设计能为您提供一个清晰的起点!