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