4. 设备效率数据模型设计
多工厂对标分析最容易失败的地方,不是指标算不出来,而是各工厂的“设备、产线、工厂、班次、产品”口径不一致:A厂把换型时间算进停机,B厂算进计划损失;A厂按自然班统计,B厂按生产班统计;同一台设备在MES里叫“CNC-01”,在报表里叫“加工中心1号”。因此,数据模型设计的目标不是先建一张大宽表,而是先建立一套可对齐、可追溯、可扩展的星型模型,让OEE及其损失项在统一语义下计算。
一、事实表:把OEE拆成可加与不可加两类度量
面向多工厂对标的事实表,建议以“设备-班次-产品”为最细粒度,命名为 fact_equipment_shift_oee。它记录的是某台设备在某班次生产某产品时的效率事件。核心字段包括:
- 维度外键:
factory_key、line_key、equipment_key、shift_key、product_key、date_key; - 可加度量:
planned_time_min、run_time_min、down_time_min、setup_time_min、good_count、scrap_count、ideal_cycle_time_sec; - 不可加度量:
availability_rate、performance_rate、quality_rate、oee_rate。
这里的关键设计是:比率类指标不落库为可加字段,而由可加度量在查询时计算。例如某工厂某班次:计划时间480 min,停机45 min,换型30 min,实际运行405 min,理论节拍12 s,实际产出1820件,其中不良36件。则:
可用率 = (480 - 45 - 30) / 480 = 84.38%
性能率 = (1820 × 12 / 60) / 405 = 89.88%
合格率 = (1820 - 36) / 1820 = 98.02%
OEE = 84.38% × 89.88% × 98.02% ≈ 74.34%
如果直接存储74.34%,跨工厂汇总时会出现“比率平均”的错误;而保留分钟数和件数,就能按任意维度重新聚合。
二、维度表与层级关系:从集团到设备
维度表要解决“同一对象在不同系统中的编码统一”。建议建立五张主维度:dim_factory、dim_line、dim_equipment、dim_shift、dim_product。其中工厂-产线-设备构成三层层级,产线可跨工厂复用编码规则,但必须带工厂前缀。例如统一编码:
| 层级 | 编码规则 | 示例 |
|---|---|---|
| 工厂 | F + 两位序号 | F01、F02 |
| 产线 | 工厂码 + L + 两位序号 | F01-L03 |
| 设备 | 产线码 + E + 三位序号 | F01-L03-E007 |
| 班次 | 工厂码 + S + 班次号 | F01-S1(白班) |
| 产品 | P + 物料族 + 四位序号 | P-CNC-1024 |
层级关系必须显式写入维度表,而不是靠字符串截取。例如 dim_equipment 中保留 line_key 和 factory_key,这样即使设备调拨到新产线,也能通过缓慢变化维(SCD Type 2)保留历史归属,避免“设备现在属于哪条线”覆盖“当时属于哪条线”。
三、时间模型:计划时间、运行时间与班次边界
时间模型是OEE计算的地基。多工厂对标时,必须先定义“计划时间”的边界:是设备可用时间,还是排产时间?建议统一采用“计划生产时间 = 班次时长 − 计划停机(用餐、交接、保养)”,并明确换型时间属于计划损失还是停机损失。若A厂把换型算作停机,B厂算作计划损失,可用率会系统性偏差。因此,事实表中应把 setup_time_min 单独列出,而不是混入 down_time_min,这样对标时可按需重分类。
班次维度要支持跨零点。例如夜班22:00至次日06:00,应归属到开始日期,而不是自然日。否则同一班次会被拆到两天,导致设备效率日汇总失真。建议在 dim_shift 中记录 shift_start_time、shift_end_time、cross_midnight_flag,并在ETL中按“班次开始时间”落日期键。
四、主数据编码统一:从映射表到黄金记录
统一编码不是把各工厂编码改掉,而是建立“源编码→黄金编码”的映射。建议增加一张 map_equipment_code 表,字段包括:source_system、source_code、golden_equipment_key、effective_from、effective_to。例如MES中的“CNC-01”和报表中的“加工中心1号”都映射到 F01-L03-E007。当设备调拨时,通过 effective_from/to 保留历史归属,避免历史数据被新产线“污染”。
factory_key 是否与维度表当前归属一致;同一班次的计划时间是否等于班次时长减去计划停机;同一产品的理论节拍是否在各工厂间可比。这三项检查通过后,OEE差异才具备分析意义。五、可落地的建表示例
以下给出事实表与设备维度的核心DDL片段,可直接作为建模起点:
CREATE TABLE fact_equipment_shift_oee (
date_key INT NOT NULL,
factory_key INT NOT NULL,
line_key INT NOT NULL,
equipment_key INT NOT NULL,
shift_key INT NOT NULL,
product_key INT NOT NULL,
planned_time_min DECIMAL(10,2),
run_time_min DECIMAL(10,2),
down_time_min DECIMAL(10,2),
setup_time_min DECIMAL(10,2),
good_count INT,
scrap_count INT,
ideal_cycle_time_sec DECIMAL(10,3),
PRIMARY KEY (date_key, equipment_key, shift_key, product_key)
);
CREATE TABLE dim_equipment (
equipment_key INT PRIMARY KEY,
golden_code VARCHAR(32) UNIQUE,
equipment_name VARCHAR(64),
line_key INT,
factory_key INT,
equipment_type VARCHAR(32),
effective_from DATE,
effective_to DATE,
is_current TINYINT
);
这样设计后,多工厂对标查询可以写成:按 factory_key 分组,用 SUM(run_time_min)/SUM(planned_time_min - setup_time_min) 计算可用率,用 SUM(good_count*ideal_cycle_time_sec/60)/SUM(run_time_min) 计算性能率,再相乘得到OEE。所有工厂在同一套语义下计算,差异才来自真实效率,而不是口径。