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 混合架构:各取所长的最佳实践
实际批次谱系系统通常采用“三库协同”架构,通过数据同步中间件保持一致性。
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进行垂直拆分。避免过早引入多数据库带来的运维复杂度。