3. 数据模型设计

批号追溯的数据模型是整个接口开发的基础。ERP 与 MES 在批号管理上各有侧重:ERP 关注物料账务与库存批次,MES 关注生产流转与质量追溯。本章设计的四张核心表——批号主表(BatchMaster)、批次明细表(BatchDetail)、物料表(Material)、工序表(Operation)——构成了跨系统追溯的数据骨架。

3.1 四表关系总览

批号主表是追溯的入口,记录每个批次的全局信息;批次明细表记录该批次经过的每一道工序的详细执行数据;物料表提供物料编码、规格、单位等静态属性;工序表定义生产过程中的标准作业步骤。四表通过外键关联,形成从“批次 → 工序 → 物料”的完整追溯链。

设计原则:主表与明细表采用 1:N 关系,物料表与工序表作为基础数据字典,被主表和明细表引用。所有表均使用自增主键 + 业务主键(BatchNo、MaterialCode、OperationCode)的双重标识策略。
批号追溯核心表 ER 关系图 批号追溯核心表 ER 关系图 批号主表 BatchMaster PK BatchID (自增) UK BatchNo (批号) FK MaterialID (物料) Quantity, Status, Date 批次明细表 BatchDetail PK DetailID (自增) FK BatchID (主表) FK OperationID (工序) StartTime, EndTime InputQty, OutputQty Status, Operator 物料表 Material PK MaterialID (自增) UK MaterialCode (物料编码) Name, Spec, Unit 工序表 Operation PK OperationID (自增) UK OperationCode (工序编码) Name, Description 1 N N 1 N 1 图例说明: PK = 主键 (Primary Key) | UK = 唯一键 (Unique Key) | FK = 外键 (Foreign Key) 1:N 关系:一个批号主表记录对应多条批次明细记录 N:1 关系:多个批次可引用同一物料/工序基础数据

3.2 批号主表(BatchMaster)字段设计

批号主表是追溯的根节点,每个批次在此表中生成一条记录。ERP 系统在物料入库或生产订单下达时创建批号,MES 系统在生产投料或完工时补充生产数据。

字段名 数据类型 约束 说明
BatchID INT PK, 自增 物理主键,无业务含义
BatchNo VARCHAR(50) UK, NOT NULL 业务批号,ERP/MES 共用,格式如 BATCH20250301-001
MaterialID INT FK → Material 物料主键,关联物料表
Quantity DECIMAL(18,3) NOT NULL 批次数量,单位来自物料表
BatchStatus TINYINT NOT NULL, DEFAULT 0 0=待生产, 1=生产中, 2=已完成, 3=已冻结, 4=已报废
ProductionDate DATE NULL 生产日期
ExpiryDate DATE NULL 有效期/保质期
SourceType TINYINT NOT NULL 来源类型:1=ERP创建, 2=MES创建, 3=手工录入
CreatedAt DATETIME NOT NULL 创建时间
UpdatedAt DATETIME NOT NULL 最后更新时间
设计要点:BatchNo 作为业务唯一键,建议采用“前缀 + 日期 + 流水号”的编码规则,便于人工识别和跨系统匹配。SourceType 字段用于区分批号的创建来源,在接口同步时可根据此字段决定数据流向。

3.3 批次明细表(BatchDetail)字段设计

批次明细表记录批次在每一道工序上的执行情况。MES 系统在工序完工时写入明细记录,ERP 系统通过接口读取这些明细实现生产追溯。

字段名 数据类型 约束 说明
DetailID INT PK, 自增 物理主键
BatchID INT FK → BatchMaster 关联批号主表
OperationID INT FK → Operation 关联工序表
SequenceNo INT NOT NULL 工序顺序号,用于排序
StartTime DATETIME NULL 工序开始时间
EndTime DATETIME NULL 工序结束时间
InputQty DECIMAL(18,3) NOT NULL 投入数量
OutputQty DECIMAL(18,3) NOT NULL 产出数量
ScrapQty DECIMAL(18,3) DEFAULT 0 报废数量
DetailStatus TINYINT NOT NULL 0=待执行, 1=执行中, 2=已完成, 3=已跳过
Operator VARCHAR(50) NULL 操作人
Remark VARCHAR(500) NULL 备注/异常说明
常见误区:不要将工序执行数据直接放在批号主表中。一个批次可能经过 5~20 道工序,每道工序的起止时间、投入产出都不同,必须使用明细表存储。SequenceNo 字段用于保证工序顺序,避免依赖插入顺序。

3.4 物料表(Material)与工序表(Operation)

物料表和工序表是基础数据字典,在 ERP 和 MES 中通常已经存在。接口设计时,建议只引用其主键或编码,避免在批号表中冗余存储物料名称、规格等静态信息。

表名 核心字段 数据来源 同步策略
Material MaterialID, MaterialCode, Name, Spec, Unit, Type ERP 物料主数据 每日增量同步,MES 只读
Operation OperationID, OperationCode, Name, Description, DeptID ERP 工艺路线 / MES 工序定义 变更时实时推送

3.5 表间关联与索引设计

合理的索引设计直接影响接口查询性能。批号追溯最常见的查询场景是:根据批号查明细、根据物料查批次、根据时间段查生产记录。

-- 批号主表索引
CREATE INDEX IDX_BatchMaster_BatchNo ON BatchMaster(BatchNo);
CREATE INDEX IDX_BatchMaster_MaterialID ON BatchMaster(MaterialID);
CREATE INDEX IDX_BatchMaster_ProductionDate ON BatchMaster(ProductionDate);

-- 批次明细表索引
CREATE INDEX IDX_BatchDetail_BatchID ON BatchDetail(BatchID);
CREATE INDEX IDX_BatchDetail_OperationID ON BatchDetail(OperationID);
CREATE INDEX IDX_BatchDetail_StartTime ON BatchDetail(StartTime);

-- 物料表索引
CREATE INDEX IDX_Material_Code ON Material(MaterialCode);

-- 工序表索引
CREATE INDEX IDX_Operation_Code ON Operation(OperationCode);
性能建议:BatchNo 和 MaterialCode 作为业务查询入口,必须建立唯一索引或普通索引。BatchDetail 的 BatchID 外键索引是避免 N+1 查询的关键。如果批次明细数据量超过 100 万行,建议对 StartTime 建立复合索引(BatchID + StartTime)。
批号追溯查询路径与索引覆盖图 批号追溯查询路径与索引覆盖图 查询入口 BatchNo / MaterialCode 批号主表 索引: BatchNo, MaterialID 批次明细表 索引: BatchID, StartTime 物料表 索引: MaterialCode 工序表 索引: OperationCode ① ② ③ ④ 查询路径说明: ① 通过 BatchNo 或 MaterialCode 索引快速定位批号主表记录 ② 通过 BatchID 外键索引关联批次明细表,获取工序执行数据 ③④ 通过 MaterialID / OperationID 关联字典表,获取物料名称、工序描述等展示信息

3.6 数据模型设计检查清单

在进入接口开发前,请对照以下清单确认数据模型是否满足追溯需求:

  • 唯一性:BatchNo 和 MaterialCode 是否已建立唯一索引?
  • 完整性:批号主表与明细表的外键关系是否强制约束?
  • 可追溯性:能否通过 BatchNo 在 3 次 JOIN 内查到物料名称、工序名称、操作人、时间?
  • 扩展性:明细表是否预留了 Remark 字段用于记录异常信息?
  • 兼容性:SourceType 字段是否覆盖了 ERP 创建、MES 创建、手工录入三种场景?
  • 性能:StartTime 和 BatchID 是否建立了复合索引以支持时间段查询?
实战建议:在开发环境中先创建这四张表,插入 3~5 条测试数据,手动执行 SELECT 语句验证关联查询是否顺畅。这一步能提前发现字段类型不匹配、索引缺失等问题,避免在接口联调时返工。