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

发布于:2025-07-27 ⋅ 阅读:(20) ⋅ 点赞:(0)

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图 (简化版概念模型):

  +---------------+      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. 持续迭代: 数据库设计不是一次性的,随着业务理解和需求变化,需要不断调整优化。

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

















5️⃣ 参考 5

好的,设计一个通用型WMS(仓库管理系统)的数据库表结构需要兼顾核心功能、灵活性、可扩展性和一定的行业适应性。以下是一个经过提炼的、相对通用的核心表结构设计,它覆盖了WMS最基础且必不可少的功能模块,并考虑了未来的扩展性。

设计核心原则:

  1. 模块化: 按功能模块划分表(基础数据、库存、入库、出库、库内、盘点)。
  2. 实体清晰: 每张表代表一个核心业务实体(如物料、库位、库存、单据、任务)。
  3. 关系明确: 使用外键定义清晰的关联关系。
  4. 状态驱动: 关键实体(库存、单据、任务)使用状态字段 (status) 管理其生命周期。
  5. 事务保障: 库存变动操作必须在数据库事务中进行,保证数据一致性。
  6. 可追溯性: 通过单据关联 (reference_type/reference_id) 和事务流水 (inventory_transaction) 实现全链路追踪。
  7. 扩展性:
    • 使用 type 字段区分不同类型(如入库类型、出库类型、任务类型)。
    • 预留 custom_fields (JSON) 存储非核心动态属性。
    • 考虑多租户 (tenant_id) 或货主 (owner_id) 支持。
  8. 性能: 高频操作表(库存、事务)需精心设计索引,考虑分区策略。

核心表清单与字段说明 (精简通用版)

1. 基础主数据 (Master Data)
表名 主键 核心字段 (加粗为关键/常用) 说明
warehouse warehouse_id code (UQ), name, location, contact_info, is_active 仓库信息。code 唯一标识仓库。
zone zone_id warehouse_id (FK), code (UQ), name, type (收货区/存储区/拣货区/发货区/退货区/…), description 库区信息。code 在仓库内唯一。type 定义功能分区。
location location_id zone_id (FK), code (UQ), type (货架位/地面位/月台/暂存位/…), max_volume, max_weight, x_coord, y_coord, is_pickable, is_storable, is_active, current_volume, current_weight 物理库位核心表。 code 需有规则且全局唯一。坐标用于路径优化。容量、类型、状态至关重要。current_* 为冗余字段需维护。
item item_id sku (UQ), name, description, barcode (主条码), category_id (FK), uom_id (FK), length, width, height, weight, volume, is_serialized, is_batch_tracked, shelf_life_days, storage_condition, is_active 物料/商品主数据核心。 sku 唯一标识。is_serialized/is_batch_tracked 决定库存管理粒度。
item_category category_id parent_id (FK), code, name, description 物料分类。支持树形结构。
unit_of_measure uom_id code (UQ), name (如 ‘个’, ‘箱’, ‘千克’) 计量单位。
supplier supplier_id code (UQ), name, contact_info, address, is_active 供应商信息。
customer customer_id code (UQ), name, contact_info, address, is_active 客户信息。
carrier carrier_id code (UQ), name, contact_info, service_types 承运商信息。
user user_id username (UQ), password_hash, real_name, role_id (FK), is_active 系统用户/操作员。关联角色权限表 (RBAC模型: role, permission, role_permission)。
container container_id code (UQ), type (纸箱/托盘/料箱/小车), current_location_id (FK), current_user_id (FK), status (空闲/使用中/待发运) 容器管理。用于拣货、打包、运输过程。
2. 库存核心 (Inventory Core)
表名 主键 核心字段 (加粗为关键/常用) 说明
inventory inventory_id location_id (FK), item_id (FK), quantity (可用数量), quantity_locked (锁定数量), quantity_damaged (不良品), batch_number, inventory_status (可用/冻结/质检中/待报废/…), expiration_date, last_count_date 库存状态核心表! 粒度:(location_id, item_id, batch_number, inventory_status)quantityquantity_locked 是核心。status 控制可用性。必须索引:(location_id, item_id, batch, status)
inventory_serial serial_id inventory_id (FK), serial_number (UQ), status (在库/已出库/…) 序列号明细表。 当物料 is_serialized=true 时使用。关联到具体的 inventory 记录。记录序列号状态。
inventory_transaction transaction_id transaction_type (收货/上架/拣货/发货/移库/调整/状态转换/…), item_id (FK), from_location_id (FK), to_location_id (FK), quantity (带符号), batch_number, serial_number, reference_type (单据类型), reference_id (单据ID), transaction_time, transacted_by 库存流水账核心! 记录所有库存变动。reference_type + reference_id 用于溯源到源头单据(如入库单、出库单)。必须索引:(item_id), (location_id), (ref_type, ref_id), (trans_time)。建议按时间分区。
3. 入库管理 (Receiving & Putaway)
表名 主键 核心字段 (加粗为关键/常用) 说明
receipt_order receipt_id receipt_number (UQ), type (采购入库/生产入库/退货入库/调拨入库/…), supplier_id (FK), expected_arrival, actual_arrival, warehouse_id (FK), status (创建/部分收货/已收货/已上架/关闭) 入库单头。记录入库业务整体信息。status 驱动流程。
receipt_line line_id receipt_id (FK), line_num, item_id (FK), expected_qty, received_qty, putaway_qty, uom_id (FK) 入库单行。跟踪物料收货和上架进度。
putaway_task task_id source_ref_type (‘RECEIPT’), source_ref_id, source_location_id (FK), item_id (FK), batch_number, qty_to_putaway, qty_putaway, suggested_to_location_id (FK), actual_to_location_id (FK), status (待分配/执行中/完成), assigned_to 上架任务。指导将货物从来源库位(如收货区)移动到目标存储/拣货库位。suggested 是系统推荐,actual 是实际操作。
4. 出库管理 (Shipping, Picking & Packing)
表名 主键 核心字段 (加粗为关键/常用) 说明
shipment_order shipment_id shipment_number (UQ), type (销售出库/退货出库/调拨出库/领料出库/…), customer_id (FK), carrier_id (FK), tracking_number, expected_ship, actual_ship, warehouse_id (FK), status (创建/已分配/部分拣货/已拣货/已打包/已发货/关闭) 发货单头。记录出库业务整体信息。复杂的状态反映多阶段流程。
shipment_line line_id shipment_id (FK), line_num, item_id (FK), ordered_qty, allocated_qty, picked_qty, packed_qty, shipped_qty, uom_id (FK) 发货单行。核心跟踪字段: allocated (库存锁定), picked (已从库位移出), packed (已打包), shipped (已离库)。
picking_task pick_task_id wave_id (FK - 可选), shipment_line_id (FK), item_id (FK), batch_number, qty_to_pick, qty_picked, from_location_id (FK), to_container_id (FK), status (待分配/执行中/完成), assigned_to, sequence 拣货任务。指导操作员从指定库位 (from_location_id) 拣多少数量放到哪个容器 (to_container_id)。sequence 用于优化拣货路径。
packing pack_id shipment_id (FK), container_id (FK), packed_by, packed_at, weight, dimensions 打包记录。记录哪个容器被打包进了哪个发货单,以及打包的物理信息。
5. 库内管理 (Internal Operations)
表名 主键 核心字段 (加粗为关键/常用) 说明
move_task move_id type (库位调整/补货上架/盘点移位/整理移库/…), reason, from_location_id (FK), to_location_id (FK), item_id (FK), batch_number, qty_to_move, qty_moved, status (待分配/执行中/完成), assigned_to 移库任务。指导在仓库内部移动库存。type 区分移动原因。
replenishment_task replen_id type (存储->拣货), source_location_id (FK - 存储位), target_location_id (FK - 拣货位), item_id (FK), batch_number, qty_to_replen, qty_replenished, status (待分配/执行中/完成), triggered_by (如 PICK ID) 补货任务。当拣货位库存不足时触发,从存储位补货到拣货位。triggered_by 记录触发源。
cycle_count count_id count_number (UQ), type (明盘/盲盘/动碰盘点/…), warehouse_id (FK), zone_id (FK), start_date, end_date, status (计划/执行/待审核/完成) 盘点单头。组织盘点活动。
count_line count_line_id count_id (FK), location_id (FK), item_id (FK - 明盘), batch_number (明盘), system_qty, counted_qty, counted_by, counted_at, variance_qty, adjusted_qty, adjust_reason, status (待盘/已盘/已调整) 盘点明细。记录盘点结果和差异处理。审核通过后,差异 (adjusted_qty - system_qty) 会生成库存调整事务 (inventory_transaction type=‘ADJUST’)。
6. 辅助与审计 (Auxiliary & Auditing)
表名 主键 核心字段 (加粗为关键/常用) 说明
operation_log log_id log_time, user_id (FK), module, operation, object_type, object_id, details (JSON), ip_address 操作日志。记录关键操作行为,用于审计和安全追踪。details 可存储操作前后快照。

通用性设计要点

  1. 核心实体覆盖: 包含了WMS最基础的实体:仓库、库区、库位、物料、供应商、客户、库存状态、库存流水、入库单、出库单、移库任务、盘点单。这是任何WMS的基石。
  2. 状态驱动流程 (status 字段): 几乎所有核心业务单据和任务都有 status 字段,通过状态变迁来驱动业务流程(如 receipt_order.status 从 “创建” -> “部分收货” -> “已收货” -> “已上架” -> “关闭”)。这使得流程逻辑清晰且易于扩展。
  3. 单据关联溯源 (reference_type + reference_id): inventory_transaction 表通过这两个字段精确关联到源头业务单据(如入库单行、出库单行、移库任务、盘点行)。这是实现库存操作全链路追溯的关键。
  4. 类型字段 (type): 广泛使用 type 字段来区分不同业务场景(如 receipt_order.type 区分采购入库还是退货入库,move_task.type 区分移库原因)。这大大增强了表的通用性,避免了为每种场景单独建表。
  5. 灵活扩展:
    • JSON 字段 (custom_fields): 在关键表(如 item, inventory, *_order)中加入 custom_fields JSON字段,用于存储业务特定的、非核心的动态属性(如物料颜色、客户特殊要求、库位特殊属性),无需频繁修改表结构。
    • 预留字段: 在关键表中预留1-2个 reserved_field1 (VARCHAR) 或 reserved_int1 等字段,应对短期内未知的小需求。
    • 模块化扩展: 此设计是核心骨架。特定行业需求(如冷链的温度记录、医药的GMP合规、电商的赠品管理、3PL的计费规则)可以在这些表基础上通过新增关联表或扩展字段实现。
  6. 多租户/多货主支持: 如果需要支持多个独立客户(货主)使用同一套WMS:
    • 在几乎所有核心业务表 (item, inventory, *_order, *_task, location) 增加 tenant_idowner_id (FK 关联 tenantcustomer 表)。
    • warehouse 表明确仓库归属 (tenant_id/owner_id)。
    • 确保所有查询和操作都严格按 tenant_id/owner_id 过滤。
  7. 性能考量:
    • 高频表索引: inventory, inventory_transaction, location, *_task 是高频读写表,必须根据查询模式设计高效索引(如 inventory(location_id, item_id, batch, status) 索引)。
    • 事务表分区: inventory_transaction 数据量增长极快,按 transaction_time (如按月或按年) 进行分区是常见优化手段。
    • 乐观锁:inventory 表的更新操作(尤其是分配、扣减库存)使用乐观锁(如 version 字段)或数据库行锁,防止超卖和并发冲突。

总结

这个通用型WMS数据库设计提供了:

  1. 核心功能完备性: 覆盖了仓库管理最基本的收货、上架、存储、拣货、打包、发货、移库、盘点等核心业务流程。
  2. 高度灵活性: 通过 status, type, custom_fields 等设计,能够适应不同行业和业务场景的基本需求。
  3. 坚实基础与可扩展性: 清晰的核心实体和关系为后续添加复杂功能(波次管理、越库作业、供应商协同、AGV调度集成、高级报表等)奠定了坚实的基础。扩展可以通过新增表、在现有表加字段(谨慎)或利用 custom_fields 实现。
  4. 可追溯性: 通过 inventory_transaction 和单据关联实现了库存变动的完整追踪。
  5. 通用架构: 这是一个经过验证的、适用于大多数中小型仓库或作为大型WMS核心模块的设计范式。

实施建议:

  • 结合业务深入理解: 即使是通用设计,也需要理解您具体的仓库类型(电商仓、生产仓、分销仓?)、主要业务流程和痛点。
  • 绘制ER图: 使用工具(如MySQL Workbench, Lucidchart, Draw.io)绘制实体关系图,可视化表之间的联系,便于团队理解和沟通。
  • 原型验证: 创建核心表,用模拟数据测试主要流程(如:创建物料 -> 创建入库单 -> 收货 -> 上架 -> 创建出库单 -> 分配库存 -> 拣货 -> 发货 -> 查看库存流水),验证设计的可行性和逻辑正确性。
  • 迭代演进: 数据库设计不是一次完成的。随着业务发展和需求细化,需要不断调整和优化表结构。保持设计的文档化。

这个设计为构建一个健壮、灵活且可持续演进的通用WMS系统提供了坚实的数据库基础。

















6️⃣ 参考 6

以下是针对通用WMS(仓库管理系统)的数据库表设计,包含核心模块的规范化设计,满足基础仓储业务需求:

1. 仓库基础信息表

CREATE TABLE warehouse (
    id INT PRIMARY KEY AUTO_INCREMENT,
    code VARCHAR(20) UNIQUE NOT NULL COMMENT '仓库编码',
    name VARCHAR(50) NOT NULL COMMENT '仓库名称',
    type ENUM('常温','冷藏','冷冻','危险品') NOT NULL COMMENT '仓库类型',
    address VARCHAR(100) COMMENT '仓库地址',
    status TINYINT DEFAULT 1 COMMENT '状态(0停用,1启用)',
    capacity DECIMAL(10,2) COMMENT '总容量(m³)',
    manager_id INT COMMENT '负责人ID',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

2. 库区/货架表

CREATE TABLE storage_location (
    id INT PRIMARY KEY AUTO_INCREMENT,
    warehouse_id INT NOT NULL COMMENT '所属仓库ID',
    parent_id INT DEFAULT 0 COMMENT '父区域ID(用于多级货架)',
    code VARCHAR(20) NOT NULL COMMENT '库位编码',
    type ENUM('存储区','拣货区','暂存区','退货区') NOT NULL,
    max_quantity INT COMMENT '最大存放数量',
    max_weight DECIMAL(10,2) COMMENT '最大承重(kg)',
    coordinates VARCHAR(50) COMMENT '坐标位置(A-01-02)',
    status TINYINT DEFAULT 1 COMMENT '状态(0禁用,1可用)',
    FOREIGN KEY (warehouse_id) REFERENCES warehouse(id)
);

3. 商品主数据表

CREATE TABLE product (
    id INT PRIMARY KEY AUTO_INCREMENT,
    sku VARCHAR(30) UNIQUE NOT NULL COMMENT '商品SKU',
    name VARCHAR(100) NOT NULL COMMENT '商品名称',
    spec VARCHAR(50) COMMENT '规格型号',
    unit VARCHAR(10) NOT NULL COMMENT '计量单位',
    category_id INT NOT NULL COMMENT '分类ID',
    weight DECIMAL(8,2) COMMENT '单件重量(kg)',
    volume DECIMAL(8,2) COMMENT '单件体积(m³)',
    shelf_life INT COMMENT '保质期(天)',
    is_batch TINYINT DEFAULT 0 COMMENT '是否批次管理',
    is_sn TINYINT DEFAULT 0 COMMENT '是否序列号管理'
);

4. 库存明细表

CREATE TABLE inventory (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    product_id INT NOT NULL,
    location_id INT NOT NULL,
    quantity INT NOT NULL COMMENT '当前数量',
    batch_no VARCHAR(30) COMMENT '批次号',
    production_date DATE COMMENT '生产日期',
    expiration_date DATE COMMENT '失效日期',
    status ENUM('正常','锁定','质检中','冻结') DEFAULT '正常',
    last_inbound_time DATETIME COMMENT '最后入库时间',
    FOREIGN KEY (product_id) REFERENCES product(id),
    FOREIGN KEY (location_id) REFERENCES storage_location(id),
    UNIQUE KEY idx_unique_stock (product_id, location_id, batch_no) -- 批次唯一约束
);

5. 入库单管理

-- 入库主单
CREATE TABLE inbound_order (
    id INT PRIMARY KEY AUTO_INCREMENT,
    order_no VARCHAR(30) UNIQUE NOT NULL COMMENT '入库单号',
    order_type ENUM('采购','退货','调拨','生产') NOT NULL,
    supplier_id INT COMMENT '供应商ID',
    warehouse_id INT NOT NULL,
    total_quantity INT NOT NULL,
    status ENUM('草稿','待收货','部分入库','已完成','已取消') DEFAULT '草稿',
    plan_arrive_time DATETIME COMMENT '计划到货时间',
    actual_arrive_time DATETIME COMMENT '实际到货时间',
    created_by INT NOT NULL COMMENT '创建人'
);

-- 入库明细
CREATE TABLE inbound_detail (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    order_id INT NOT NULL,
    product_id INT NOT NULL,
    plan_quantity INT NOT NULL COMMENT '计划数量',
    actual_quantity INT DEFAULT 0 COMMENT '实际入库数量',
    location_id INT NOT NULL COMMENT '上架库位',
    batch_no VARCHAR(30) COMMENT '批次号',
    FOREIGN KEY (order_id) REFERENCES inbound_order(id),
    FOREIGN KEY (product_id) REFERENCES product(id),
    FOREIGN KEY (location_id) REFERENCES storage_location(id)
);

6. 出库单管理

-- 出库主单
CREATE TABLE outbound_order (
    id INT PRIMARY KEY AUTO_INCREMENT,
    order_no VARCHAR(30) UNIQUE NOT NULL COMMENT '出库单号',
    order_type ENUM('销售','退货','调拨','领用') NOT NULL,
    customer_id INT COMMENT '客户ID',
    warehouse_id INT NOT NULL,
    total_quantity INT NOT NULL,
    status ENUM('草稿','待分配','拣货中','已发货','已取消') DEFAULT '草稿',
    plan_ship_time DATETIME COMMENT '计划发货时间',
    actual_ship_time DATETIME COMMENT '实际发货时间'
);

-- 出库明细
CREATE TABLE outbound_detail (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    order_id INT NOT NULL,
    product_id INT NOT NULL,
    quantity INT NOT NULL COMMENT '需求数量',
    picked_quantity INT DEFAULT 0 COMMENT '已拣数量',
    from_location_id INT NOT NULL COMMENT '下架库位',
    batch_no VARCHAR(30) COMMENT '批次号',
    FOREIGN KEY (order_id) REFERENCES outbound_order(id),
    FOREIGN KEY (product_id) REFERENCES product(id),
    FOREIGN KEY (from_location_id) REFERENCES storage_location(id)
);

7. 库存操作记录表

CREATE TABLE inventory_transaction (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    product_id INT NOT NULL,
    location_id INT NOT NULL,
    quantity INT NOT NULL COMMENT '变动数量(正数入库/负数出库)',
    batch_no VARCHAR(30) COMMENT '批次号',
    ref_type ENUM('入库','出库','调整','盘点') NOT NULL,
    ref_id VARCHAR(30) NOT NULL COMMENT '关联单据号',
    operator_id INT NOT NULL COMMENT '操作人',
    transaction_time DATETIME DEFAULT CURRENT_TIMESTAMP,
    remark VARCHAR(200) COMMENT '操作备注'
);

8. 盘点管理表

-- 盘点任务
CREATE TABLE stocktake_task (
    id INT PRIMARY KEY AUTO_INCREMENT,
    task_no VARCHAR(30) UNIQUE NOT NULL,
    warehouse_id INT NOT NULL,
    plan_time DATETIME COMMENT '计划盘点时间',
    start_time DATETIME COMMENT '实际开始时间',
    finish_time DATETIME COMMENT '完成时间',
    status ENUM('待开始','进行中','已完成','已取消') DEFAULT '待开始',
    operator_id INT COMMENT '操作人'
);

-- 盘点明细
CREATE TABLE stocktake_detail (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    task_id INT NOT NULL,
    product_id INT NOT NULL,
    location_id INT NOT NULL,
    system_quantity INT NOT NULL COMMENT '系统数量',
    counted_quantity INT COMMENT '盘点数量',
    variance INT GENERATED ALWAYS AS (counted_quantity - system_quantity) STORED COMMENT '差异值',
    batch_no VARCHAR(30) COMMENT '批次号',
    FOREIGN KEY (task_id) REFERENCES stocktake_task(id)
);

关键设计说明:

  1. 批次管理

    • 通过batch_no字段实现批次跟踪
    • 库存表(Inventory)使用复合唯一键保证同库位同批次商品唯一性
  2. 库位精细化管理

    • 库位表支持多级结构(仓库 > 区域 > 货架 > 储位)
    • 坐标字段实现物理位置快速定位
  3. 库存状态机

    • 库存状态(status)支持正常/锁定/质检等多状态
    • 事务记录表完整跟踪库存变动轨迹
  4. 效率优化

    • 出入库单分主单/明细两级结构
    • 系统数量与盘点数量分离存储,自动计算差异
    • 为高频查询字段(SKU、库位码、单据号)建立索引
  5. 扩展性考虑

    • 商品表预留批次/序列号管理标识
    • 仓库类型、库位类型使用枚举字段方便扩展
    • 所有核心表包含操作时间戳和操作人字段

建议根据实际业务需求添加以下扩展:

  • 序列号管理表(SN管理)
  • 供应商/客户信息表
  • 库存预警规则表
  • 波次策略配置表(用于优化拣货)
  • 作业任务调度表

此设计满足WMS系统的基础功能需求,支持多仓库、多货主、批次管理、库存状态控制等核心场景,同时保证数据的完整性和可追溯性。

















7️⃣ 参考 7

一个完整的WMS(仓库管理系统)数据库设计需要覆盖仓库的核心业务流程。以下是一个核心表结构设计及其说明,基于常见的仓库管理需求设计:


核心表清单 & 关键字段说明

1. 仓库基础信息
  • warehouse (仓库表)

    • id (PK, 主键)
    • name (仓库名称)
    • code (仓库编码, 唯一)
    • address (地址)
    • manager (负责人)
    • status (状态: 启用/禁用)
    • capacity (总容量)
    • type (仓库类型: 普通仓、冷链仓、保税仓…)
  • location (库位表) - 核心!

    • id (PK)
    • warehouse_id (FK, 所属仓库)
    • zone (库区: 如A区、B区、收货区、发货区、质检区、退货区、残品区)
    • aisle (通道号)
    • rack (货架号)
    • shelf (层号)
    • position (列号/位号)
    • location_code (完整库位编码, e.g., A-01-02-03, 唯一)
    • type (库位类型: 货架位、地面堆位、托盘位…)
    • status (状态: 空置、占用、锁定、禁用)
    • capacity (容量限制, e.g., 体积、重量、托盘数)
    • current_quantity (当前存放数量/体积/重量 - 冗余设计,便于快速查询)
2. 物料/商品信息
  • sku (Stock Keeping Unit, 库存最小单元表) - 核心!

    • id (PK)
    • sku_code (SKU编码, 唯一, e.g., 商品条码或内部编码)
    • name (商品名称)
    • specification (规格型号)
    • unit (基本单位: 个、箱、千克、米…)
    • length, width, height, volume (长宽高体积)
    • weight (重量)
    • category_id (FK, 商品分类)
    • supplier_id (FK, 默认供应商)
    • safety_stock (安全库存)
    • shelf_life (保质期, 天)
    • is_batch (是否管理批次)
    • is_serial (是否管理序列号)
    • custom_attrs (JSON, 扩展自定义属性)
  • sku_category (商品分类表)

    • id (PK)
    • name (分类名)
    • parent_id (父分类ID, 树形结构)
3. 库存管理 - 核心!
  • inventory (库存表) - 最核心!
    • id (PK)
    • sku_id (FK, 商品ID)
    • location_id (FK, 库位ID)
    • batch_number (批次号, 若管理批次) - 重要!
    • production_date (生产日期)
    • expiration_date (过期日期) - 重要!
    • quantity (当前数量) - 核心数据!
    • locked_quantity (锁定数量, e.g., 待出库、移库中) - 核心!
    • available_quantity (可用数量 = quantity - locked_quantity) - 冗余,核心!
    • status (库存状态: 正常、待检、冻结、残损…) - 重要!
    • last_inbound_time (最后入库时间)
    • last_outbound_time (最后出库时间)
    • inventory_version (库存版本号, 用于乐观锁) - 并发控制关键!
    • 注意: 此表设计决定了库存精度(库位+批次级别)。组合唯一索引通常为 (sku_id, location_id, batch_number, status)

4. 供应商与客户
  • supplier (供应商表)
    • id (PK)
    • name (名称)
    • code (编码)
    • contact_info (联系方式)
  • customer (客户表)
    • id (PK)
    • name (名称)
    • code (编码)
    • contact_info (联系方式)
5. 入库管理
  • asn (Advance Shipping Notice, 预收货通知单/入库单)
    • id (PK)
    • asn_number (单号, 唯一)
    • type (入库类型: 采购入库、调拨入库、退货入库、生产入库…)
    • supplier_id (FK, 供应商)
    • expected_arrival_time (预计到货时间)
    • status (状态: 新建、部分收货、已完成、关闭)
    • warehouse_id (FK, 目标仓库)
  • asn_detail (入库单明细)
    • id (PK)
    • asn_id (FK)
    • sku_id (FK)
    • expected_quantity (预期数量)
    • received_quantity (已收数量) - 更新中
    • batch_number (预期批次, 可选)
  • receiving (收货任务/记录)
    • id (PK)
    • asn_id (FK)
    • operator (操作员)
    • receiving_time (收货时间)
    • status (状态: 进行中、完成)
  • putaway_task (上架任务表)
    • id (PK)
    • source_doc_id (关联单据ID, e.g., ASN ID 或 Receiving ID)
    • source_doc_type (单据类型)
    • sku_id (FK)
    • quantity (待上架数量)
    • from_location_id (来源库位, 通常是收货暂存区)
    • to_location_id (目标库位)
    • status (状态: 待分配、已分配、进行中、已完成、取消)
    • operator (操作员)
    • assigned_time, start_time, completion_time (分配/开始/完成时间)
6. 出库管理
  • order (出库单/订单) - (可能是销售订单、调拨出库单、退货出库单等)
    • id (PK)
    • order_number (单号, 唯一)
    • type (出库类型: 销售出库、调拨出库、退货出库、领料出库…)
    • customer_id (FK, 客户, 销售出库时)
    • warehouse_id (FK, 发货仓库)
    • status (状态: 新建、部分拣货、部分发货、已完成、关闭)
    • priority (优先级)
    • required_ship_time (要求发货时间)
  • order_detail (出库单明细)
    • id (PK)
    • order_id (FK)
    • sku_id (FK)
    • requested_quantity (申请数量)
    • allocated_quantity (已分配库存数量) - 更新中
    • picked_quantity (已拣货数量) - 更新中
    • shipped_quantity (已发货数量) - 更新中
  • picking_task (拣货任务表)
    • id (PK)
    • order_id (FK, 关联出库单)
    • order_detail_id (FK, 关联明细)
    • wave_number (波次号, 用于波次拣货)
    • sku_id (FK)
    • quantity (需拣货数量)
    • from_location_id (来源库位)
    • status (状态: 待分配、已分配、进行中、已完成、取消)
    • picking_method (拣货方式: 按单拣、按波次拣、按库位拣…)
    • operator (操作员)
    • assigned_time, start_time, completion_time
  • shipping (发货单/装运单)
    • id (PK)
    • order_id (FK)
    • carrier (承运商)
    • tracking_number (物流单号)
    • shipping_time (发货时间)
    • operator (操作员)
    • status (状态: 待发货、已发货)
7. 库存移动与调整
  • move_task (移库任务表)
    • id (PK)
    • sku_id (FK)
    • batch_number (批次)
    • quantity (移动数量)
    • from_location_id (源库位)
    • to_location_id (目标库位)
    • reason (移库原因: 库存调整、补货、库位优化…)
    • status (状态: 创建、进行中、完成、取消)
    • operator
    • created_time, completion_time
  • inventory_adjustment (库存调整单)
    • id (PK)
    • adjust_number (调整单号)
    • warehouse_id (FK)
    • type (调整类型: 盘盈、盘亏、报损、报溢、成本调整…)
    • reason (详细原因)
    • status (状态: 草稿、已审核)
    • operator, approver, approve_time
  • adjustment_detail (调整明细)
    • id (PK)
    • adjustment_id (FK)
    • sku_id (FK)
    • location_id (FK)
    • batch_number (批次)
    • before_quantity (调整前数量)
    • after_quantity (调整后数量)
    • adjusted_quantity (调整量 = after - before)
8. 盘点管理
  • stocktake_plan (盘点计划)
    • id (PK)
    • plan_number (计划号)
    • warehouse_id (FK)
    • type (盘点方式: 全盘、循环盘点、动碰盘点、指定库位/商品)
    • start_time, end_time (计划时间)
    • status (状态: 计划中、进行中、已完成、取消)
  • stocktake_task (盘点任务)
    • id (PK)
    • plan_id (FK)
    • location_id (FK, 盘点的库位)
    • operator (盘点人)
    • status (状态: 待盘点、盘点中、已提交、已复盘)
    • counting_time (初盘时间)
    • recounting_time (复盘时间)
  • stocktake_record (盘点记录)
    • id (PK)
    • task_id (FK)
    • sku_id (FK)
    • batch_number (批次)
    • system_quantity (系统账面数量)
    • counted_quantity (初盘数量)
    • recounted_quantity (复盘数量)
    • adjusted_quantity (最终确认调整量) -> 最终会生成库存调整单
9. 系统基础与权限 (可选但重要)
  • user (用户表)
    • id (PK)
    • username (登录名, 唯一)
    • password (加密存储)
    • real_name (真实姓名)
    • role_id (FK, 角色)
    • status (状态: 启用/禁用)
  • role (角色表)
    • id (PK)
    • name (角色名)
    • description (描述)
  • permission (权限表)
    • id (PK)
    • name (权限名, e.g., inventory:view, asn:create)
    • description (描述)
  • role_permission (角色-权限关联表)
    • role_id (FK)
    • permission_id (FK)

关键设计要点与优化建议

  1. 库位管理是核心 (location): 精确的库位管理是实现高效作业的基础。库位编码规则需清晰且可扩展。
  2. 库存模型 (inventory): 采用 库位 + SKU + 批次 (+状态) 的精细化管理模型。available_quantity 是业务逻辑的关键。
  3. 库存事务与并发控制: 任何改变库存的操作(入库、出库、移库、调整)都必须通过事务处理,并考虑高并发下的数据一致性。inventory_version 字段是实现乐观锁的常见手段。
  4. 任务驱动 (*_task 表): 将仓库作业(上架、拣货、移库)分解为任务,是WMS调度和人员管理的基础。任务状态机设计要清晰。
  5. 批次与效期管理: batch_number, production_date, expiration_date 对于食品、药品、化工等行业至关重要。查询和作业(如FIFO)需依赖这些字段。
  6. 单据状态流: ASN、Order、Adjustment等单据的状态流转需要明确定义,并在数据库和业务逻辑中严格管理。
  7. 冗余字段: 适当使用冗余字段(如current_quantity in location, available_quantity in inventory, received_quantity in asn_detail, picked_quantity in order_detail)可以极大提升高频查询性能,但需注意在事务中维护一致性。
  8. 索引优化:
    • 高频查询字段必建索引 (e.g., sku.sku_code, location.location_code, inventory表的 (sku_id, location_id, batch_number, status), asn.asn_number, order.order_number)。
    • 任务表的状态字段通常需要索引。
    • 日期范围查询字段建索引 (e.g., inventory.expiration_date, asn.expected_arrival_time, order.required_ship_time)。
  9. 数据归档: 考虑历史任务记录、过期的库存记录(inventoryquantity=0 的记录)的归档策略,保证主业务表的高性能。
  10. 扩展性:
    • 使用 type 字段区分不同类型(仓库、库位、入库单、出库单、调整单等)。
    • 使用 JSON 字段(如 sku.custom_attrs)存储非核心或可变的扩展属性。
    • 预留一些 reserved 字段以备不时之需。

示例关系图 (简化版)

┌──────────┐       ┌──────────┐       ┌────────────┐       ┌─────────────┐
│ Warehouse│1───n──│ Location │1───n──│ Inventory  │n───1──│     SKU     │
└──────────┘       └──────────┘       └────────────┘       └─────────────┘
                      ^     ^                               ▲
                      |     |                               │
                      |     └──────┐                        │
┌──────────┐    ┌─────┴─────┐      │        ┌──────────┐    │
│ Supplier │1──n│    ASN    │n──1──┼─────n──│ASN Detail├────┘
└──────────┘    └───────────┘      │        └──────────┘
                 │                 │
                 ▼ (生成)          ▼ (生成)
            ┌──────────┐      ┌───────────┐
            │Receiving│      │PutawayTask│
            └──────────┘      └───────────┘

┌──────────┐    ┌──────────┐      ┌───────────┐      ┌─────────────┐
│ Customer │1──n│  Order   │n──1──│OrderDetail├──n───┼──┐          │
└──────────┘    └──────────┘      └───────────┘      │  ▼          │
                 │                                   │┌───────────┐│
                 ▼ (生成)                            ││PickingTask││
            ┌───────────┐      ┌──────────┐          │└───────────┘│
            │PickingTask├─────►│ Inventory│◄─────────┘             │
            └───────────┘      └──────────┘                       │
                          (消耗) ▲    ▲ (补充)                      │
                                │    │                            │
                                │    └───────────────┐            │
                                │                    │            │
                         ┌──────┴──────┐      ┌──────┴─────┐      │
                         │ MoveTask    │      │Stocktake   │      │
                         └─────────────┘      │ Record/Plan│      │
                                              └────────────┘      │
                                                                  ▼
                                                        ┌──────────────────┐
                                                        │InventoryAdjustment
                                                        └──────────────────┘

技术选型建议

  • 数据库: MySQL, PostgreSQL (推荐,功能强大), SQL Server, Oracle。
  • ORM 框架: MyBatis (灵活), Hibernate/JPA (开发快)。
  • 缓存: Redis (库存缓存、任务队列、配置缓存)。
  • 消息队列: RabbitMQ, Kafka (异步处理任务、库存变更通知、集成其他系统)。

这个设计提供了一个坚实的基础,实际项目中需要根据具体的业务场景、行业规范(如医药GSP)、仓库规模、自动化程度等进行详细调整和扩展。务必进行充分的业务需求分析和数据模型评审。

















8️⃣ 参考 8

以下是一个通用WMS(仓库管理系统)的核心数据库表设计,包含关键实体及其关系,采用规范化设计满足基本业务需求:

-- 仓库基础信息
CREATE TABLE warehouse (
  id INT PRIMARY KEY AUTO_INCREMENT,
  name VARCHAR(50) NOT NULL UNIQUE,  -- 仓库名称
  code VARCHAR(20) NOT NULL UNIQUE, -- 仓库编码
  address VARCHAR(100),             -- 仓库地址
  manager VARCHAR(30),              -- 负责人
  status TINYINT DEFAULT 1,         -- 状态(0:停用 1:启用)
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- 库区设置(仓库内分区)
CREATE TABLE storage_zone (
  id INT PRIMARY KEY AUTO_INCREMENT,
  warehouse_id INT NOT NULL,        -- 所属仓库
  name VARCHAR(50) NOT NULL,        -- 库区名称(如:A区、B区)
  type VARCHAR(20),                 -- 类型(常温区、冷藏区、危险品区)
  capacity INT,                     -- 库位容量
  FOREIGN KEY (warehouse_id) REFERENCES warehouse(id) ON DELETE CASCADE
);

-- 货架管理
CREATE TABLE shelf (
  id INT PRIMARY KEY AUTO_INCREMENT,
  zone_id INT NOT NULL,             -- 所属库区
  code VARCHAR(20) NOT NULL UNIQUE, -- 货架编码(如:A-01)
  max_level TINYINT DEFAULT 5,      -- 最大层数
  max_column TINYINT DEFAULT 10,    -- 最大列数
  status TINYINT DEFAULT 1,         -- 状态(0:禁用 1:启用)
  FOREIGN KEY (zone_id) REFERENCES storage_zone(id) ON DELETE CASCADE
);

-- 库位设计(最小存储单元)
CREATE TABLE storage_location (
  id INT PRIMARY KEY AUTO_INCREMENT,
  shelf_id INT NOT NULL,
  location_code VARCHAR(30) NOT NULL UNIQUE, -- 库位编码(如:A-01-02-03)
  level TINYINT NOT NULL,           -- 货架层数
  column_num TINYINT NOT NULL,      -- 货架列数
  volume DECIMAL(10,2),             -- 容积(m³)
  max_weight DECIMAL(10,2),         -- 最大承重(kg)
  status TINYINT DEFAULT 1,         -- 状态(0:禁用 1:空位 2:已占用)
  FOREIGN KEY (shelf_id) REFERENCES shelf(id) ON DELETE CASCADE
);

-- 商品/物料主数据
CREATE TABLE sku (
  id INT PRIMARY KEY AUTO_INCREMENT,
  sku_code VARCHAR(50) NOT NULL UNIQUE, -- 商品唯一编码
  name VARCHAR(100) NOT NULL,       -- 商品名称
  specification VARCHAR(100),       -- 规格型号
  unit VARCHAR(20),                 -- 单位(件/箱/千克)
  category VARCHAR(50),             -- 商品类别
  weight DECIMAL(10,2),             -- 单件重量(kg)
  volume DECIMAL(10,2),             -- 单件体积(m³)
  shelf_life INT,                   -- 保质期(天)
  is_batch TINYINT DEFAULT 0,       -- 是否批次管理(0:否 1:是)
  is_sn TINYINT DEFAULT 0           -- 是否序列号管理(0:否 1:是)
);

-- 库存表(核心)
CREATE TABLE inventory (
  id BIGINT PRIMARY KEY AUTO_INCREMENT,
  location_id INT NOT NULL,         -- 库位ID
  sku_id INT NOT NULL,              -- 商品ID
  quantity INT NOT NULL DEFAULT 0,  -- 当前数量
  batch_no VARCHAR(50),             -- 批次号
  production_date DATE,             -- 生产日期
  expiry_date DATE,                 -- 过期日期
  last_in_time DATETIME,            -- 最后入库时间
  last_out_time DATETIME,           -- 最后出库时间
  lock_status TINYINT DEFAULT 0,    -- 锁定状态(0:正常 1:锁定)
  UNIQUE KEY (location_id, sku_id, batch_no), -- 唯一约束
  FOREIGN KEY (location_id) REFERENCES storage_location(id),
  FOREIGN KEY (sku_id) REFERENCES sku(id)
);

-- 入库单主表
CREATE TABLE inbound_order (
  id BIGINT PRIMARY KEY AUTO_INCREMENT,
  order_no VARCHAR(30) NOT NULL UNIQUE, -- 入库单号
  order_type TINYINT NOT NULL,      -- 入库类型(1:采购 2:调拨 3:退货...)
  warehouse_id INT NOT NULL,        -- 目标仓库
  supplier_id INT,                  -- 供应商ID
  status TINYINT DEFAULT 0,         -- 状态(0:创建 1:部分入库 2:完成)
  total_quantity INT,               -- 计划总数
  received_quantity INT DEFAULT 0,  -- 已收数量
  created_time DATETIME NOT NULL,
  completed_time DATETIME,
  FOREIGN KEY (warehouse_id) REFERENCES warehouse(id)
);

-- 入库明细表
CREATE TABLE inbound_detail (
  id BIGINT PRIMARY KEY AUTO_INCREMENT,
  order_id BIGINT NOT NULL,         -- 入库单ID
  sku_id INT NOT NULL,              -- 商品ID
  plan_quantity INT NOT NULL,       -- 计划数量
  actual_quantity INT DEFAULT 0,    -- 实际数量
  location_id INT,                  -- 上架库位
  batch_no VARCHAR(50),             -- 批次号
  production_date DATE,             -- 生产日期
  status TINYINT DEFAULT 0,         -- 明细状态(0:待入库 1:完成)
  FOREIGN KEY (order_id) REFERENCES inbound_order(id) ON DELETE CASCADE,
  FOREIGN KEY (sku_id) REFERENCES sku(id),
  FOREIGN KEY (location_id) REFERENCES storage_location(id)
);

-- 出库单主表
CREATE TABLE outbound_order (
  id BIGINT PRIMARY KEY AUTO_INCREMENT,
  order_no VARCHAR(30) NOT NULL UNIQUE, -- 出库单号
  order_type TINYINT NOT NULL,      -- 出库类型(1:销售 2:调拨 3:退货...)
  warehouse_id INT NOT NULL,        -- 源仓库
  customer_id INT,                  -- 客户ID
  status TINYINT DEFAULT 0,         -- 状态(0:创建 1:部分出库 2:完成)
  total_quantity INT,               -- 计划总数
  shipped_quantity INT DEFAULT 0,   -- 已出数量
  created_time DATETIME NOT NULL,
  completed_time DATETIME,
  FOREIGN KEY (warehouse_id) REFERENCES warehouse(id)
);

-- 出库明细表
CREATE TABLE outbound_detail (
  id BIGINT PRIMARY KEY AUTO_INCREMENT,
  order_id BIGINT NOT NULL,         -- 出库单ID
  sku_id INT NOT NULL,              -- 商品ID
  plan_quantity INT NOT NULL,       -- 计划数量
  actual_quantity INT DEFAULT 0,    -- 实际数量
  from_location_id INT,             -- 下架库位
  batch_no VARCHAR(50),             -- 批次号
  status TINYINT DEFAULT 0,         -- 明细状态(0:待出库 1:完成)
  FOREIGN KEY (order_id) REFERENCES outbound_order(id) ON DELETE CASCADE,
  FOREIGN KEY (sku_id) REFERENCES sku(id),
  FOREIGN KEY (from_location_id) REFERENCES storage_location(id)
);

-- 库存移动记录(库内操作)
CREATE TABLE inventory_movement (
  id BIGINT PRIMARY KEY AUTO_INCREMENT,
  ref_no VARCHAR(30) NOT NULL,      -- 移动单号
  sku_id INT NOT NULL,              -- 商品ID
  batch_no VARCHAR(50),             -- 批次号
  from_location INT NOT NULL,       -- 源库位
  to_location INT NOT NULL,         -- 目标库位
  quantity INT NOT NULL,            -- 移动数量
  operator VARCHAR(30) NOT NULL,    -- 操作人
  move_time DATETIME DEFAULT CURRENT_TIMESTAMP,
  reason VARCHAR(100),              -- 移动原因
  FOREIGN KEY (sku_id) REFERENCES sku(id),
  FOREIGN KEY (from_location) REFERENCES storage_location(id),
  FOREIGN KEY (to_location) REFERENCES storage_location(id)
);

-- 盘点表
CREATE TABLE inventory_check (
  id BIGINT PRIMARY KEY AUTO_INCREMENT,
  check_no VARCHAR(30) NOT NULL UNIQUE, -- 盘点单号
  warehouse_id INT NOT NULL,
  check_type TINYINT,               -- 盘点类型(1:周期盘点 2:动碰盘点...)
  status TINYINT DEFAULT 0,         -- 状态(0:进行中 1:已完成)
  start_time DATETIME,
  end_time DATETIME,
  FOREIGN KEY (warehouse_id) REFERENCES warehouse(id)
);

-- 盘点明细
CREATE TABLE check_detail (
  id BIGINT PRIMARY KEY AUTO_INCREMENT,
  check_id BIGINT NOT NULL,
  location_id INT NOT NULL,
  sku_id INT NOT NULL,
  batch_no VARCHAR(50),
  system_qty INT NOT NULL,          -- 系统数量
  actual_qty INT,                   -- 实际数量
  variance INT,                     -- 差异数量
  checker VARCHAR(30),              -- 盘点人
  check_time DATETIME,
  FOREIGN KEY (check_id) REFERENCES inventory_check(id) ON DELETE CASCADE,
  FOREIGN KEY (location_id) REFERENCES storage_location(id),
  FOREIGN KEY (sku_id) REFERENCES sku(id)
);

核心设计说明:

  1. 层级结构设计
    仓库 → 库区 → 货架 → 库位 四级结构,支持灵活的仓库布局

  2. 库存管理关键特性

    • 批次管理(batch_no + 有效期)
    • 库位状态管理(空位/占用/禁用)
    • 库存锁定机制(lock_status)
    • 双单位管理(基本单位+包装单位,需扩展)
  3. 事务单据设计

    • 入库单:支持采购入库、退货入库、调拨入库等
    • 出库单:支持销售出库、退货出库、调拨出库等
    • 库内移动:记录库位调整
    • 盘点单:支持差异自动计算
  4. 扩展性考虑

    • 添加 supplier(供应商)和 customer(客户)表关联
    • 增加 unit_conversion 表处理多单位转换
    • 添加 user 表管理操作员权限
    • 增加 warehouse_area 表支持多仓库网络
  5. 性能优化

    • 库存表建立 (location_id, sku_id, batch_no) 联合索引
    • 单据表使用独立编号生成器(非自增ID)
    • 频繁查询字段添加索引(如sku_code、location_code)

关键业务表关系图:

warehouse storage_zone shelf storage_location inventory sku inbound_order inbound_detail outbound_order outbound_detail inventory_check check_detail contains contains contains stores has includes includes received shipped contains

此设计满足WMS基础功能需求,实际生产环境需根据业务场景扩展以下模块:

  1. 序列号管理(SN管理)
  2. 质检管理(QC模块)
  3. 越库操作(Cross-Docking)
  4. 库存预警策略
  5. 作业策略引擎(上架策略、拣货策略)
  6. 报表分析模块(库存周转率、库龄分析)

















9️⃣ 参考 9

以下是针对通用型WMS仓库管理系统的核心数据库表设计精简版,聚焦关键模块(基础信息、库存管理、入库、出库、库内操作),满足80%的业务场景需求:


一、基础信息模块

表名 核心字段 说明
warehouse id, code, name, status 仓库主信息
location id, warehouse_id, code, type, max_qty, status 库位(核心!状态字段必选)
sku id, code, name, spec, unit, volume, weight, is_batch 商品(批次管理标志)
supplier id, code, name, contact 供应商
customer id, code, name, address 客户
user id, name, role, warehouse_id 操作员及权限

二、库存管理模块(核心)

表名 核心字段 说明
inventory (核心表) id, location_id, sku_id, batch_no, quantity, allocated_qty, status 原子级库存(库位+SKU+批次唯一)
inventory_transaction id, type, sku_id, location_id, qty_change, ref_id, operator_id 所有库存变动的流水记录(审计溯源)

关键设计原则

  1. 库存原子性:库存表按location_id + sku_id + batch_no 唯一组合
  2. 状态字段inventory.status(正常/冻结/残次品)
  3. 双重锁机制allocated_qty(已分配数) + 事务流水表防超卖

三、入库流程

表名 核心字段 关联关系
asn (到货通知单) id, no, supplier_id, status → 供应商
asn_detail asn_id, sku_id, plan_qty → 商品
receiving (收货单) id, asn_id, status, operator_id → ASN单
receiving_detail receiving_id, sku_id, actual_qty, batch_no 生成批次号
putaway_task (上架任务) receiving_detail_id, to_location_id, status → 目标库位

四、出库流程

表名 核心字段 关键操作
order (出库单) id, no, customer_id, status 状态驱动流程
order_detail order_id, sku_id, demand_qty, picked_qty 跟踪拣货进度
picking_task (拣货任务) order_detail_id, from_location_id, pick_qty 关联库存分配
shipping (发货单) order_id, carrier_no, status 最终出库确认

🔄 状态流转
订单状态: 新建 → 已分配 → 部分拣货 → 拣货完成 → 已发货


五、库内操作

表名 核心字段 业务场景
stock_move (移库单) sku_id, batch_no, from_loc, to_loc, qty 库位调整/补货
stock_count (盘点单) location_id, sku_id, batch_no, sys_qty, actual_qty 库存校对
stock_adjust (调整单) sku_id, location_id, batch_no, qty_change, reason 盈亏处理

六、扩展设计建议

  1. 索引优化

    • 高频查询字段:sku_id + location_id + status
    • 事务流水表:ref_id(关联单据ID) + transaction_time
  2. 并发控制

    UPDATE inventory SET quantity = quantity - 10, version = version + 1 
    WHERE id = 100 AND version = 5; -- 乐观锁防止超卖
    
  3. 数据归档

    • inventory_transaction 按月分区,历史数据压缩存储
  4. 字典表(可选但推荐):

    • dict_inv_status(库存状态)
    • dict_order_type(订单类型)
    • dict_location_type(库位类型)

关键ER图关系

warehouse location inventory sku asn asn_detail receiving receiving_detail 1:N 1:N N:1 1:N N:1 1:N

为什么这样设计?

  1. 库存准确性

    • 通过 inventory 表原子化记录(库位+SKU+批次),避免汇总误差
    • inventory_transaction 记录每次变动,支持溯源
  2. 流程驱动

    • 单据状态机(如订单状态)驱动业务流程
    • 上架/拣货任务与库位强绑定
  3. 扩展性

    • 批次管理通过 is_batch 标志和 batch_no 字段实现
    • 库位类型(存储位/拣货位)通过 location.type 区分

💡 适合场景:电商仓库、制造业成品仓、零售配送中心等通用仓储场景,可根据业务增减模块(如序列号管理、质检流程)。

















🔟 参考 10

下面是一个通用WMS(仓库管理系统)的数据库表设计,包含核心模块和关键字段。设计遵循数据库规范化原则,同时考虑了扩展性和实际业务需求:

核心表结构设计

1. 仓库基础信息表

CREATE TABLE warehouse (
    warehouse_id INT PRIMARY KEY AUTO_INCREMENT,
    warehouse_code VARCHAR(20) UNIQUE NOT NULL,  -- 仓库编码
    warehouse_name VARCHAR(100) NOT NULL,        -- 仓库名称
    address VARCHAR(200),                        -- 地址
    manager VARCHAR(50),                         -- 负责人
    status TINYINT DEFAULT 1 NOT NULL,           -- 状态(0:停用 1:启用)
    create_time DATETIME DEFAULT CURRENT_TIMESTAMP,
    update_time DATETIME ON UPDATE CURRENT_TIMESTAMP
);

2. 库区/库位表

CREATE TABLE location (
    location_id INT PRIMARY KEY AUTO_INCREMENT,
    warehouse_id INT NOT NULL,                   -- 所属仓库
    parent_location_id INT,                      -- 父库位(库区>库位)
    location_code VARCHAR(20) NOT NULL,          -- 库位编码
    location_type TINYINT NOT NULL,              -- 类型(1:库区 2:货架 3:储位)
    capacity DECIMAL(10,2),                      -- 容量限制(kg/m³)
    current_capacity DECIMAL(10,2) DEFAULT 0,    -- 当前容量
    status TINYINT DEFAULT 1,                    -- 状态(0:禁用 1:空闲 2:占用)
    is_pick_location BOOLEAN DEFAULT FALSE,      -- 是否为拣货位
    FOREIGN KEY (warehouse_id) REFERENCES warehouse(warehouse_id)
);

3. 物料主数据表

CREATE TABLE material (
    material_id INT PRIMARY KEY AUTO_INCREMENT,
    sku VARCHAR(50) UNIQUE NOT NULL,             -- 唯一物料编码
    material_name VARCHAR(100) NOT NULL,
    specification VARCHAR(200),                  -- 规格型号
    unit VARCHAR(20) NOT NULL,                   -- 计量单位
    material_type VARCHAR(30),                   -- 物料分类
    weight DECIMAL(10,2),                        -- 单件重量(kg)
    volume DECIMAL(10,2),                        -- 单件体积(m³)
    shelf_life INT,                              -- 保质期(天)
    is_batch_control BOOLEAN DEFAULT FALSE,      -- 批次管理
    is_sn_control BOOLEAN DEFAULT FALSE,         -- 序列号管理
    min_stock INT,                               -- 安全库存
    max_stock INT,                               -- 最大库存
    create_time DATETIME DEFAULT CURRENT_TIMESTAMP
);

4. 库存表 (核心)

CREATE TABLE inventory (
    inventory_id BIGINT PRIMARY KEY AUTO_INCREMENT,
    warehouse_id INT NOT NULL,
    location_id INT NOT NULL,
    material_id INT NOT NULL,
    quantity DECIMAL(12,4) NOT NULL DEFAULT 0,   -- 当前数量
    batch_no VARCHAR(50),                        -- 批次号
    serial_no VARCHAR(100),                      -- 序列号(JSON数组)
    production_date DATE,                        -- 生产日期
    expiry_date DATE,                            -- 过期日期
    inventory_status TINYINT NOT NULL DEFAULT 1, -- 状态(1:正常 2:冻结 3:质检)
    last_inbound_time DATETIME,                  -- 最后入库时间
    last_outbound_time DATETIME,                 -- 最后出库时间
    version INT NOT NULL DEFAULT 0,              -- 乐观锁版本号
    UNIQUE KEY uq_stock (warehouse_id, location_id, material_id, batch_no),
    FOREIGN KEY (warehouse_id) REFERENCES warehouse(warehouse_id),
    FOREIGN KEY (location_id) REFERENCES location(location_id),
    FOREIGN KEY (material_id) REFERENCES material(material_id)
);

5. 入库单表

CREATE TABLE inbound_order (
    order_id BIGINT PRIMARY KEY AUTO_INCREMENT,
    order_no VARCHAR(50) UNIQUE NOT NULL,        -- 入库单号
    order_type TINYINT NOT NULL,                 -- 类型(1:采购 2:退货 3:调拨)
    warehouse_id INT NOT NULL,
    supplier_id INT,                             -- 供应商
    reference_no VARCHAR(50),                    -- 关联单号(采购单等)
    total_quantity DECIMAL(12,4) NOT NULL,
    actual_quantity DECIMAL(12,4) DEFAULT 0,     -- 实际入库量
    status TINYINT NOT NULL DEFAULT 0,           -- 状态(0:草稿 1:已审核 2:部分入库 3:完成)
    operator VARCHAR(50),                        -- 操作员
    create_time DATETIME DEFAULT CURRENT_TIMESTAMP,
    complete_time DATETIME
);

6. 入库明细表

CREATE TABLE inbound_detail (
    detail_id BIGINT PRIMARY KEY AUTO_INCREMENT,
    order_id BIGINT NOT NULL,
    material_id INT NOT NULL,
    plan_quantity DECIMAL(12,4) NOT NULL,        -- 计划数量
    actual_quantity DECIMAL(12,4) DEFAULT 0,     -- 实际数量
    location_id INT NOT NULL,                    -- 上架库位
    batch_no VARCHAR(50),                        -- 批次号
    serial_nos JSON,                             -- 序列号列表
    quality_status TINYINT,                      -- 质检状态
    FOREIGN KEY (order_id) REFERENCES inbound_order(order_id)
);

7. 出库单表

CREATE TABLE outbound_order (
    order_id BIGINT PRIMARY KEY AUTO_INCREMENT,
    order_no VARCHAR(50) UNIQUE NOT NULL,        -- 出库单号
    order_type TINYINT NOT NULL,                 -- 类型(1:销售 2:退货 3:调拨)
    warehouse_id INT NOT NULL,
    customer_id INT,                             -- 客户
    reference_no VARCHAR(50),                    -- 关联单号(销售单等)
    total_quantity DECIMAL(12,4) NOT NULL,
    actual_quantity DECIMAL(12,4) DEFAULT 0,     -- 实际出库量
    status TINYINT NOT NULL DEFAULT 0,           -- 状态(0:草稿 1:已分配 2:部分出库 3:完成)
    operator VARCHAR(50),                        -- 操作员
    create_time DATETIME DEFAULT CURRENT_TIMESTAMP,
    complete_time DATETIME
);

8. 出库明细表

CREATE TABLE outbound_detail (
    detail_id BIGINT PRIMARY KEY AUTO_INCREMENT,
    order_id BIGINT NOT NULL,
    material_id INT NOT NULL,
    plan_quantity DECIMAL(12,4) NOT NULL,        -- 计划数量
    actual_quantity DECIMAL(12,4) DEFAULT 0,     -- 实际数量
    from_location_id INT NOT NULL,               -- 下架库位
    batch_no VARCHAR(50),                        -- 批次号
    serial_nos JSON,                             -- 序列号列表
    FOREIGN KEY (order_id) REFERENCES outbound_order(order_id)
);

9. 库存移动表

CREATE TABLE inventory_movement (
    movement_id BIGINT PRIMARY KEY AUTO_INCREMENT,
    from_location_id INT NOT NULL,               -- 源库位
    to_location_id INT NOT NULL,                 -- 目标库位
    material_id INT NOT NULL,
    quantity DECIMAL(12,4) NOT NULL,
    batch_no VARCHAR(50),
    movement_type TINYINT NOT NULL,              -- 移动类型(1:补货 2:调整)
    operator VARCHAR(50),
    movement_time DATETIME DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (from_location_id) REFERENCES location(location_id),
    FOREIGN KEY (to_location_id) REFERENCES location(location_id)
);

10. 盘点表

CREATE TABLE inventory_check (
    check_id BIGINT PRIMARY KEY AUTO_INCREMENT,
    warehouse_id INT NOT NULL,
    check_no VARCHAR(50) UNIQUE NOT NULL,
    check_time DATETIME NOT NULL,                -- 盘点时间
    operator VARCHAR(50),
    status TINYINT DEFAULT 0,                    -- 状态(0:进行中 1:已完成)
    create_time DATETIME DEFAULT CURRENT_TIMESTAMP
);

CREATE TABLE check_detail (
    detail_id BIGINT PRIMARY KEY AUTO_INCREMENT,
    check_id BIGINT NOT NULL,
    location_id INT NOT NULL,
    material_id INT NOT NULL,
    system_quantity DECIMAL(12,4) NOT NULL,      -- 系统数量
    actual_quantity DECIMAL(12,4) NOT NULL,      -- 实盘数量
    batch_no VARCHAR(50),
    variance DECIMAL(12,4) AS (actual_quantity - system_quantity), -- 差异计算
    variance_reason VARCHAR(200),
    FOREIGN KEY (check_id) REFERENCES inventory_check(check_id)
);

关键设计说明

  1. 库存管理核心

    • 库存表(inventory)采用 (仓库+库位+物料+批次) 唯一键设计
    • 支持批次/序列号双管理模式
    • 包含乐观锁(version字段)解决并发更新
  2. 业务单据设计

    • 入库/出库单采用 主单+明细 结构
    • 状态机管理(草稿->审核->执行->完成)
    • 支持关联业务单据(采购单/销售单等)
  3. 库位管理

    • 树形结构库位设计(库区->货架->储位)
    • 容量管理(物理限制+当前容量)
    • 拣货位标记(is_pick_location)
  4. 扩展性设计

    • 物料类型字段支持自定义分类
    • 单据类型字段支持多种业务场景
    • JSON字段存储序列号(兼容不同物料管理要求)
  5. 性能优化

    • 大表使用BIGINT主键
    • 关键查询字段建立索引(sku、库位编码、单据号)
    • 计算字段(variance)减少业务逻辑复杂度

补充表建议

-- 供应商表
CREATE TABLE supplier (
    supplier_id INT PRIMARY KEY AUTO_INCREMENT,
    supplier_code VARCHAR(20) UNIQUE,
    supplier_name VARCHAR(100) NOT NULL
);

-- 客户表
CREATE TABLE customer (
    customer_id INT PRIMARY KEY AUTO_INCREMENT,
    customer_code VARCHAR(20) UNIQUE,
    customer_name VARCHAR(100) NOT NULL
);

-- 库存事务日志表(用于追溯)
CREATE TABLE inventory_transaction (
    trans_id BIGINT PRIMARY KEY AUTO_INCREMENT,
    material_id INT NOT NULL,
    warehouse_id INT NOT NULL,
    location_id INT NOT NULL,
    quantity_change DECIMAL(12,4) NOT NULL,      -- 库存变动量
    trans_type VARCHAR(20) NOT NULL,             -- 事务类型(IN/OUT/MOVE)
    ref_no VARCHAR(50) NOT NULL,                 -- 关联单据号
    trans_time DATETIME DEFAULT CURRENT_TIMESTAMP
);

设计原则

  1. 数据一致性:通过事务保证库存操作的原子性
  2. 可追溯性:事务日志记录所有库存变动
  3. 灵活性:支持批次/序列号/非批次多种管理模式
  4. 性能考虑:读写分离设计,高频查询字段单独索引
  5. 扩展能力:预留自定义字段(如物料分类、单据类型)

此设计可满足中小型WMS系统需求,大型系统可根据业务场景增加分库分表、历史数据归档等机制。实际实施时需根据具体业务流程调整字段细节和索引策略。

















🧠 参考 11

以下是针对通用型WMS仓库管理系统的核心数据库表设计,聚焦关键业务模块,兼顾灵活性与可扩展性。设计精简至 20张核心表,满足大多数仓库场景需求(电商、零售、制造业、物流等)。


核心表清单及字段说明

1. 基础数据模块
表名 核心字段 说明
warehouse id, code(唯一), name, address, status(启用/停用), contact_info 仓库主信息
location id, warehouse_id, zone_code(库区), loc_code(库位编码唯一), type(存储/拣货/暂存), max_volume, status 库位管理(最小存储单元)
item id, sku(唯一), name, spec, uom(单位), volume, weight, is_batch(是否批次管理), is_serial(是否序列号) 商品/物料主数据
supplier id, code, name, contact 供应商信息
customer id, code, name, contact 客户信息(用于出库)

2. 库存管理模块
表名 核心字段 说明
inventory id, item_id, location_id, batch_no, serial_no, qty, status(良品/冻结/不良品), prod_date, exp_date 库存快照(核心表)
inventory_txn id, txn_type(入库/出库/移库/调整), item_id, from_loc, to_loc, qty, batch_no, ref_order_id(关联单据), operator, txn_time 库存流水(所有操作记录)

关键设计

  • inventory 唯一索引:(item_id, location_id, batch_no, serial_no, status)
  • inventory_txn 高频查询索引:(txn_time, item_id, ref_order_id)

3. 入库管理模块
表名 核心字段 说明
asn id, asn_no(唯一), supplier_id, expected_time, status(新建/收货中/完成) 预约入库单
asn_detail id, asn_id, item_id, plan_qty, received_qty 预约单明细
receiving id, asn_id, receiving_time, operator, status(待质检/质检完成) 实际收货单
putaway_task id, item_id, from_loc(收货区), to_loc(目标库位), qty, operator, status(待执行/完成) 上架任务

4. 出库管理模块
表名 核心字段 说明
outbound_order id, order_no(唯一), customer_id, type(销售/退货), priority, status(新建/拣货中/已发货) 出库订单
outbound_detail id, order_id, item_id, order_qty, picked_qty, packed_qty 出库订单明细
picking_task id, order_id, item_id, location_id, qty, operator, status 拣货任务
shipping id, order_id, shipping_no, carrier, operator, shipped_time 发货记录

5. 库内作业模块
表名 核心字段 说明
movement_task id, item_id, from_loc, to_loc, qty, reason(补货/整理), operator, status 库内移库/补货任务
cycle_count id, count_no, warehouse_id, status(进行中/完成), start_time, end_time 盘点任务单
count_detail id, count_id, location_id, item_id, batch_no, sys_qty, actual_qty, variance 盘点明细

关键设计原则

  1. 去过度范式化

    • 允许适度冗余(如outbound_detail中存储sku名称),减少多表关联。
    • 库位编码location.loc_code全局唯一(例:A-01-02-003),直接定位仓库位置。
  2. 库存双表驱动

    • inventory:实时库存快照(高频查询)。
    • inventory_txn:操作流水(用于对账、追溯)。
  3. 状态机设计

    • 关键业务表(asn, outbound_order, task)包含status字段,用枚举值驱动流程(如出库单状态: 新建→分配→拣货→发货)。
  4. 批次/序列号灵活管理

    • item.is_batch/is_serial控制是否启用批次序列号。
    • 库存操作时按需填写batch_no/serial_no
  5. 任务驱动作业

    • 所有仓库操作(上架、拣货、移库)均通过任务表(*_task)驱动,记录操作人、时间、状态。

核心表关系图

warehouse location inventory item asn_detail outbound_detail asn receiving putaway_task outbound_order picking_task cycle_count count_detail inventory_txn 1:N 1:N 1:N 1:N 1:N 1:N 1:N 1:N 1:N 1:N 1:N 记录流水

性能优化建议

  1. 索引策略

    • inventory(item_id, location_id, status) + batch_no(复合索引)
    • inventory_txn(txn_time DESC, item_id)(时间倒序查最新记录)
    • 任务表:(status, operator)(快速查待办任务)
  2. 分区表

    • inventory_txn 按月份分区,避免单表过大。
  3. 异步写日志

    • 库存流水(inventory_txn)通过消息队列异步写入,保证主流程性能。
  4. 热点数据缓存

    • 实时库存(inventory)缓存到Redis,KEY设计:WH{warehouse_id}:SKU{item_id}:LOC{location_id}

扩展性设计

  1. 预留字段
    • 核心表加 ext_info (JSON类型),存储自定义属性(如温湿度要求、货主信息)。
  2. 策略配置化
    • 上架/拣货策略单独建表(strategy_rule),动态分配库位。
  3. 多仓库支持
    • 所有表包含warehouse_id,天然支持多仓架构。

精简版核心表数量:20张(满足90%通用场景)
适用场景:电商仓库、第三方物流、制造业原材料仓、零售配送中心
数据库兼容:MySQL 8.0+ / PostgreSQL / SQL Server

此设计平衡了复杂度与灵活性,可直接用于中小型WMS系统,或作为大型系统的核心基础。

















🧠 参考 12

设计一个通用的WMS(仓库管理系统)数据库表结构需覆盖核心仓储业务流程。以下是关键表的设计方案,采用模块化设计并遵循数据库规范化原则:


1. 基础信息模块
仓库表 (warehouse)
字段名 类型 描述
warehouse_id INT PK 仓库ID(主键)
warehouse_code VARCHAR(20) 仓库编码(唯一)
name VARCHAR(50) 仓库名称
address VARCHAR(100) 地址
manager VARCHAR(20) 负责人
status TINYINT 状态(0停用,1启用)
库区/货架/库位表 (location)
字段名 类型 描述
location_id INT PK 库位ID(主键)
parent_id INT FK 父级ID(货架>库区>仓库)
location_type CHAR(1) 类型(R库区/S货架/B库位)
location_code VARCHAR(20) 编码(如:A-01-001)
capacity DECIMAL(10,2) 容量(单位:立方米)
status TINYINT 状态(0禁用,1启用)

2. 物料管理模块
物料表 (material)
字段名 类型 描述
material_id INT PK 物料ID
sku_code VARCHAR(30) SKU编码(唯一)
name VARCHAR(50) 物料名称
spec VARCHAR(50) 规格型号
unit VARCHAR(10) 单位(件/箱等)
category_id INT FK 分类ID(关联分类表)
物料分类表 (material_category)
字段名 类型 描述
category_id INT PK 分类ID
category_name VARCHAR(30) 分类名称(如:电子产品)
parent_id INT 父级分类ID(树形结构)

3. 库存管理模块
库存表 (inventory)
字段名 类型 描述
inventory_id BIGINT PK 库存ID
warehouse_id INT FK 仓库ID
location_id INT FK 库位ID
material_id INT FK 物料ID
batch_no VARCHAR(30) 批次号(可为空)
quantity DECIMAL(10,2) 当前数量
lock_quantity DECIMAL(10,2) 锁定数量(用于冻结库存)
status TINYINT 状态(0正常,1冻结)

4. 作业管理模块
入库单表 (inbound_order)
字段名 类型 描述
order_id BIGINT PK 入库单ID
order_no VARCHAR(30) 入库单号(唯一)
warehouse_id INT FK 仓库ID
supplier_id INT FK 供应商ID
status TINYINT 状态(0草稿,1已入库)
total_quantity DECIMAL(10,2) 计划总数
actual_quantity DECIMAL(10,2) 实际入库数
入库明细表 (inbound_detail)
字段名 类型 描述
detail_id BIGINT PK 明细ID
order_id BIGINT FK 入库单ID
material_id INT FK 物料ID
plan_quantity DECIMAL(10,2) 计划数量
actual_quantity DECIMAL(10,2) 实际数量
location_id INT FK 上架库位ID
出库单表 (outbound_order)

(结构与入库单类似,增加 customer_id 字段关联客户)


5. 作业任务模块
上架任务表 (putaway_task)
字段名 类型 描述
task_id BIGINT PK 任务ID
inbound_id BIGINT FK 入库单ID
material_id INT FK 物料ID
from_location INT 来源位置(如收货区)
to_location INT FK 目标库位ID
quantity DECIMAL(10,2) 上架数量
operator VARCHAR(20) 操作员
status TINYINT 状态(0待处理,1完成)
拣货任务表 (picking_task)

(结构与上架任务类似,关联出库单)


6. 扩展模块
盘点表 (stocktake)
字段名 类型 描述
stocktake_id BIGINT PK 盘点ID
warehouse_id INT FK 仓库ID
location_id INT FK 库位ID
material_id INT FK 物料ID
system_qty DECIMAL(10,2) 系统库存数
counted_qty DECIMAL(10,2) 盘点数量
variance DECIMAL(10,2) 差异数量
库存移动表 (inventory_move)

(记录库内调拨,包含源库位、目标库位、移动数量)


关键关系说明
  1. 层级结构
    warehouselocation(通过parent_id构建树形结构)
  2. 库存事务
    入库/出库操作通过事务更新 inventory 表,确保数据一致性
  3. 任务驱动
    入库生成 inbound_order → 触发 putaway_task → 更新 inventory
  4. 批次管理
    inventory.batch_no 支持先进先出(FIFO)策略

优化设计建议
  1. 索引优化
    CREATE INDEX idx_inventory_location ON inventory(location_id);
    CREATE UNIQUE INDEX idx_sku_warehouse ON inventory(material_id, warehouse_id);
    
  2. 分区表
    inventory 表按 warehouse_id 分区,提升查询性能
  3. 冗余字段
    inbound_order 中冗余 total_quantity,避免实时聚合计算
  4. 并发控制
    使用乐观锁(如版本号字段)处理库存更新冲突

ER图核心关系
warehouse location inventory material inbound_order inbound_detail putaway_task contains stores has includes references generates to_location

此设计满足通用WMS的核心需求,可根据实际业务扩展(如序列号管理、质检模块)。建议结合具体业务场景调整字段细节。




























网站公告

今日签到

点亮在社区的每一天
去签到