WMS仓库管理系统的数据库表设计 笔记250725

WMS仓库管理系统的数据库表设计 笔记250725

好的,设计一个WMS(仓库管理系统)的数据库表结构是一个复杂但核心的任务。它需要精确反映仓库的物理结构、货物特性、业务流程以及操作记录。以下是一个核心且相对通用的WMS数据库表设计概览,涵盖了主要实体和关系。实际设计需要根据具体业务需求(如行业、仓库规模、流程复杂度、自动化程度等)进行调整和扩展。

核心设计原则:

  1. 数据完整性: 主键、外键约束确保关联关系正确。
  2. 可追溯性: 所有关键操作(入库、出库、移动、调整)必须有详细记录。
  3. 性能: 高频查询表(如库存表)需优化索引和结构。
  4. 扩展性: 考虑未来业务变化(如新增仓库、货主、商品属性)。
  5. 规范化: 减少数据冗余,但有时为了查询性能会适当反规范化(如库存表中存储常用商品信息)。

核心实体与表结构:

  1. 仓库基础信息

    • warehouse (仓库表)
      • warehouse_id (PK): 仓库唯一标识 (主键)
      • name: 仓库名称
      • code: 仓库编码
      • address: 仓库地址
      • contact_person: 联系人
      • contact_phone: 联系电话
      • status (启用/禁用): 仓库状态
      • type (常温仓、冷藏仓、危品仓等): 仓库类型
      • manager: 负责人
      • description: 描述
      • created_at, updated_at: 创建/更新时间
  2. 库区与储位管理

    • 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 (可选): 最近盘点时间
  3. 货主与商品管理

    • 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: 联系方式
      • ... (其他供应商信息)
  4. 库存管理 (核心表!)

    • 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) - 确保同一储位、同一商品、同一批次/序列号、同一状态的记录唯一。这是核心约束!
  5. 库存事务流水 (核心表!)

    • 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 (用于关联同一操作产生的多条事务记录,如移库涉及出和入)
  6. 入库管理

    • asn / receiving_order (入库通知单/收货单)
      • asn_id (PK): 入库单唯一标识
      • asn_number: 入库单号
      • owner_id (FK): 货主ID
      • supplier_id (FK, 可选): 供应商ID
      • warehouse_id (FK): 目标仓库ID
      • expected_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): 关联入库单ID
      • sku_id (FK): 商品ID
      • expected_quantity: 预期数量
      • received_quantity: 已收数量
      • putaway_quantity: 已上架数量
      • batch_number (可选): 预期批次号
      • production_date (可选): 预期生产日期
      • expiry_date (可选): 预期失效日期
      • inventory_status (可选): 预期库存状态 (通常为良品)
      • ... (其他预期属性)
    • receiving_record (收货记录表, 可选)
      • 记录每次收货扫描的明细(按托盘/箱/件),关联到 asn_detail。如果流程简单,可以直接更新 asn_detailreceived_quantity
    • putaway_task / putaway_list (上架任务表)
      • putaway_task_id (PK)
      • asn_id (FK): 关联入库单ID
      • task_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): 关联上架任务ID
      • asn_detail_id (FK): 关联入库单明细ID
      • sku_id (FK): 商品ID
      • quantity_to_putaway: 待上架数量
      • quantity_putaway: 已上架数量
      • suggested_location_id (FK, 可选): 系统推荐上架储位ID
      • actual_location_id (FK, 可选): 实际上架储位ID
      • batch_number (可选): 批次号
      • ... (其他属性)
      • status: 明细状态 (待上架、上架中、已完成)
  7. 出库管理

    • order / shipment_order (出库单/发货单)
      • order_id (PK)
      • order_number: 出库单号 (如销售订单号、调拨出库单号)
      • owner_id (FK): 货主ID
      • customer_id (FK, 可选): 客户ID (如果是销售出库)
      • warehouse_id (FK): 发货仓库ID
      • order_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): 关联出库单ID
      • sku_id (FK): 商品ID
      • ordered_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): 仓库ID
      • status: 状态 (新建、已分配、部分拣货、拣货完成、关闭)
      • release_time: 波次释放时间 (开始拣货)
      • completion_time (可选): 完成时间
      • strategy: 波次策略 (按订单、按商品、按区域等)
    • wave_detail (波次明细)
      • wave_detail_id (PK)
      • wave_id (FK): 关联波次ID
      • order_id (FK): 关联出库单ID
      • order_detail_id (FK): 关联出库单明细ID
      • allocated_quantity: 分配数量
    • picking_task / pick_list (拣货任务表)
      • picking_task_id (PK)
      • wave_id (FK, 可选): 关联波次ID (如果有)
      • order_id (FK, 可选): 关联出库单ID (如果按单拣)
      • task_number: 任务单号
      • picker_id (FK, 可选): 拣货员ID
      • status: 状态 (待分配、已分配、执行中、部分完成、已完成、取消)
      • 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): 关联拣货任务ID
      • order_detail_id (FK): 关联出库单明细ID
      • inventory_id (FK): 来源库存记录ID (外键到 inventory) - 关键!精确到具体批次/序列号的库存
      • location_id (FK): 来源储位ID
      • quantity_to_pick: 计划拣取数量
      • quantity_picked: 实际拣取数量
      • batch_number (可选): 批次号
      • serial_number (可选): 序列号
      • status: 明细状态 (待拣、拣货中、已拣)
    • packing (打包表, 可选)
      • packing_id (PK)
      • order_id (FK): 关联出库单ID
      • packer_id (FK, 可选): 打包员ID
      • packed_time: 打包时间
      • box_number: 箱号/包裹号
      • weight (可选): 包裹重量
      • dimensions (可选): 包裹尺寸
      • shipping_label: 物流面单信息 (或存储路径)
    • packing_detail (打包明细表, 可选)
      • packing_detail_id (PK)
      • packing_id (FK): 关联打包记录ID
      • order_detail_id (FK): 关联出库单明细ID
      • quantity_packed: 打包数量
      • sku_id (FK): 商品ID (冗余)
    • shipping (发货表, 可选)
      • shipping_id (PK)
      • order_id (FK): 关联出库单ID
      • shipper_id (FK, 可选): 发货员ID
      • shipped_time: 发货时间
      • carrier: 承运商 (冗余)
      • tracking_number: 运单号 (冗余或唯一)
      • vehicle_number: 车牌号 (冗余)
      • shipping_cost (可选): 运费
  8. 库内作业

    • 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): 关联移库任务ID
      • inventory_id (FK): 要移动的库存记录ID
      • from_location_id (FK): 源储位ID
      • to_location_id (FK): 目标储位ID
      • quantity_to_move: 计划移动数量
      • quantity_moved: 实际移动数量
      • status: 明细状态 (待移动、移动中、已完成)
    • inventory_adjustment (库存调整单)
      • adjustment_id (PK)
      • adjustment_number: 调整单号
      • reason: 调整原因 (盘点差异、报损、报溢、其他)
      • warehouse_id (FK): 仓库ID
      • status: 状态 (草稿、已审核、已过账)
      • created_by, created_at, approved_by (可选), approved_at (可选), posted_by (可选), posted_at (可选)
    • inventory_adjustment_detail (库存调整明细)
      • adjustment_detail_id (PK)
      • adjustment_id (FK): 关联调整单ID
      • location_id (FK): 储位ID
      • sku_id (FK): 商品ID
      • owner_id (FK): 货主ID
      • batch_number (可选): 批次号
      • production_date (可选): 生产日期
      • expiry_date (可选): 失效日期
      • serial_number (可选): 序列号
      • inventory_status: 库存状态
      • quantity_before: 调整前数量
      • quantity_after: 调整后数量
      • quantity_difference: 调整量 (正数增加,负数减少)
      • cost_difference (可选, 财务): 成本差异
  9. 盘点管理

    • cycle_count_plan (循环盘点计划表, 可选)
      • plan_id (PK)
      • name: 计划名称
      • warehouse_id (FK): 仓库ID
      • zone_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): 仓库ID
      • zone_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): 关联盘点单ID
      • location_id (FK): 储位ID
      • sku_id (FK): 商品ID
      • owner_id (FK): 货主ID
      • batch_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 (盘点差异生成调整单)
  10. 基础数据与系统管理

    • user (用户表)
      • user_id (PK)
      • username: 用户名 (登录名)
      • password_hash: 密码哈希值
      • real_name: 真实姓名
      • role_id (FK): 角色ID (外键到 role)
      • warehouse_id (FK, 可选): 默认仓库ID
      • contact_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: 是否启用

关键点说明:

  1. inventory 表是核心: 它精确记录了哪个货主的哪个SKU的哪个批次/序列号的多少数量,在哪个状态(良品/残品等),具体存放在哪个储位上。唯一约束是设计的精髓。
  2. inventory_transaction 表是审计追踪的核心: 所有引起库存变化的操作都必须记录在此,确保数据的可追溯性。它是 inventory 表变化的流水账。
  3. 货主 (owner_id) 贯穿始终: 所有关键表(sku, inventory, asn, order, transaction 等)都应有 owner_id 字段,这是支持多货主共用一个WMS的基础。
  4. 批次/序列号管理: 通过 sku.is_batch_managed, sku.is_serialized 控制是否启用,并在 inventory, inventory_transaction, asn_detail, order_detail, count_detail 等表中记录具体的批次号或序列号。序列号在 inventory 表中通常是唯一的。
  5. 任务驱动: 上架 (putaway_task)、拣货 (picking_task)、移库 (move_task) 等操作通常通过任务单来管理和追踪执行过程。
  6. 状态管理: 几乎所有业务单据 (asn, order, count, task) 和储位 (location) 都有状态字段,用于控制业务流程和资源可用性。
  7. 权限控制: 通过 user -> role -> role_permission -> permission 实现细粒度的功能权限控制。
  8. 性能优化:
    • 高频查询表 (inventory, location) 需要精心设计索引 (如 location_id, sku_id, owner_id, status, batch_number, expiry_date)。
    • 考虑对 inventory_transaction 等增长非常快的表进行分区 (如按时间分区)。
    • 适当冗余常用字段 (如 inventory.available_quantity, location.current_volume) 以避免频繁计算。
    • 使用乐观锁 (inventory.version) 处理高并发库存扣减。
  9. 扩展性:
    • 表结构设计考虑未来可能的扩展字段。
    • 使用类型字段 (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数据库表结构设计,涵盖了主要功能模块。实际设计中,需要根据具体业务需求(如行业特性:电商、制造业、冷链、医药;仓库类型:平面仓、立体仓、自动化仓;业务流程等)进行调整和扩展。

核心设计原则:

  1. 数据原子性: 每个表只负责一个核心实体(如物料、库位、订单)。
  2. 关系清晰: 通过外键明确表之间的关联(如库存属于哪个物料、在哪个库位)。
  3. 状态跟踪: 关键实体(库存、任务、订单)需要有状态字段,记录生命周期。
  4. 事务完整性: 关键操作(入库、出库、移位)需要事务保证数据一致性。
  5. 可扩展性: 考虑预留字段或设计可扩展的结构(如JSON字段存储动态属性)。
  6. 审计追踪: 记录关键数据的变化(创建人、创建时间、修改人、修改时间)。
  7. 唯一标识: 使用主键(自增ID或UUID)和业务唯一键(如物料编码、库位编码)结合。

一、 基础主数据 (Master Data)

  1. 物料表 (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: 审计字段
  2. 物料分类表 (item_category)

    • category_id (PK)
    • parent_category_id (FK): 父分类ID (实现树形结构)
    • category_code (UQ): 分类编码
    • category_name: 分类名称
    • description: 描述
  3. 计量单位表 (unit_of_measure - uom)

    • uom_id (PK)
    • uom_code (UQ): 单位代码 (如 'EA', 'BOX', 'KG', 'M')
    • uom_name: 单位名称 (如 '个', '箱', '千克', '米')
    • uom_type: 单位类型 (基本单位、包装单位等)
  4. 仓库表 (warehouse)

    • warehouse_id (PK)
    • warehouse_code (UQ): 仓库代码 (如 'WH01')
    • warehouse_name: 仓库名称
    • location: 仓库地址
    • contact_person: 联系人
    • contact_phone: 联系电话
    • is_active: 是否启用
    • description: 描述
  5. 库区表 (zone)

    • zone_id (PK)
    • warehouse_id (FK): 所属仓库
    • zone_code (UQ): 库区代码 (如 'ZONE-A') - 在仓库内唯一
    • zone_name: 库区名称 (如 '收货区', '存储区', '拣货区', '发货区', '退货区', '不良品区')
    • zone_type: 库区类型 (收货、存储、拣选、发货、暂存、质检等)
    • description: 描述
    • pick_sequence: 拣货路径顺序 (优化用)
  6. 库位表 (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: 库位分组 (用于波次拣货或优化)
  7. 供应商表 (supplier)

    • supplier_id (PK)
    • supplier_code (UQ): 供应商代码
    • supplier_name: 供应商名称
    • contact_info: 联系方式
    • address: 地址
    • is_active: 是否启用
  8. 客户表 (customer)

    • customer_id (PK)
    • customer_code (UQ): 客户代码
    • customer_name: 客户名称
    • contact_info: 联系方式
    • address: 地址
    • is_active: 是否启用
  9. 承运商表 (carrier)

    • carrier_id (PK)
    • carrier_code (UQ): 承运商代码
    • carrier_name: 承运商名称
    • contact_info: 联系方式
    • service_type: 服务类型 (快递、零担、整车等)
  10. 用户/员工表 (user)

    • user_id (PK)
    • username (UQ): 登录用户名
    • password_hash: 密码哈希
    • real_name: 真实姓名
    • role_id (FK): 外键,关联角色表 (用于权限控制)
    • warehouse_id (FK): 默认所属仓库 (可选)
    • is_active: 是否启用
    • last_login: 最后登录时间
  11. 角色权限表 (role, permission, role_permission)

    • 这是一个标准RBAC模型,包含角色表、权限点表、角色权限关联表。控制用户能访问哪些菜单、执行哪些操作(创建入库单、确认出库、盘点等)。

二、 库存核心表 (Inventory Core)

  1. 库存表 (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
  2. 库存事务表 (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)

  1. 入库单表 (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
  2. 入库单明细表 (receiving_order_line)

    • line_id (PK)
    • receipt_id (FK): 关联入库单
    • line_number: 行号
    • item_id (FK): 物料ID
    • expected_quantity: 预期数量
    • received_quantity: 已收数量 (累计)
    • putaway_quantity: 已上架数量 (累计)
    • uom_id (FK): 单位
    • batch_number: 预期批次 (可选)
    • notes: 行备注
  3. 收货任务表 (receiving_task)

    • task_id (PK)
    • receipt_id (FK): 关联入库单
    • line_id (FK): 关联入库单明细 (可选,任务可能按行也可能按单)
    • item_id (FK): 物料ID
    • quantity_to_receive: 待收数量
    • quantity_received: 已收数量
    • status: 任务状态 (待执行、执行中、已完成、已取消)
    • assigned_to: 分配给的员工 (用户ID)
    • start_time, complete_time: 开始/完成时间
    • location_id (FK): 临时收货库位 (如收货暂存区)
  4. 上架单/任务表 (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): 物料ID
    • batch_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)

  1. 出库单/发货单 (shipment_order)

    • shipment_id (PK)
    • shipment_number (UQ): 发货单号
    • shipment_type: 发货类型 (销售出库、退货出库、调拨出库、领料出库等)
    • customer_id (FK): 客户ID (销售出库)
    • warehouse_id (FK): 发货仓库
    • carrier_id (FK): 承运商ID
    • tracking_number: 物流追踪号
    • expected_ship_date: 预计发货日期
    • actual_ship_date: 实际发货日期
    • status: 状态 (创建、部分分配、已分配、部分拣货、已拣货、部分打包、已打包、部分发货、已发货、已关闭、已取消)
    • reference_number: 外部参考单号 (如销售订单号SO)
    • notes: 备注
    • created_by, created_at, updated_by, updated_at
  2. 出库单明细表 (shipment_order_line)

    • line_id (PK)
    • shipment_id (FK): 关联发货单
    • line_number: 行号
    • item_id (FK): 物料ID
    • ordered_quantity: 订单需求数量
    • allocated_quantity: 已分配数量 (锁定库存)
    • picked_quantity: 已拣数量 (累计)
    • packed_quantity: 已打包数量 (累计)
    • shipped_quantity: 已发货数量 (累计)
    • uom_id (FK): 单位
    • batch_requirement: 批次要求 (可选)
    • notes: 行备注
  3. 波次表 (wave)

    • wave_id (PK)
    • wave_number (UQ): 波次号
    • wave_type: 波次类型 (按单、按客户、按路线、紧急)
    • status: 状态 (创建、计划中、已释放、部分完成、已完成、已关闭)
    • release_time: 释放时间 (开始执行)
    • planned_completion_time: 计划完成时间
    • created_by, created_at
  4. 波次明细表 (wave_line)

    • wave_line_id (PK)
    • wave_id (FK): 关联波次
    • shipment_line_id (FK): 关联发货单明细行
    • quantity_to_pick: 该波次需要拣货的数量 (可能小于行需求总量)
    • status: 状态 (待拣、已拣)
  5. 拣货任务表 (picking_task)

    • pick_task_id (PK)
    • wave_id (FK): 关联波次 (可选,可能有直接按单拣货)
    • shipment_line_id (FK): 关联发货单明细行
    • item_id (FK): 物料ID
    • batch_number: 指定批次 (如果波次或行指定)
    • quantity_to_pick: 需拣数量
    • quantity_picked: 已拣数量
    • from_location_id (FK): 来源拣货库位
    • to_container_id (FK): 目标容器 (拣货车、周转箱) - 关联容器表
    • status: 状态 (待分配、已分配、执行中、已完成、已取消)
    • assigned_to: 分配给的员工
    • priority: 优先级
    • sequence: 在拣货路径中的顺序
    • start_time, complete_time
  6. 容器表 (container)

    • container_id (PK)
    • container_code (UQ): 容器编码 (周转箱号、托盘号、小车号)
    • container_type: 容器类型 (纸箱、托盘、料箱、手推车)
    • current_location_id (FK): 当前位置
    • current_operator_id (FK): 当前操作员 (谁推着车)
    • status: 状态 (空闲、拣货中、打包中、待发运)
    • associated_shipment_id (FK): 关联的发货单 (打包后)
  7. 打包表 (packing)

    • pack_id (PK)
    • shipment_id (FK): 关联发货单
    • container_id (FK): 关联容器 (打包后的箱子/托盘)
    • packed_by: 打包人
    • packed_at: 打包时间
    • weight: 包裹重量 (实际称重)
    • dimensions: 包裹尺寸
    • notes: 打包备注
  8. 发货任务表 (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)

  1. 移库单/任务表 (move_order / move_task)

    • move_id (PK)
    • move_type: 移库类型 (库位调整、补货上架、盘点移位、整理移库)
    • reason: 移库原因
    • from_location_id (FK): 来源库位
    • to_location_id (FK): 目标库位
    • item_id (FK): 物料ID
    • batch_number: 批次号
    • quantity_to_move: 需移动数量
    • quantity_moved: 已移动数量
    • status: 状态 (创建、已分配、执行中、已完成、已取消)
    • assigned_to: 分配给的员工
    • priority: 优先级
    • created_at, start_time, complete_time
  2. 补货单/任务表 (replenishment_order / replenishment_task)

    • replen_id (PK)
    • replen_type: 补货类型 (从存储位到拣货位、按需补货、预警补货)
    • source_location_id (FK): 来源库位 (存储位)
    • target_location_id (FK): 目标库位 (拣货位)
    • item_id (FK): 物料ID
    • batch_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
  3. 盘点单表 (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
  4. 盘点单明细表 (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)

  1. 操作日志表 (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: 操作IP
    • notes: 备注

关键关系与流程示意

  • 入库流程:
    • 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 (调整库存)

重要设计考虑

  1. 库存快照 vs 实时计算: 核心库存 (inventory) 表是实时状态,但复杂报表可能需要定期快照 (inventory_snapshot)。
  2. 序列号深度管理: 如果需要详细跟踪序列号的生命周期(收货、入库、移库、关联订单、出库、维修、报废),需要更强大的序列号跟踪表 (item_serial_tracking),关联各种事务单据。
  3. 批次属性扩展: 如果批次属性复杂且需要查询,单独 batch 表 (batch_id, item_id, supplier_batch, manufacture_date, expiry_date, custom_attrs...)。
  4. 容器管理: 在自动化程度高的仓库,容器 (container) 的管理及其内部库存 (container_content) 非常重要。
  5. 路径优化: 库位坐标 (x, y, z) 和库位分组 (location_group) 用于计算最优拣货路径。
  6. 并发控制与锁: 库存分配、拣货确认等操作需要数据库事务和乐观锁/悲观锁机制保证在高并发下数据准确。
  7. 性能: 对高频操作的表 (inventory, inventory_transaction, task 表) 建立合适的索引至关重要。考虑分区表(如按时间分区事务表)。
  8. 扩展性: 使用 JSON 字段 (custom_fields) 存储非核心的动态属性。考虑微服务架构拆分不同领域(基础数据、库存、订单执行)。
  9. 多租户: 如果服务于多个客户(货主),需要在几乎所有核心表 (item, inventory, order等) 增加 tenant_idowner_id 字段。

总结

这个设计提供了一个全面的WMS数据库表结构蓝图。实际实施时,必须深入理解具体业务需求、流程规则和性能要求,在此基础上进行裁剪、细化、优化。数据库设计是WMS成功实施的基石,需要谨慎规划和反复验证。在开发过程中,ER图工具 (如MySQL Workbench, Lucidchart, DbSchema) 对于可视化和沟通表结构非常有帮助。





2️⃣ 参考 2

设计一个完善的WMS(仓库管理系统)数据库是系统高效稳定运行的核心。下面是一个核心模块的表结构设计,涵盖了仓库管理的主要业务场景。设计遵循关系型数据库(如MySQL, PostgreSQL, SQL Server)的范式要求,并考虑了扩展性和性能。

核心设计原则:

  1. 模块化: 按业务功能划分模块。
  2. 规范化: 尽量减少数据冗余(达到3NF或BCNF)。
  3. 可扩展性: 预留字段,使用外键关联,考虑未来业务变化。
  4. 性能: 合理设计索引(主键、外键、频繁查询字段),考虑分区/分表(大数据量时)。
  5. 数据完整性: 使用约束(主键、外键、唯一键、非空、检查约束)。
  6. 审计性: 关键操作记录操作人和时间。
  7. 灵活性: 使用状态码、类型码表管理枚举值,方便扩展。

核心模块与表设计:

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): 所属仓库ID
    • zone_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): 所属库区ID
    • location_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): 物料分类ID
    • length, 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): 物料ID
    • supplier_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): 物料ID
    • location_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): 物料ID
    • location_id (FK -> location): 库位ID
    • lot_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): 物料ID
    • from_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 (通常等同于operatortransaction_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): 供应商ID
    • purchase_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): 关联预约单ID
    • line_number: 行号
    • item_id (FK -> item_master): 物料ID
    • expected_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): 关联收货单ID
    • line_number: 行号
    • item_id (FK -> item_master): 物料ID
    • lot_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): 物料ID
    • quantity_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): 关联出库单ID
    • line_number: 行号
    • item_id (FK -> item_master): 物料ID
    • ordered_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): 关联波次ID
    • order_id (FK -> outbound_order): 关联出库单ID
    • created_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): 物料ID
    • location_id (FK -> location): 拣货库位ID
    • lot_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): 目标暂存库位ID
    • created_by, created_time, modified_by, modified_time
  • 4.6 复核打包表 (packing)
    • packing_id (PK): 主键
    • packing_number: 复核/打包单号
    • order_id (FK -> outbound_order): 关联出库单ID
    • operator: 操作员
    • 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): 关联出库单ID
    • shipping_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): 物料ID
    • from_location_id (FK -> location): 源库位ID
    • to_location_id (FK -> location): 目标库位ID
    • lot_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): 仓库ID
    • zone_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): 关联盘点单ID
    • location_id (FK -> location): 库位ID
    • item_id (FK -> item_master): 物料ID
    • lot_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): 关联调整单ID
    • item_id (FK -> item_master): 物料ID
    • location_id (FK -> location): 库位ID
    • lot_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): 操作用户ID
    • operation_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 (可选): 分类

关键点与优化建议:

  1. 索引策略:
    • 所有主键 (PK) 自动创建聚集索引 (Clustered Index)。
    • 所有外键 (FK) 字段创建非聚集索引 (Non-Clustered Index)。
    • 高频查询条件字段 (如 item_code, location_code, order_number, status, transaction_time) 创建非聚集索引。
    • 组合索引:根据实际查询SQL的WHERE条件和JOIN条件创建组合索引。
  2. 性能考虑:
    • 库存快照 (inventory_snapshot): 查询极频繁。确保主键/唯一索引设计最优。考虑按仓库分区 (Partitioning)。定期归档历史数据。
    • 库存事务 (inventory_transaction): 写入频繁且数据量增长快。考虑按时间分区。归档历史数据。
    • 任务表 (*_task): 状态查询频繁。在status字段上建索引。
  3. 数据一致性:
    • 事务(Transaction): 对库存的操作(增删改)务必放在数据库事务中,保证ACID特性。例如,创建库存事务记录和更新库存快照必须在同一事务内完成。
    • 触发器(Trigger) 慎用: 尽量避免在核心表(如inventory_snapshot, inventory_transaction)上使用复杂触发器,因其影响性能且难调试。业务逻辑尽量在应用层控制。
  4. 软删除: 考虑在重要业务表增加 is_deleted (True/False) 和 deleted_time 字段,标记删除而非物理删除,便于审计和数据恢复。
  5. 预留扩展字段: 在核心业务表增加若干 ext_field1, ext_field2 (VARCHAR) 或 ext_info (JSON/TEXT) 字段,用于存储未来可能需要的非结构化信息或扩展属性。
  6. JSON字段的应用: 对于结构可能变化或需要存储灵活属性的地方 (如批次扩展属性、操作日志详情operation_details),使用数据库支持的JSON类型字段 (如PostgreSQL的jsonb, MySQL的json) 是一个不错的选择。
  7. 序列号/批次管理:
    • 序列号管理 (is_serial_controlled=True): 库存记录和交易记录必须精确到serial_numberserial_number 在 (item_id, location_id, inventory_status) 组合下需唯一 (通常在库存快照表约束)。
    • 批次管理 (is_lot_controlled=True): 库存记录和交易记录需记录lot_numberlot_number 在 (item_id, location_id, inventory_status) 组合下需唯一 (通常在库存快照表约束)。需关联批次属性(生产日期、失效日期等)。
  8. 并发控制: 对于高频更新的核心表(如inventory_snapshot),在应用层使用乐观锁(如版本号version字段)或数据库的悲观锁机制来防止更新冲突。

总结:

以上设计提供了一个全面的WMS核心数据库表结构蓝图。实际实施时,需要根据具体的业务需求、流程、规模、性能要求和所选数据库的特性进行以下工作:

  1. 裁剪与调整: 并非所有表都是必需的。根据业务复杂度选择需要的模块和表。
  2. 字段细化: 根据具体业务规则细化字段定义、约束和默认值。
  3. 索引优化: 基于实际查询模式进行索引设计和调整。
  4. 分区策略: 对于海量数据表,设计合理的分区方案。
  5. 安全设计: 加强用户密码存储安全(加盐哈希)、数据传输安全(TLS)、访问控制。
  6. 备份与恢复策略: 制定完善的数据库备份和灾难恢复计划。

设计良好的WMS数据库是系统高效、稳定、灵活运行的基础。务必在项目初期投入足够精力进行详细设计和评审。





3️⃣ 参考 3

好的,设计一个WMS(仓库管理系统)的数据库表结构是一个复杂的过程,需要根据具体的业务需求、仓库规模、流程复杂度进行调整。以下是一个核心且相对通用的WMS数据库表设计蓝图,涵盖了主要功能模块:

核心原则:

  1. 标准化: 使用主键、外键确保数据完整性。
  2. 模块化: 清晰划分功能模块对应的表。
  3. 可扩展性: 考虑未来业务增长,预留扩展空间(如预留字段、使用类型表)。
  4. 性能: 合理设计索引(尤其是外键、常用查询字段),考虑分区(针对海量流水数据)。
  5. 审计性: 记录关键操作日志。
  6. 状态管理: 清晰定义各种单据、库存、库位的状态。

核心表结构:

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: 目标库存状态ID
    • quantity_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): 供应商ID
    • from_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): 关联的订单ID
    • packer_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): 商品ID
    • packed_quantity: 打包数量
  • shipping_order (发货单)

    • so_id (PK)
    • so_no: 发货单号 (唯一)
    • order_id (FK): 关联的订单ID
    • pko_id (FK): 关联的打包单ID
    • shipping_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): 仓库ID
    • area_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): 仓库ID
    • status: 单据状态 (草稿/已提交/已审核/已完成)
    • 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 (系统配置表): 存储系统级参数,如库存冻结阈值、盘点规则、补货策略参数、波次策略参数等。

重要说明

  1. 主键(PK) / 外键(FK): 必须明确定义,确保数据关系完整。
  2. 索引(Index): 对高频查询字段(如 location_id, sku_id, batch_no, status, created_at, transaction_time)和连接字段(外键)建立索引,大幅提升查询性能。
  3. 事务(Transaction): 对库存变动操作(入库、出库、移库、调整)必须使用数据库事务保证操作的原子性、一致性、隔离性、持久性 (ACID)。inventory_transaction 表是审计的关键。
  4. 并发控制: inventory 表强烈建议使用乐观锁 (version 字段) 或悲观锁来防止超卖等并发问题。
  5. 状态管理: 所有单据(ASN, RO, PWO, Order, PO, Count, Adjust, Transfer)和库存 (inventory.inventory_status, location.status) 都需要清晰的状态机定义和流转。
  6. 软删除: 考虑对重要主表(如 warehouse, sku, location)添加 is_deleted 标志位实现软删除,避免物理删除导致关联数据断裂。
  7. 数据量: 对于海量流水数据(如 inventory_transaction),考虑历史数据归档和分区表策略。
  8. 灵活性: 预留一些 extended_info (JSON类型) 或自定义字段 (custom_field1, custom_field2) 以适应未来可能的扩展需求(但不要滥用)。
  9. 序列号管理: 如果涉及高价值或强追溯性商品,序列号 (serial_no) 的管理需要更精细,可能需要单独的 serial_number 表记录每个序列号的状态、位置、历史。
  10. 波次管理(Wave Picking): 如果使用波次,需要增加 wave (波次表) 和 wave_detail (波次明细表),关联 orderpicking_order

这个设计是一个基础框架。实际项目中,需要根据以下因素进行详细设计和调整:

  • 行业特性: 电商、医药、冷链、制造业等差异巨大。
  • 仓库自动化程度: 自动化立库、AGV、输送线等需要额外的表记录设备状态、任务调度。
  • 业务流程复杂度: 越库、供应商管理库存、加工、质检等环节需要扩展。
  • 集成需求: 与ERP、TMS、OMS、MES等系统的接口字段映射。
  • 报表需求: 支撑报表的预计算或视图。

建议在开始编码前,使用数据库设计工具(如MySQL Workbench, pgAdmin, ERwin, PowerDesigner等)绘制详细的ER图,并反复与业务方确认流程和规则。分模块迭代开发也是一个好策略。

希望这个蓝图能为您设计WMS数据库提供一个坚实的起点!





4️⃣ 参考 4

好的,设计一个健壮且高效的WMS(仓库管理系统)数据库是系统成功的关键。核心在于精准建模仓库实体、状态流转和业务流程 ,并确保数据一致性、实时性、可追溯性和高性能

以下是一个核心、精简且可扩展的WMS数据库表设计,覆盖了主要功能模块。实际设计需根据具体业务(如电商仓、生产仓、冷链仓)、规模、自动化程度和流程深度进行调整。

核心设计原则:

  1. 实体清晰: 每张表代表一个核心业务实体(物料、库位、库存、任务、单据)。
  2. 关系明确: 使用外键定义清晰的关联(如库存属于哪个物料、在哪个库位)。
  3. 状态驱动: 关键实体(库存、任务、单据)必须有状态字段,记录生命周期。
  4. 事务保障: 库存变动、任务执行等关键操作需在数据库事务中进行。
  5. 审计追踪: 记录关键数据的创建/修改人和时间。
  6. 唯一标识: 主键(自增ID或UUID) + 业务唯一键(如库位编码、SKU、单号)。
  7. 性能考量: 高频查询表(库存、事务)需精心设计索引,考虑分区。

核心表清单与说明

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, ... 最核心表! 代表物料在特定库位、特定批次下的实时库存状态。quantityquantity_locked 是库存分配与扣减的基础。batch_numberstatus 是精细化管理和控制的关键。索引:(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_qtyputaway_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, ... 操作日志。记录关键操作行为,用于审计和安全追踪。记录变更前后的值(可选但推荐)。

关键流程与表交互示例

  1. 采购入库:

    • 创建 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 更新为"已上架"或"关闭"。
  2. 销售出库:

    • 创建 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 (减少 quantityquantity_locked)。(注:扣减时机可在拣货时或发货时)
    • 打包: 操作员将容器中的货物打包 -> 创建 packing 记录 -> 更新 container.statusshipment_line.packed_qty
    • 发运: 创建 shipping_task -> 操作员将打包好的容器运到月台装车 -> 更新 shipping_task.status & container.status & shipment_line.shipped_qty & shipment_order.status -> 可能触发最终扣减库存的事务 (如果拣货时未扣)。
    • 发货完成,更新 shipment_order.status 为"已发货"。
  3. 库内移库:

    • 创建 move_task (指定来源库位、目标库位、物料、数量、批次)。
    • 操作员执行移动 -> 更新 move_task.qty_moved -> 触发 inventory_transaction (类型=移库, from=源库位, to=目标库位) -> 更新 inventory (源库位减少, 目标库位增加)。
  4. 盘点:

    • 创建 cycle_countcount_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 = 完成。

关键设计决策与优化点

  1. 库存表 (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) 联合索引是必须的。考虑按仓库分区。
  2. 事务表 (inventory_transaction) 设计:

    • 溯源: reference_type + reference_id 是生命线。务必准确记录。
    • 性能: 数据量增长极快。按时间分区 (transaction_time)。索引 (item_id), (location_id), (reference_type, reference_id), (transaction_time)
    • 完整性: 所有库存变动必须通过此表记录。
  3. 库位表 (location) 设计:

    • 编码: code 需有规则(如 区-排-列-层),便于理解和系统处理。
    • 类型与属性: typeis_pickable/is_storable 驱动库位分配策略和任务生成。容量限制是硬约束。
    • 坐标: x_coord/y_coord/z_coord 用于计算最优拣货路径(如TSP算法)。
  4. 任务表 (*_task) 设计:

    • 状态驱动: status 字段管理任务生命周期(待分配、执行中、完成、取消)。操作员APP主要与这些表交互。
    • 分配与执行: assigned_to 记录责任人。start_time/complete_time 用于绩效分析。
    • 来源与目标: 清晰定义 from_*to_* (库位/容器)。
  5. 单据行进度: (receiving_line, shipment_line, count_line)

    • 使用多个字段 (received_qty/allocated_qty/picked_qty/packed_qty/shipped_qty/putaway_qty/counted_qty) 精确跟踪业务流程各阶段完成情况,驱动单据头状态 (status)。
  6. 灵活性:

    • 预留字段:custom_fields (JSON) 存储非核心动态属性。
    • 枚举类型: 使用数据库枚举或小表管理 status, type 等字段值,确保一致性和可维护性。
  7. 多租户/多仓库: 如果系统需要支持多个独立客户(货主)或多个物理仓库:

    • 在几乎所有核心表 (item, inventory, *_order, *_task, location) 增加 tenant_idowner_id 字段。
    • warehouse 表明确区分,并在关联表中包含 warehouse_id

总结

这个设计提供了一个坚实的WMS数据库基础。务必结合您的具体业务场景进行深度定制:

  • 电商仓: 重点优化海量SKU、快速订单履行(波次、拣货路径)、退货处理(增加 return 相关表)。
  • 生产仓/原材料仓: 强调批次追踪、先进先出 (FIFO/FEFO)、与MES/ERP的集成、领料管理。
  • 第三方物流 (3PL): 需要强大的多货主 (tenant) 支持、计费模块、更复杂的报表。
  • 自动化仓 (AS/RS): 需要增加设备控制、容器管理 (container 更复杂)、任务调度队列。

强烈建议:

  1. 绘制详细的ER图: 可视化表之间的关系。
  2. 进行原型验证: 用模拟数据测试核心流程(入库、出库、移库、盘点)的数据流转和性能。
  3. 持续迭代: 数据库设计不是一次性的,随着业务理解和需求变化,需要不断调整优化。

希望这个设计能为您提供一个清晰的起点!











相关推荐
xiaobin8899926 分钟前
PowerDesigner安装教程(附加安装包)PowerDesigner详细安装教程PowerDesigner 16.6 最新版安装教程
数据库·其他
程序员是干活的36 分钟前
Java EE前端技术编程脚本语言JavaScript
java·大数据·前端·数据库·人工智能
wei3872452321 小时前
集训总结2
java·数据库·mysql
t_hj1 小时前
Scrapy
前端·数据库·scrapy
种树达人2 小时前
数据库常用DDL语言
java·数据库·oracle
Gauss松鼠会2 小时前
华为云DRS实现Oracle到GaussDB数据库迁移的全流程技术方案
数据库·sql·安全·华为云·database·gaussdb
可涵不会debug3 小时前
AI浪潮涌,数据库“融合智能”奏响产业新乐章
数据库·人工智能
wei_shuo3 小时前
融合与智能:AI 浪潮驱动下数据库的多维度进化与产业格局重塑新范式
数据库·人工智能·金仓数据库
Fireworkitte3 小时前
Java 常用数据库详解
java·数据库
lifallen3 小时前
Flink堆状态后端核心:CopyOnWriteStateMap解析
java·大数据·数据结构·数据库·算法·flink·哈希算法