WMS核心数据模型设计:库存、库位与批次的三维管理

张开发
2026/4/3 21:40:54 15 分钟阅读
WMS核心数据模型设计:库存、库位与批次的三维管理
WMS核心数据模型设计库存、库位与批次的三维管理一、引言为什么三维管理是WMS的基石在仓库管理系统WMS的架构设计中**库存Inventory、库位Location、批次Batch**构成了最核心的三维管理模型。这三个维度相互交织决定了系统的灵活性、准确性和扩展性。┌─────────────────────────────────────────────────────────┐ │ 三维管理模型 │ ├─────────────────────────────────────────────────────────┤ │ │ │ 库存(Inventory) ─────┐ │ │ │ │ │ │ │ 数量、状态 │ │ │ │ │ │ │ ▼ ▼ │ │ 库位(Location) ←───→ 批次(Batch) │ │ (空间维度) (时间维度) │ │ │ │ 核心问题什么物料放在哪里是哪一批 │ │ │ └─────────────────────────────────────────────────────────┘本文将从数据模型设计、关键实体关系、状态流转、性能优化四个维度提供可直接落地的设计方案。二、核心实体设计2.1 库位Location——空间维度库位是仓库的物理空间抽象需要支持多层级、多属性、多状态的管理。-- 库位主表CREATETABLEwms_location(location_idBIGINTPRIMARYKEYAUTO_INCREMENT,location_codeVARCHAR(50)NOTNULLCOMMENT库位编码如A-01-02-03,location_nameVARCHAR(100)COMMENT库位名称,-- 层级结构支持4级仓库架构warehouse_idBIGINTNOTNULLCOMMENT仓库ID,zone_idBIGINTCOMMENT区域ID如收货区、存储区、拣货区,aisle_idBIGINTCOMMENT巷道ID,shelf_idBIGINTCOMMENT货架ID,level_idBIGINTCOMMENT层ID,-- 物理属性location_typeTINYINTNOTNULLDEFAULT1COMMENT库位类型1-地面仓 2-货架仓 3-流利架 4-立体库,length_cmINTCOMMENT长(cm),width_cmINTCOMMENT宽(cm),height_cmINTCOMMENT高(cm),weight_limit_kgDECIMAL(10,2)COMMENT承重限制(kg),volume_cm3BIGINTAS(length_cm*width_cm*height_cm)COMMENT体积,-- 业务属性abc_classCHAR(1)COMMENTABC分类A/B/C,temperature_zoneTINYINTCOMMENT温区1-常温 2-冷藏 3-冷冻,hazardous_flagTINYINTDEFAULT0COMMENT是否危险品库位,-- 状态管理statusTINYINTNOTNULLDEFAULT1COMMENT状态0-禁用 1-空闲 2-占用 3-锁定 4-冻结,-- 扩展支持混放规则mix_sku_allowedTINYINTDEFAULT0COMMENT是否允许混SKU,mix_batch_allowedTINYINTDEFAULT0COMMENT是否允许混批次,max_sku_countINTDEFAULT1COMMENT最大SKU种类数,created_atDATETIMEDEFAULTCURRENT_TIMESTAMP,updated_atDATETIMEDEFAULTCURRENT_TIMESTAMPONUPDATECURRENT_TIMESTAMP,UNIQUEKEYuk_location_code(warehouse_id,location_code),INDEXidx_status(status),INDEXidx_zone(zone_id,status))ENGINEInnoDBCOMMENT库位主表;关键设计要点设计点说明业务价值层级结构4级架构仓-区-巷-架-层支持从宏观到微观的库存定位体积计算虚拟列自动计算上架时自动校验空间利用率混放规则mix_sku_allowed等字段控制同一库位的库存复杂度状态机5种状态精细管理支持作业中的库位锁定机制2.2 物料/SKUSKU——商品维度CREATETABLEwms_sku(sku_idBIGINTPRIMARYKEYAUTO_INCREMENT,sku_codeVARCHAR(50)NOTNULLCOMMENTSKU编码,sku_nameVARCHAR(200)NOTNULLCOMMENTSKU名称,barcodeVARCHAR(50)COMMENT主条码,-- 物理属性unit_weight_kgDECIMAL(10,4)COMMENT单件重量(kg),unit_length_cmINTCOMMENT单件长(cm),unit_width_cmINTCOMMENT单件宽(cm),unit_height_cmINTCOMMENT单件高(cm),unit_volume_cm3BIGINTCOMMENT单件体积(cm³),-- 批次管理属性batch_mgmt_requiredTINYINTDEFAULT0COMMENT是否需要批次管理,shelf_life_daysINTCOMMENT保质期(天),fifo_requiredTINYINTDEFAULT1COMMENT是否先进先出,fefo_requiredTINYINTDEFAULT0COMMENT是否先到期先出,-- 存储策略default_zone_idBIGINTCOMMENT默认存储区域,abc_classificationCHAR(1)COMMENTABC分类,storage_uomVARCHAR(20)DEFAULTEACOMMENT存储单位,statusTINYINTDEFAULT1COMMENT状态0-禁用 1-启用,UNIQUEKEYuk_sku_code(sku_code),INDEXidx_barcode(barcode))ENGINEInnoDBCOMMENTSKU主数据;2.3 批次Batch——时间维度批次管理是追溯体系的核心需要记录完整的生命周期信息CREATETABLEwms_batch(batch_idBIGINTPRIMARYKEYAUTO_INCREMENT,batch_noVARCHAR(50)NOTNULLCOMMENT批次号,sku_idBIGINTNOTNULLCOMMENTSKU ID,-- 时间维度production_dateDATECOMMENT生产日期,expiry_dateDATECOMMENT有效期至,received_dateDATENOTNULLCOMMENT入库日期,-- 供应商维度supplier_idBIGINTCOMMENT供应商ID,supplier_batch_noVARCHAR(50)COMMENT供应商批次号,po_noVARCHAR(50)COMMENT采购订单号,-- 质量维度qc_statusTINYINTDEFAULT0COMMENT质检状态0-待检 1-合格 2-不合格 3-特采,quarantine_flagTINYINTDEFAULT0COMMENT是否隔离,-- 追溯信息origin_countryVARCHAR(50)COMMENT原产国,customs_decl_noVARCHAR(50)COMMENT报关单号,created_atDATETIMEDEFAULTCURRENT_TIMESTAMP,UNIQUEKEYuk_batch_no(sku_id,batch_no),INDEXidx_expiry(expiry_date),INDEXidx_sku_batch(sku_id,batch_no))ENGINEInnoDBCOMMENT批次主表;2.4 库存Inventory——三维交汇点库存表是库位×批次×SKU的三维矩阵这是WMS最核心的设计CREATETABLEwms_inventory(inventory_idBIGINTPRIMARYKEYAUTO_INCREMENT,-- 三维坐标sku_idBIGINTNOTNULLCOMMENTSKU ID,location_idBIGINTNOTNULLCOMMENT库位ID,batch_idBIGINTCOMMENT批次ID无批次管理时为NULL,-- 数量维度支持多计量单位qty_on_handDECIMAL(18,4)NOTNULLDEFAULT0COMMENT现有数量,qty_allocatedDECIMAL(18,4)NOTNULLDEFAULT0COMMENT已分配数量,qty_lockedDECIMAL(18,4)NOTNULLDEFAULT0COMMENT锁定数量,qty_availableDECIMAL(18,4)AS(qty_on_hand-qty_allocated-qty_locked)COMMENT可用数量,-- 状态维度同一库位同批次的库存可能分状态存储inventory_statusTINYINTNOTNULLDEFAULT1COMMENT库存状态1-良品 2-待检 3-冻结 4-残次,-- 容器维度支持箱码/托盘级管理container_idBIGINTCOMMENT容器ID托盘/料箱,lpn_noVARCHAR(50)COMMENTLicense Plate Number,-- 版本控制乐观锁versionINTNOTNULLDEFAULT1COMMENT版本号,updated_atDATETIMEDEFAULTCURRENT_TIMESTAMPONUPDATECURRENT_TIMESTAMP,-- 唯一约束同一库位同批次同状态只有一条记录UNIQUEKEYuk_inventory(sku_id,location_id,batch_id,inventory_status,container_id),INDEXidx_sku_batch(sku_id,batch_id),INDEXidx_location(location_id),INDEXidx_available(sku_id,qty_available,inventory_status))ENGINEInnoDBCOMMENT库存表核心;库存数量关系图解┌─────────────────────────────────────────┐ │ 现有数量 (qty_on_hand) │ │ ┌─────────────────────────────────┐ │ │ │ 已分配 (qty_allocated) │ │ │ │ ┌─────────────────────────┐ │ │ │ │ │ 锁定 (qty_locked) │ │ │ │ │ │ │ │ │ │ │ └─────────────────────────┘ │ │ │ │ │ │ │ │ 可用数量 (qty_available) │ │ │ └─────────────────────────────────┘ │ │ │ │ 公式可用 现有 - 分配 - 锁定 │ └─────────────────────────────────────────┘三、关键业务场景实现3.1 库存事务设计双记录模式所有库存变动必须记录事务明细支持正向和反向操作CREATETABLEwms_inventory_transaction(trans_idBIGINTPRIMARYKEYAUTO_INCREMENT,trans_typeVARCHAR(20)NOTNULLCOMMENT事务类型RECEIPT/PUTAWAY/PICK/SHIP/ADJUST...,trans_directionTINYINTNOTNULLCOMMENT方向1-增加 -1-减少,-- 关联单据source_doc_typeVARCHAR(20)COMMENT源单据类型,source_doc_noVARCHAR(50)COMMENT源单据号,source_line_idBIGINTCOMMENT源单据行ID,-- 三维坐标变动前from_sku_idBIGINT,from_location_idBIGINT,from_batch_idBIGINT,from_qtyDECIMAL(18,4),from_statusTINYINT,-- 三维坐标变动后to_sku_idBIGINT,to_location_idBIGINT,to_batch_idBIGINT,to_qtyDECIMAL(18,4),to_statusTINYINT,-- 操作信息operator_idBIGINTCOMMENT操作人,operation_timeDATETIMEDEFAULTCURRENT_TIMESTAMP,-- 扩展字段JSON存储特殊属性attributes JSONCOMMENT扩展属性,INDEXidx_source(source_doc_type,source_doc_no),INDEXidx_time(operation_time))ENGINEInnoDBCOMMENT库存事务表;3.2 库位分配算法上架时的库位推荐是WMS的智能核心# 伪代码库位分配策略defrecommend_location(sku_id,batch_id,qty,warehouse_id): 库位分配策略优先级 1. 找已有相同SKU批次的库位合并策略 2. 找同一SKU不同批次的库位如果允许混批次 3. 找空闲库位ABC分类匹配 4. 找体积利用率最优的库位 skuget_sku(sku_id)# 策略1精确匹配同SKU同批次locationquery( SELECT l.* FROM wms_location l JOIN wms_inventory i ON l.location_id i.location_id WHERE i.sku_id :sku_id AND i.batch_id :batch_id AND i.inventory_status 1 AND l.status 2 -- 占用状态还有空间 AND l.mix_batch_allowed 1 OR i.batch_id :batch_id ORDER BY (l.volume_cm3 - used_volume) ASC -- 找最满的 LIMIT 1 ,sku_idsku_id,batch_idbatch_id)iflocation:returnlocation# 策略2同SKU不同批次如果允许ifsku.allow_mix_batch:locationquery( SELECT l.* FROM wms_location l WHERE l.zone_id :default_zone AND l.status 1 -- 空闲 AND (l.mix_sku_allowed 1 OR NOT EXISTS ( SELECT 1 FROM wms_inventory i WHERE i.location_id l.location_id )) ORDER BY ABS(l.volume_cm3 - :need_volume) LIMIT 1 ,default_zonesku.default_zone_id,need_volumesku.volume*qty)returnlocation3.3 批次拣货策略FIFO/FEFO-- FEFO先到期先出拣货批次选择SELECTi.inventory_id,i.location_id,i.batch_id,i.qty_available,b.expiry_date,l.location_code,-- 计算拣货优先级越小越优先ROW_NUMBER()OVER(ORDERBYb.expiry_dateASC,-- 先到期优先i.qty_availableDESC,-- 整批拣优先l.abc_classASC,-- A类库位优先l.location_codeASC)aspick_priorityFROMwms_inventory iJOINwms_batch bONi.batch_idb.batch_idJOINwms_location lONi.location_idl.location_idWHEREi.sku_id:sku_idANDi.qty_available:required_qtyANDi.inventory_status1-- 良品ANDb.expiry_dateCURRENT_DATE-- 未过期ORDERBYpick_priorityLIMIT1;四、状态机设计4.1 库位状态流转┌─────────┐ 创建 ┌─────────┐ 启用 ┌─────────┐ │ 初始化 │ ─────────→ │ 禁用 │ ─────────→ │ 空闲 │ │ (INIT) │ │(DISABLE)│ │ (EMPTY) │ └─────────┘ └─────────┘ └────┬────┘ │ ┌────────────────────────────────────┘ │ 上架/移库 ▼ ┌─────────┐ 分配 ┌─────────┐ 释放 ┌─────────┐ │ 占用 │ ─────────→ │ 锁定 │ ─────────→ │ 占用 │ │(OCCUPIED)│ │(LOCKED) │ │(OCCUPIED)│ └────┬────┘ └─────────┘ └────┬────┘ │ │ │ 清空 │ 清空 ▼ ▼ ┌─────────┐ ┌─────────┐ │ 空闲 │◄─────────────────────────────────────│ 冻结 │ │ (EMPTY) │ 解冻 │(FROZEN) │ └─────────┘◄────────────────────────────────────┘ ▲ │ 禁用 ┌────┴────┐ │ 禁用 │ │(DISABLE)│ └─────────┘4.2 库存状态流转-- 库存状态转换规则表数据驱动的状态机CREATETABLEwms_inventory_status_rule(rule_idBIGINTPRIMARYKEYAUTO_INCREMENT,from_statusTINYINTNOTNULL,to_statusTINYINTNOTNULL,trans_typeVARCHAR(20)NOTNULLCOMMENT触发事务类型,allowedTINYINTDEFAULT1,require_reasonTINYINTDEFAULT0COMMENT是否需要填写原因,require_approvalTINYINTDEFAULT0COMMENT是否需要审批,UNIQUEKEYuk_rule(from_status,to_status,trans_type))ENGINEInnoDBCOMMENT库存状态转换规则;五、性能优化策略5.1 索引策略查询场景索引设计说明库位找库存(location_id, sku_id, batch_id)上架扫描高频查询SKU查可用库存(sku_id, inventory_status, qty_available)分配拣货库存批次效期预警(expiry_date, qc_status)效期管理报表库存事务追溯(source_doc_no, source_doc_type)单据追溯5.2 分库分表策略-- 库存表按仓库ID分表水平拆分-- wms_inventory_001, wms_inventory_002...-- 事务表按时间分区垂直拆分CREATETABLEwms_inventory_transaction_2024_q1(-- 同上结构)PARTITIONBYRANGE(YEAR(operation_time)*100MONTH(operation_time))(PARTITIONp202401VALUESLESS THAN(202402),PARTITIONp202402VALUESLESS THAN(202403),PARTITIONp202403VALUESLESS THAN(202404));5.3 缓存策略# Redis缓存设计# 1. 库存汇总缓存SKU级inventory:summary:{sku_id}-{total_qty:1000,available_qty:800,location_count:5}# 2. 库位占用缓存实时性要求高location:status:{location_id}-OCCUPIED# 3. 批次效期预警缓存定时更新batch:expiry:warning-[batch_id_list]六、扩展设计支持多仓库、多货主6.1 多货主架构3PL场景-- 增加货主维度ALTERTABLEwms_inventoryADDCOLUMNowner_idBIGINTNOTNULLCOMMENT货主ID;ALTERTABLEwms_skuADDCOLUMNowner_idBIGINTNOTNULLCOMMENT货主ID;-- 库存隔离视图级别CREATEVIEWwms_inventory_owner_viewASSELECT*FROMwms_inventoryWHEREowner_idCURRENT_USER_OWNER_ID();-- 通过会话变量控制6.2 序列号管理单品追踪-- 序列号表与库存表1:N关系CREATETABLEwms_inventory_serial(serial_idBIGINTPRIMARYKEY,inventory_idBIGINTNOTNULL,serial_noVARCHAR(100)NOTNULL,sku_idBIGINTNOTNULL,batch_idBIGINT,-- 生命周期statusTINYINTCOMMENT1-在库 2-已出库 3-已报废,inbound_timeDATETIME,outbound_timeDATETIME,UNIQUEKEYuk_serial(sku_id,serial_no));七、总结设计原则 checklist✅数据一致性库存变动必须通过事务表禁止直接UPDATE库存表✅维度完整性任何库存记录必须同时包含SKULocationBatch或NULL三维信息✅状态可追溯所有状态变更记录操作人、时间、原因✅性能可扩展核心表按仓库/时间分片热点数据加缓存✅业务可配置混放规则、分配策略、状态流转均数据驱动这篇博客涵盖了WMS最核心的数据模型设计从表结构到业务逻辑再到性能优化提供了可直接落地的方案。

更多文章