4. 追溯数据模型设计:数据实体定义与关系建模

数据模型这东西,说白了就是追溯系统的骨架。骨架搭歪了,后面填再多的肉也长不成人样。我见过太多项目,一上来就急着写代码,结果做到一半发现物料编码对不上、批次号串了、工序跳转丢了上下文……最后只能推倒重来。

嗯,咱们今天就把这块掰开揉碎了讲清楚。

4.1 核心数据实体定义

追溯系统要管哪些东西?我个人习惯先画一个实体清单。你想想看,一条产品从原材料到成品出厂,中间经历了什么?物料、工单、批次、工序、设备、人员——这六个实体,一个都不能少。

实体名称 英文标识 核心属性(必选) 说明
物料 Material 物料编码、物料名称、规格型号、物料类型 原材料、半成品、成品都算物料
工单 WorkOrder 工单号、产品编码、计划数量、计划开始/结束时间 生产指令的载体
批次 Lot/Batch 批次号、物料编码、数量、生产日期、状态 追溯的最小管理单元
工序 Operation 工序编码、工序名称、工序类型、所属工段 工艺路线的基本节点
设备 Equipment 设备编码、设备名称、设备型号、所在产线 执行工序的物理资源
人员 Operator 工号、姓名、岗位、所属班组 操作执行者

关键原则:每个实体必须有一个全局唯一的业务主键。物料用物料编码,工单用工单号,批次用批次号。别用数据库自增ID做追溯主键,业务人员不认那个。

4.2 数据关系建模

实体定义好了,接下来就是连线。我在项目中遇到过最典型的错误——把关系搞成网状,查一条追溯链路要join十几张表,性能直接崩掉。

正确的做法是:以批次为核心,建立星型或链式关系。

追溯数据核心关系模型 批次 (Lot) 物料 (Material) 工单 (WorkOrder) 工序 (Operation) 设备 (Equipment) 人员 (Operator) 质量数据 属于 关联 经过 使用 执行 产生 加工 指派 模型要点: 1. 批次是追溯的核心锚点,所有其他实体都围绕批次展开 2. 工序与设备、人员、质量数据之间是多对多的关系 3. 物料与批次是1:N关系,一个物料编码可以对应多个批次

关系建模避坑指南:我曾经在一个项目里把设备和工序做成了一对一关系,结果后来产线改造,一台设备要同时跑两道工序,整个数据模型都得改。记住:工序和设备是多对多,中间加一张关联表,别偷懒。

4.3 数据字典规范

数据字典是团队的共同语言。没有规范的数据字典,开发说字段A,业务说字段B,最后对不上账。我建议每个字段都要包含以下信息:

字段名 数据类型 长度 是否必填 默认值 业务含义
lot_id varchar 32 是 无 批次号,全局唯一
material_code varchar 20 是 无 物料编码,取自ERP
quantity decimal 18,3 是 0 批次数量,单位与物料主数据一致
prod_date date - 是 当前日期 生产日期
status varchar 10 是 'created' 批次状态:created/in_progress/completed/blocked

特别注意:状态字段不要用数字枚举(0/1/2),业务人员看不懂。直接用有业务含义的字符串,比如'created'、'completed'。虽然多占几个字节,但可读性提升十倍。

4.4 关键数据实体设计示例

光说不练假把式。我拿一个实际的批次表设计来举例:

-- 批次主表
CREATE TABLE lot (
    lot_id          VARCHAR(32)     NOT NULL COMMENT '批次号',
    material_code   VARCHAR(20)     NOT NULL COMMENT '物料编码',
    work_order_id   VARCHAR(30)     NOT NULL COMMENT '工单号',
    quantity        DECIMAL(18,3)   NOT NULL DEFAULT 0 COMMENT '数量',
    unit            VARCHAR(10)     NOT NULL COMMENT '单位',
    prod_date       DATE            NOT NULL COMMENT '生产日期',
    status          VARCHAR(10)     NOT NULL DEFAULT 'created' COMMENT '状态',
    created_by      VARCHAR(20)     NOT NULL COMMENT '创建人',
    created_at      DATETIME        NOT NULL DEFAULT CURRENT_TIMESTAMP,
    updated_at      DATETIME        NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    PRIMARY KEY (lot_id),
    INDEX idx_material (material_code),
    INDEX idx_work_order (work_order_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='批次主表';

我的习惯:每个表都加上 created_at 和 updated_at 时间戳,别问为什么。等你需要排查数据问题的时候,这两个字段能救你的命。

4.5 数据模型落地检查清单

模型设计完了,别急着往下走。拿这个清单过一遍:

  1. 唯一性检查:每个实体的业务主键是否全局唯一?
  2. 关系完整性:批次能不能追溯到上游物料批次?能不能追溯到下游成品批次?
  3. 时间维度:每个操作是否有时间戳?能不能还原出“谁在什么时间用哪台设备做了哪道工序”?
  4. 状态机:每个实体的状态流转是否完整?有没有遗漏的状态?
  5. 扩展性:如果未来要增加一个新属性,需要改几张表?

嗯,数据模型这块就讲到这里。记住一句话:模型设计花的时间,会在后面开发、测试、运维阶段十倍地还给你。别赶工期,把基础打牢。