4. 追溯数据模型设计:数据实体定义与关系建模
数据模型这东西,说白了就是追溯系统的骨架。骨架搭歪了,后面填再多的肉也长不成人样。我见过太多项目,一上来就急着写代码,结果做到一半发现物料编码对不上、批次号串了、工序跳转丢了上下文……最后只能推倒重来。
嗯,咱们今天就把这块掰开揉碎了讲清楚。
4.1 核心数据实体定义
追溯系统要管哪些东西?我个人习惯先画一个实体清单。你想想看,一条产品从原材料到成品出厂,中间经历了什么?物料、工单、批次、工序、设备、人员——这六个实体,一个都不能少。
| 实体名称 | 英文标识 | 核心属性(必选) | 说明 |
|---|---|---|---|
| 物料 | Material | 物料编码、物料名称、规格型号、物料类型 | 原材料、半成品、成品都算物料 |
| 工单 | WorkOrder | 工单号、产品编码、计划数量、计划开始/结束时间 | 生产指令的载体 |
| 批次 | Lot/Batch | 批次号、物料编码、数量、生产日期、状态 | 追溯的最小管理单元 |
| 工序 | Operation | 工序编码、工序名称、工序类型、所属工段 | 工艺路线的基本节点 |
| 设备 | Equipment | 设备编码、设备名称、设备型号、所在产线 | 执行工序的物理资源 |
| 人员 | Operator | 工号、姓名、岗位、所属班组 | 操作执行者 |
关键原则:每个实体必须有一个全局唯一的业务主键。物料用物料编码,工单用工单号,批次用批次号。别用数据库自增ID做追溯主键,业务人员不认那个。
4.2 数据关系建模
实体定义好了,接下来就是连线。我在项目中遇到过最典型的错误——把关系搞成网状,查一条追溯链路要join十几张表,性能直接崩掉。
正确的做法是:以批次为核心,建立星型或链式关系。
关系建模避坑指南:我曾经在一个项目里把设备和工序做成了一对一关系,结果后来产线改造,一台设备要同时跑两道工序,整个数据模型都得改。记住:工序和设备是多对多,中间加一张关联表,别偷懒。
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 数据模型落地检查清单
模型设计完了,别急着往下走。拿这个清单过一遍:
- 唯一性检查:每个实体的业务主键是否全局唯一?
- 关系完整性:批次能不能追溯到上游物料批次?能不能追溯到下游成品批次?
- 时间维度:每个操作是否有时间戳?能不能还原出“谁在什么时间用哪台设备做了哪道工序”?
- 状态机:每个实体的状态流转是否完整?有没有遗漏的状态?
- 扩展性:如果未来要增加一个新属性,需要改几张表?
嗯,数据模型这块就讲到这里。记住一句话:模型设计花的时间,会在后面开发、测试、运维阶段十倍地还给你。别赶工期,把基础打牢。