4. 数据存储选型

批次谱系查询涉及多维度数据:结构化批次记录、复杂上下游依赖关系、以及随时间变化的生产参数。单一数据库无法高效满足所有场景,需根据查询特征选择最合适的存储引擎。本节从数据模型、查询模式、扩展性三个维度对比三类主流数据库。

4.1 三类数据库核心差异

维度 关系型数据库 (MySQL/PostgreSQL) 图数据库 (Neo4j) 时序数据库 (InfluxDB)
数据模型 二维表,严格Schema,外键关联 节点+边,属性图模型 时间戳+标签+字段,无固定Schema
核心查询 JOIN、聚合、范围扫描 深度遍历、路径匹配、模式匹配 时间窗口聚合、降采样、差值计算
批次谱系场景 批次主数据、物料清单、质量记录 上下游追溯链路、影响分析、闭环检测 温度/压力/湿度等连续传感器数据
扩展方式 读写分离、分库分表、分布式中间件 集群扩展、分片、缓存层 数据分片、保留策略、连续查询
一致性 强ACID,事务支持完善 最终一致性,支持轻量级事务 最终一致性,写入优先
选型原则: 关系型数据库作为“事实中心”存储批次主数据与质量记录;图数据库负责“关系引擎”处理多跳追溯;时序数据库承担“监控侧翼”保存高频工艺参数。三者通过批次ID和时间戳关联,形成互补架构。

4.2 关系型数据库:批次主数据的基石

MySQL和PostgreSQL是批次谱系系统中最成熟的选择,适合存储结构化、强一致性要求的核心数据。

  • 适用数据: 批次主表(batch_id, product_code, quantity, status)、物料清单(BOM)、质检结果、生产订单。
  • 查询优势: 支持复杂聚合(SUM/AVG/COUNT)、范围查询(生产日期区间)、多表关联(批次→物料→供应商)。
  • 谱系查询瓶颈: 当追溯深度超过3层时,递归CTE或多次JOIN性能急剧下降。例如查询“某批次所有上游原料批次”需递归5~8层,MySQL递归CTE在百万级数据量下延迟可达秒级。
-- PostgreSQL 递归CTE示例:向上追溯3层
WITH RECURSIVE upstream AS (
  SELECT batch_id, parent_batch_id, 1 AS depth
  FROM batch_relations
  WHERE batch_id = 'BATCH-2024-001'
  UNION ALL
  SELECT br.batch_id, br.parent_batch_id, u.depth + 1
  FROM batch_relations br
  INNER JOIN upstream u ON br.batch_id = u.parent_batch_id
  WHERE u.depth < 3
)
SELECT * FROM upstream;
优化建议: 对批次关系表建立(batch_id, parent_batch_id)复合索引;使用物化路径或嵌套集模型替代递归CTE,可将多跳查询性能提升5~10倍。

4.3 图数据库:多跳追溯的原生引擎

Neo4j以节点和边直接表达批次间的依赖关系,深度遍历性能不随跳数增加而衰减,是谱系查询的理想选择。

  • 数据建模: 批次节点(Batch)包含属性(batch_id, product, timestamp);关系边(USES/PRODUCED_FROM)携带数量、批次属性。
  • 查询优势: Cypher语言原生支持变长路径匹配,如 MATCH (b:Batch {id:'B001'})-[*1..5]-(related) 一次查询所有上下游节点。
  • 典型场景: 全链路影响分析(某原料批次异常影响哪些成品批次)、闭环检测(批次是否存在循环引用)、最短路径追溯。
// Neo4j Cypher:查询批次B001的所有上游原料(不限深度)
MATCH (b:Batch {batch_id: 'B001'})
MATCH path = (b)<-[:PRODUCED_FROM*]-(upstream:Batch)
RETURN upstream.batch_id, length(path) AS depth
ORDER BY depth;
注意事项: 图数据库不擅长宽表聚合和范围扫描。批次主数据的统计报表(如“本月批次合格率”)仍需由关系型数据库承担。建议采用“关系型+图数据库”双写模式,保持数据一致性。

4.4 时序数据库:工艺参数的连续记录

InfluxDB专为时间戳驱动的数据流设计,适合存储批次生产过程中的传感器数据、环境参数、设备状态。

  • 数据特征: 每个批次对应多个时间序列(温度、压力、转速),采样频率从秒级到分钟级,数据量可达TB级。
  • 查询优势: 时间窗口聚合(MEAN()、MAX())、降采样(自动聚合历史数据)、差值计算(计算批次内温度变化率)。
  • 谱系关联: 通过标签(tags)将时序数据与批次ID绑定,如 batch_id=B001, sensor=temperature,实现“批次→工艺参数”的快速检索。
-- InfluxDB Flux查询:获取批次B001在特定时间段的平均温度
from(bucket: "production")
  |> range(start: 2024-01-01T08:00:00Z, stop: 2024-01-01T10:00:00Z)
  |> filter(fn: (r) => r._measurement == "sensor_data" and r.batch_id == "B001" and r.sensor == "temperature")
  |> aggregateWindow(every: 5m, fn: mean)
  |> yield(name: "mean_temp")
存储策略: 时序数据设置保留策略(如原始数据保留30天,降采样数据保留1年),避免存储膨胀。批次ID作为标签而非字段,可大幅提升过滤性能。

4.5 混合架构:各取所长的最佳实践

实际批次谱系系统通常采用“三库协同”架构,通过数据同步中间件保持一致性。

批次谱系系统混合存储架构 批次谱系应用层 数据同步中间件 (CDC/消息队列) 关系型数据库 MySQL / PostgreSQL 批次主数据 · 质量记录 图数据库 Neo4j 追溯链路 · 影响分析 时序数据库 InfluxDB 工艺参数 · 传感器数据 架构要点: 1. 关系型数据库作为“事实中心”,存储批次主数据与质量记录 2. 图数据库作为“关系引擎”,处理多跳追溯与影响分析 3. 时序数据库作为“监控侧翼”,保存高频工艺参数 4. 数据同步中间件通过CDC或消息队列保持三库最终一致性

4.6 选型决策矩阵

根据批次谱系系统的具体查询特征,可按以下矩阵快速决策:

查询场景 推荐数据库 原因 不推荐
批次主数据CRUD + 统计报表 PostgreSQL 强事务、丰富聚合函数、窗口函数 Neo4j(聚合性能差)
5层以上上下游追溯 Neo4j 变长路径遍历性能恒定 MySQL(递归CTE深度受限)
批次内温度/压力趋势分析 InfluxDB 时间窗口聚合、降采样原生支持 PostgreSQL(时序数据膨胀快)
全链路影响分析(广度优先) Neo4j 图遍历算法(BFS/DFS)内置 InfluxDB(无关系模型)
批次合格率按产品/产线聚合 MySQL/PostgreSQL GROUP BY + 条件聚合高效 Neo4j(需额外聚合计算)
实践建议: 初期可先用PostgreSQL承载所有数据(利用JSONB存储关系、timescaledb扩展处理时序),当追溯深度超过5层或数据量突破千万级时,再引入Neo4j和InfluxDB进行垂直拆分。避免过早引入多数据库带来的运维复杂度。