3. 关联关系建模基础
在物料产品工艺主数据关联工程中,真正决定系统能否稳定运行的,不是单个字段填得多完整,而是实体之间用什么键关联、按什么方向映射、在什么层级上对齐。本节围绕实体关系图(ER图)、BOM结构、工艺路线与产品结构的映射逻辑,以及关联键设计原则展开,目标是让读者能够独立判断一条关联关系是否成立、是否可维护。
一、实体关系图:先定义“谁和谁有关系”
主数据关联建模的第一步,是把业务对象抽象为实体,并明确实体之间的基数关系。在制造主数据语境下,核心实体通常包括:物料(Material)、BOM(Bill of Materials)、BOM行项(BOM Item)、工艺路线(Routing)、工序(Operation)、产品结构节点(Product Structure Node)、工厂/组织(Plant/Org)等。
实体关系图的价值在于:它不描述“怎么用”,而是描述“结构上允许什么”。例如:
- 一个物料在特定工厂下可以有多个有效版本的BOM,因此物料与BOM是一对多;
- 一个BOM由多条BOM行项组成,BOM与BOM行项是一对多,且行项必须依附于BOM存在(组合关系);
- 一条工艺路线包含多道工序,路线与工序是一对多;
- BOM行项与工序之间并非天然一一对应,而是通过“组件—消耗点”关系建立多对多映射。
这些基数关系一旦确定,后续所有关联键的设计都必须服从它。若把本应一对多的关系强行压成一对一,就会在版本切换或工艺变更时产生数据覆盖。
二、BOM结构:层级、版本与有效性
BOM不是一张平表,而是一棵有向树。根节点是父物料,子节点是组件物料,每条边代表“用量关系”。建模时必须同时表达三个维度:
- 层级维度:父项、子项、层级号、路径,用于展开多级BOM;
- 版本维度:BOM版本号、生效日期、失效日期,用于区分工程BOM、制造BOM;
- 有效性维度:工厂、用途、替代组、有效期,用于限定“在哪个组织、哪个时间段内有效”。
一个常见的错误是只用“父物料+子物料”作为唯一键。这样无法区分同一父子物料在不同版本、不同工厂下的两条不同用量记录。正确的做法是把父物料、子物料、BOM版本、工厂、有效期起组合为业务唯一键。
三、工艺路线与产品结构的映射逻辑
工艺路线描述“怎么做”,产品结构描述“由什么组成”。两者必须建立映射,否则计划、成本、执行三条链路会断裂。映射的核心是把BOM行项挂到工序的消耗点上。
典型映射规则如下:
- 每道工序有唯一的工序号与工作中心;
- 每个BOM行项必须指定一个“消耗工序”,表示该组件在哪道工序被投入;
- 同一组件若在多道工序分批投入,应拆成多条行项,分别绑定不同工序;
- 虚拟件、替代料、联产品需要单独标记映射类型,不能与普通组件混用同一规则。
映射完成后,系统才能回答:某道工序需要哪些组件、某组件在哪道工序被消耗、某产品的完整工艺路径是什么。
四、关联键设计原则
关联键是主数据关联的“接缝”。接缝设计得好,数据可追溯、可版本化、可扩展;设计得差,后期只能靠人工补录。以下五条原则可直接用于评审:
- 业务唯一性优先于技术唯一性。 代理键(自增ID)只用于数据库内部,对外关联必须使用业务键组合,如“物料号+工厂+BOM版本”。
- 键必须包含版本与有效期。 任何与时间相关的关联,都要把生效日期纳入键,否则历史版本会被覆盖。
- 键的方向必须与业务方向一致。 BOM行项指向工序,而不是工序指向行项;方向反了会导致一对多关系被错误压缩。
- 键的粒度要与映射粒度匹配。 若组件按工序分批投入,键的粒度必须到“行项+工序”,不能只到“父物料+子物料”。
- 键要可扩展、可空值受控。 预留替代组、映射类型等字段,但空值必须有明确语义,不能既表示“不适用”又表示“未维护”。
示例:一条完整的关联记录
父物料: P-1000
BOM版本: V2.0
工厂: CN01
行项号: 0020
子物料: M-201
用量: 1 EA
消耗工序: OP20
映射类型: 普通组件
有效期起: 2024-01-01
有效期止: 9999-12-31
这条记录同时回答了“用什么、用多少、在哪道工序用、什么时候有效”四个问题,是BOM与工艺路线映射的最小完整单元。
五、建模检查要点
完成关联建模后,建议按以下顺序做一次结构检查:先确认实体关系图的基数是否与业务规则一致;再检查BOM版本与有效期是否进入唯一键;然后验证每个BOM行项是否都绑定了消耗工序;最后抽查一条完整记录,看能否从产品追溯到组件、从组件追溯到工序、从工序追溯到工作中心。若这四步都能走通,关联模型基本可用。
关联键设计不是一次性工作。当工艺变更、工厂扩展或替代料策略调整时,键结构可能需要同步演进。建议在模型初期就保留“映射类型”和“替代组”两个扩展位,避免后期改表。