wms/.qoder/repowiki/zh/content/数据库设计/数据库设计.md

24 KiB
Raw Blame History

数据库设计

**本文引用的文件** - [WmsMaterial.java](file://nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/WmsMaterial.java) - [WmsWarehouse.java](file://nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/WmsWarehouse.java) - [WmsBin.java](file://nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/WmsBin.java) - [WmsInventory.java](file://nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/WmsInventory.java) - [WmsStorage.java](file://nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/WmsStorage.java) - [VStorage.java](file://nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/VStorage.java) - [WmsInventoryCheckTask.java](file://nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/WmsInventoryCheckTask.java) - [WmsInventoryCheckTaskItem.java](file://nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/WmsInventoryCheckTaskItem.java) - [WmsSrmOrder.java](file://nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/WmsSrmOrder.java) - [InventoryInDTO.java](file://nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/dto/InventoryInDTO.java) - [InventoryVO.java](file://nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/InventoryVO.java) - [MysqlDataSourceConfig.java](file://nflg-wms-repository/src/main/java/com/nflg/wms/repository/config/MysqlDataSourceConfig.java) - [AuditInnerInterceptor.java](file://nflg-wms-repository/src/main/java/com/nflg/wms/repository/interceptor/AuditInnerInterceptor.java) - [WmsStructuralPackageMapper.xml](file://nflg-wms-repository/src/main/resources/mapper/WmsStructuralPackageMapper.xml) - [WmsInCostcenterBackTicketMapper.xml](file://nflg-wms-repository/src/main/resources/mapper/WmsInCostcenterBackTicketMapper.xml) - [RedisDataInitRunner.java](file://nflg-wms-admin/src/main/java/com/nflg/wms/admin/runner/RedisDataInitRunner.java)

目录

  1. 简介
  2. 项目结构
  3. 核心组件
  4. 架构总览
  5. 详细组件分析
  6. 依赖分析
  7. 性能考虑
  8. 故障排查指南
  9. 结论
  10. 附录

简介

本文件面向NFLG WMS系统的数据库设计与实现聚焦于核心业务实体物料、库位、库存、订单等的ER模型、表结构设计、主外键关系、数据访问层MyBatis-Plus实现、SQL优化策略、数据迁移与版本管理、性能优化、数据安全与备份恢复以及数据库管理员的维护与监控方法。文档内容严格基于仓库中的实体类、映射XML与配置类进行归纳总结并通过图示化方式呈现关键流程与关系。

项目结构

WMS系统采用多模块分层架构数据库相关的核心代码主要分布在以下模块

  • repository持久层与实体定义包含实体类、Mapper接口及XML映射、MyBatis配置与拦截器。
  • common通用领域对象DTO/VO、常量与工具类用于跨模块的数据传输与业务参数封装。
  • admin管理端应用包含启动时的缓存初始化逻辑与业务控制器。

下图为与数据库设计直接相关的模块与文件关系概览:

graph TB
subgraph "持久层(repository)"
E1["实体类<br/>WmsMaterial/WmsWarehouse/WmsBin/WmsInventory/WmsStorage/VStorage"]
M1["Mapper XML<br/>WmsStructuralPackageMapper.xml<br/>WmsInCostcenterBackTicketMapper.xml"]
C1["MyBatis配置<br/>MysqlDataSourceConfig.java"]
I1["审计拦截器<br/>AuditInnerInterceptor.java"]
end
subgraph "通用(common)"
D1["DTO/VO<br/>InventoryInDTO/InventoryVO"]
end
subgraph "管理端(admin)"
R1["Redis初始化<br/>RedisDataInitRunner.java"]
end
E1 --> C1
M1 --> C1
C1 --> I1
D1 --> E1
R1 --> C1

图表来源

章节来源

核心组件

本节概述与数据库设计直接相关的核心实体与视图说明其职责与字段含义字段命名遵循下划线风格对应MyBatis自动驼峰映射

  • 物料WmsMaterial

    • 关键字段noSAP料号、describe描述、drawingNo图号、weight/length/width/height物理属性、supplierId供应商、requirement打包要求、sapState/sapErrorSAP同步状态与错误信息
    • 设计要点使用自增ID作为主键提供complete计算字段用于标识是否完成图片与重量非空
  • 库存地点WmsWarehouse

    • 关键字段no/name编码/名称、userName/checkUserName责任人/盘点责任人、phone/address联系方式/地址、factoryId所属工厂、isDisableLocation是否禁用储位管理、bigBoxFastReceipt是否启用大箱一键收货、sapState/sapError。
    • 设计要点启用布尔字段控制功能开关与工厂存在隐式关联通过factoryId
  • 储位WmsBin

    • 关键字段warehouseId所属库存地点、no/name编码/名称、enable是否启用、remark、sapState/sapError。
    • 设计要点与WmsWarehouse构成一对多关系启用开关便于灵活控制。
  • 库存WmsInventory

    • 关键字段materialNo/factoryNo/warehouseNo复合定位、num数量、createBy/updateBy、createTime/updateTime。
    • 设计要点:以“物料+工厂+库存地点”为核心维度聚合库存;支持批次/序列号的组合定位由上层DTO负责拼接。
  • 存储WmsStorage

    • 关键字段materialNo/materialDesc、enable、remark、sapState/sapError、warehouseId/binId外键指向WmsWarehouse/WmsBin
    • 设计要点:用于物料在具体库位的存储映射;与库存维度互补。
  • 视图VStorage

    • 关键字段id、factoryId/factoryName、materialNo、warehouseNo。
    • 设计要点:简化查询维度,便于按工厂/物料/库存地点聚合展示。
  • 盘点任务WmsInventoryCheckTask

    • 关键字段taskNo、state0-未发布1-已发布2-进行中3-已完成、startTime/endTime、financeUserName、remark、createBy/updateBy、createTime/updateTime。
    • 设计要点任务生命周期管理与任务明细表WmsInventoryCheckTaskItem配合。
  • 盘点任务明细WmsInventoryCheckTaskItem

    • 关键字段taskId关联任务、warehouseId盘点库位、chargeUserName/chargeUserId盘点负责人
    • 设计要点:一个任务可覆盖多个库位,支持多人分工。
  • SRM订单WmsSrmOrder

    • 关键字段iuCode工厂、noteNum送货单号、purchaseGroup、waybillNum运单号、supplierNum/supplierName、ouCode公司、deliveryNoteDate、isCompleted是否完结
    • 设计要点对接SRM系统记录到货与收货状态。

章节来源

架构总览

WMS数据库层采用MyBatis-Plus框架结合分页与乐观锁插件统一通过SqlSessionFactory装配Mapper XML与TypeHandler。审计拦截器用于记录SQL执行信息当前处于注释状态保留扩展能力。上层通过DTO/VO进行数据传输仓储层实体承载业务语义与持久化映射。

graph TB
APP["业务服务/控制器"] --> DTO["DTO/VO<br/>InventoryInDTO/InventoryVO"]
DTO --> REPO["Repository层<br/>实体类/映射XML"]
REPO --> MP["MyBatis-Plus<br/>SqlSessionFactory"]
MP --> DB["数据库"]
MP --> PLG["插件<br/>分页/乐观锁"]
MP --> TH["TypeHandler<br/>UTC时间处理"]
MP --> AUD["审计拦截器<br/>AuditInnerInterceptor"]

图表来源

详细组件分析

实体类关系图

classDiagram
class WmsMaterial {
+Long id
+String no
+String describe
+Integer version
+BigDecimal weight
+Long supplierId
+Short sapState
+String sapError
}
class WmsWarehouse {
+Long id
+String no
+String name
+Long factoryId
+Boolean isDisableLocation
+Short sapState
+String sapError
}
class WmsBin {
+Long id
+Long warehouseId
+String no
+String name
+Boolean enable
+Short sapState
+String sapError
}
class WmsInventory {
+Long id
+String materialNo
+String factoryNo
+String warehouseNo
+BigDecimal num
+String createBy
+String updateBy
}
class WmsStorage {
+Long id
+String materialNo
+String materialDesc
+Long warehouseId
+Long binId
+Short sapState
+String sapError
}
class VStorage {
+Long id
+Long factoryId
+String factoryName
+String materialNo
+String warehouseNo
}
class WmsInventoryCheckTask {
+Long id
+String taskNo
+Integer state
+LocalDate startTime
+LocalDate endTime
+String financeUserName
}
class WmsInventoryCheckTaskItem {
+Long id
+Long taskId
+Long warehouseId
+String chargeUserName
+Long chargeUserId
}
class WmsSrmOrder {
+Long id
+String iuCode
+String noteNum
+String supplierNum
+String supplierName
+Boolean isCompleted
}
WmsBin --> WmsWarehouse : "属于"
WmsStorage --> WmsWarehouse : "属于"
WmsStorage --> WmsBin : "属于"
WmsInventoryCheckTaskItem --> WmsInventoryCheckTask : "属于"

图表来源

章节来源

数据访问层MyBatis-Plus实现

  • 配置要点
    • Mapper扫描路径com.nflg.wms.repository.mapper
    • Mapper XML位置classpath*:mapper/**/*.xml
    • 插件乐观锁、分页PostgreSQL类型
    • 类型处理器UTC时间类型转换
    • 驼峰映射开启、空值setter开启
  • 拦截器
    • 审计拦截器用于记录SQL执行信息当前为日志记录未启用完整审计日志写入保留扩展空间
sequenceDiagram
participant C as "调用方"
participant S as "Service层"
participant M as "Mapper接口"
participant MP as "MyBatis-Plus"
participant DB as "数据库"
C->>S : "提交业务请求"
S->>M : "调用Mapper方法"
M->>MP : "构建MappedStatement"
MP->>DB : "执行SQL"
DB-->>MP : "返回结果集"
MP-->>M : "映射为实体/DTO"
M-->>S : "返回结果"
S-->>C : "封装响应"

图表来源

章节来源

SQL优化策略

  • Mapper XML示例
    • 结构化包装查询WmsStructuralPackageMapper.search 使用函数对模型集合进行拼接展示,避免应用侧复杂拼接。
    • 模糊查询与条件过滤WmsInCostcenterBackTicketMapper通过ilike与动态条件组合实现高效检索。
  • 建议
    • 对高频查询字段建立合适索引如materialNo、warehouseNo、taskNo等
    • 控制SELECT字段范围避免使用SELECT *。
    • 利用分页插件限制结果集大小。
    • 对复杂条件使用绑定变量避免SQL注入并提升缓存命中率。

章节来源

数据迁移与版本管理

  • 版本管理
    • 通过实体类注释中的“@since 年份”标识版本演进如2025/2026便于追踪实体引入时间。
  • 升级策略
    • 新增字段添加NOT NULL需同时提供默认值或允许NULL并补充TypeHandler与Mapper适配。
    • 删除字段:先标记弃用,再在后续版本清理。
    • 字段变更:优先向后兼容,必要时提供迁移脚本与回滚方案。
  • 回滚机制
    • 建议在数据库层面保留历史快照与DDL审计日志确保可回滚至最近稳定版本。
    • 对关键业务表(如库存、盘点任务)执行变更前进行影子测试与数据校验。

章节来源

性能优化建议

  • 查询优化
    • 使用DTO/VO进行窄字段查询减少网络与序列化开销。
    • 对高频过滤字段建立复合索引,如(materialNo, factoryNo, warehouseNo)。
  • 索引设计
    • 唯一性对业务主键如物料no、库位no、任务号taskNo建立唯一索引。
    • 范围/排序对时间字段如createTime、deliveryNoteDate建立索引以支持排序与范围查询。
  • 缓存策略
    • Redis用于热点数据与序号缓存如单号序号启动时初始化降低数据库压力。
    • 对读多写少的配置类数据可采用本地缓存+分布式缓存双写策略。

章节来源

数据安全与备份恢复

  • 数据安全
    • 通过乐观锁插件防止并发覆盖写入。
    • 审计拦截器保留SQL执行轨迹便于问题追溯可扩展为完整审计日志表
  • 备份恢复
    • 建议采用增量+全量备份策略,定期验证恢复流程。
    • 对关键表库存、盘点任务、出入库单据制定RPO/RTO目标与演练计划。

章节来源

维护指南与监控方法

  • 维护指南
    • 定期检查索引使用情况与碎片率,重建或重组索引。
    • 监控慢查询日志识别并优化热点SQL。
    • 对新增字段与表结构变更进行回归测试。
  • 监控方法
    • 利用MyBatis日志与拦截器输出SQL执行信息。
    • 结合数据库性能视图(如索引使用统计、锁等待)进行容量与瓶颈评估。

章节来源

依赖分析

  • 组件耦合
    • 实体类之间通过外键语义关联WmsBin.WarehouseId → WmsWarehouse.IdWmsStorage.warehouseId/binId → WmsWarehouse/Bin
    • 仓储层通过Mapper XML与实体类解耦便于扩展与测试。
  • 外部依赖
    • MyBatis-Plus插件链乐观锁、分页。
    • Redisson用于分布式缓存与锁。
graph LR
BIN["WmsBin"] --> WH["WmsWarehouse"]
ST["WmsStorage"] --> WH
ST --> BIN
INV["WmsInventory"] -.-> ST
VO["VStorage"] -.-> WH

图表来源

章节来源

性能考虑

  • 查询路径优化
    • 使用InventoryInDTO/InventoryVO进行定向查询避免全表扫描。
    • 对批量入库/出库场景,采用批处理与事务合并提交。
  • 索引策略
    • 主键索引所有实体主键自增ID
    • 业务主键物料no、库位no、任务号taskNo等建立唯一索引。
    • 组合索引:(materialNo, factoryNo, warehouseNo)、(warehouseId, enable)等。
  • 缓存与异步
    • 对高频读取的配置与序号使用Redis缓存。
    • 异步处理耗时操作如报表导出、SAP同步

故障排查指南

  • SQL执行问题
    • 启用审计拦截器日志定位异常SQL与参数。
    • 检查Mapper XML条件拼接是否正确如ilike与动态标签
  • 并发写入冲突
    • 使用乐观锁插件,捕获并发冲突并提示重试。
  • 时间字段异常
    • 确认TypeHandler对LocalDateTime的UTC转换一致。

章节来源

结论

本设计文档基于仓库现有实体与配置给出了WMS核心业务实体的ER模型、表结构与字段设计、主外键关系、数据访问层实现、SQL优化策略、版本管理与迁移方案、性能优化建议、数据安全与备份恢复以及运维监控方法。建议在后续版本中完善审计日志落地、细化索引策略与缓存治理并持续进行性能与容量评估。

附录

  • 关键流程示意(入库)
flowchart TD
Start(["开始"]) --> BuildDTO["组装InventoryInDTO"]
BuildDTO --> Mapper["调用Mapper执行入库"]
Mapper --> Inventory["更新WmsInventory"]
Inventory --> Storage["更新WmsStorage"]
Storage --> End(["结束"])

图表来源