工业软件2025/12/1527 分钟阅读

做上位机时该选哪个数据库?SQLite3 / MySQL / PostgreSQL / MongoDB 深度对比

工业上位机软件在数据存储层面面临高频写入、时序查询、离线自治、运维轻量等独特挑战。本文从上位机开发的实际视角,系统梳理 SQLite3、MySQL、PostgreSQL、MongoDB 四种主流数据库的核心差异、优缺点与适用边界,并提供可落地的选型决策树和实战组合方案,帮助工控软件开发者快速做出合理选择。

做上位机时该选哪个数据库?SQLite3 / MySQL / PostgreSQL / MongoDB 深度对比

工业上位机软件在数据存储层面面临着独特的挑战:既要应对高频采集的实时数据,又要保证历史记录的可靠持久化,还要兼顾现场部署的运维成本。当你打开数据库选型清单,SQLite3、MySQL、PostgreSQL、MongoDB 是出现频率最高的四个名字——但每一个都有截然不同的适用场景。本文从上位机开发的实际视角出发,系统梳理四者的核心差异,并给出可落地的选型建议。


上位机数据存储的典型需求

在正式比较之前,先明确上位机系统对数据库的典型诉求:

高频写入:PLC 或传感器数据采集周期通常在 100ms ~ 1s 级别,单节点日写入量可达百万条以上。 时序查询:最常见的查询是"最近 N 条"或"时间范围聚合",而非复杂关联查询。 离线可用:工厂内网或单机部署场景下,数据库必须本地自治,无需依赖外部服务。 数据结构多样:既有规整的模拟量/数字量,也可能有 JSON 格式的报警记录、配方参数、设备档案。 * 运维轻量:现场工程师不是 DBA,部署、备份、迁移必须尽量简单。

带着这些约束,我们来逐一审视四个数据库。


SQLite3

核心定位

SQLite3 是一个嵌入式关系型数据库,整个引擎就是一个 .dll / .so 库文件,数据以单文件形式存储在磁盘上。它没有独立的服务进程,应用直接通过库调用读写数据库文件。

优点

维度说明
零部署无需安装服务端,随应用一同分发,是真正意义上的"嵌入式"
文件即数据库备份 = 复制文件,迁移 = 移动文件,极度运维友好
事务 ACID完整支持 ACID,单写入线程下数据一致性有保障
内存占用低进程内运行,资源开销极小,适合工控机、ARM 边缘设备
开发速度快Python sqlite3标准库即可使用,C/C++ 有官方 API

缺点

维度说明
并发写入弱写操作持有数据库级文件锁,高并发写入会产生严重争用
无网络访问无法跨进程/跨机器共享,多客户端架构不适用
大数据量性能下降单文件超过数 GB 后查询性能明显退化,缺乏分区能力
类型系统宽松动态类型可能引入隐式类型转换问题

适用场景

flowchart LR A[单机上位机\n本地存储] --> B{数据量 < 5GB\n且单写进程} B -- 是 --> C[✅ SQLite3\n首选] B -- 否 --> D[考虑其他方案]

最适合:

单机 SCADA、HMI 软件的本地历史数据存储 配方管理、设备参数配置文件 离线缓存队列(数据采集后批量上传云端前的本地缓冲) 工控平板、工控机等资源受限设备


MySQL

核心定位

MySQL 是最广泛使用的开源关系型数据库,采用 C/S 架构,需要独立的服务进程。长期被 LAMP 栈统治 Web 领域,在国内工业软件中也有大量存量应用。

优点

维度说明
生态成熟文档、驱动、ORM、运维工具极为丰富
多客户端并发支持高并发读写,适合多台 HMI 共用一个数据库服务
读性能优秀InnoDB 引擎在读密集场景下性能出色
运维工具完善Navicat、DBeaver、MySQL Workbench 均支持
复制 & 主从支持主从复制,可实现读写分离和基本 HA

缺点

维度说明
需要服务进程现场部署复杂度上升,需要 DBA 或自动化脚本维护
JSON 支持较弱虽有 JSON 类型,但查询和索引能力不如 PostgreSQL
标准兼容性对 SQL 标准的兼容性不及 PostgreSQL,部分高级特性缺失
时序场景无优化没有针对时序数据的原生优化,大量时间戳查询性能有限

适用场景

最适合:

中小型 MES/WMS 系统,多台上位机共享一个数据库服务器 已有 MySQL 运维体系的工厂 IT 环境 设备台账、工单管理、用户权限等业务型数据 需要 Web 管理界面或报表系统,团队熟悉 MySQL 生态


PostgreSQL

核心定位

PostgreSQL(PG)是功能最全面的开源关系型数据库,以严格的 SQL 标准兼容性、强大的扩展机制和丰富的数据类型著称。它在复杂查询、JSON 处理、地理空间数据等高级场景下显著优于 MySQL。

优点

维度说明
完整 SQL 标准窗口函数、CTE、LATERAL JOIN 等高级特性完整支持
原生 JSONBJSONB 类型支持索引,JSON 查询性能远超 MySQL
TimescaleDB 扩展安装后即获得时序数据库能力:自动分区、时序聚合、压缩
PostGIS 扩展地理空间查询,适合有 GIS 需求的上位机系统
数据类型丰富数组、范围类型、枚举、UUID、自定义类型
并发控制 MVCC多版本并发控制,读写不互相阻塞

TimescaleDB 时序能力示例

借助 TimescaleDB,PostgreSQL 可以直接承担工业时序数据的存储:

flowchart TD A[PLC / 传感器] -->|OPC-UA / MQTT| B[数据采集服务] B -->|批量写入| C[(PostgreSQL\n+ TimescaleDB)] C --> D[自动按时间分区\nhypertable] D --> E[连续聚合视图\ncontinuous aggregate] E --> F[Grafana / 上位机\n趋势图表] C --> G[JSONB 列\n报警/事件记录]

创建一张时序表仅需:

-- 创建普通表
CREATE TABLE sensor_data (
    time        TIMESTAMPTZ NOT NULL,
    device_id   TEXT        NOT NULL,
    tag_name    TEXT        NOT NULL,
    value       DOUBLE PRECISION,
    quality     SMALLINT DEFAULT 192
);

-- 转换为 hypertable(自动按时间分区)
SELECT create_hypertable('sensor_data', 'time');

-- 创建连续聚合:每分钟均值
CREATE MATERIALIZED VIEW sensor_1min
WITH (timescaledb.continuous) AS
SELECT
    time_bucket('1 minute', time) AS bucket,
    device_id,
    tag_name,
    AVG(value)  AS avg_val,
    MAX(value)  AS max_val,
    MIN(value)  AS min_val
FROM sensor_data
GROUP BY bucket, device_id, tag_name;

缺点

维度说明
学习曲线功能丰富反而带来更大的学习成本
资源占用相比 MySQL 内存占用更高
国内生态国内社区和运维工具不如 MySQL 普及

适用场景

最适合:

需要时序数据 + 业务数据统一存储(装了 TimescaleDB 后"一库两用") 复杂报表、统计分析、质量追溯系统 有 GIS 需求的系统(设备地图、厂区路由) 数据结构需要灵活演进(JSONB 处理半结构化数据) * 新项目、新团队,优先推荐作为关系型数据库首选


MongoDB

核心定位

MongoDB 是文档型 NoSQL 数据库,以 BSON(类 JSON)文档为存储单元,天然适合结构不固定、嵌套层级深的数据。它没有预定义 Schema,字段可随时增减。

优点

维度说明
灵活 Schema字段可随时增减,无需 ALTER TABLE,适合快速迭代
文档嵌套一条记录可嵌套数组和子文档,天然贴合报警详情、事件日志
水平扩展Sharding 分片支持 PB 级数据水平扩展
聚合管道强大的 Aggregation Pipeline,支持复杂的数据变换
原生时序集合5.0+ 引入 Time Series Collection,专为时序数据优化

缺点

维度说明
事务支持有限多文档事务支持晚于关系型数据库,性能开销较大
内存占用高WiredTiger 引擎默认使用较多内存,低配工控机需调优
不适合复杂关联多集合 JOIN 性能差,关系型数据天然不适合
运维复杂度副本集、分片集群的运维复杂度显著高于关系型数据库
授权协议SSPL 协议在某些商业场景下存在法律风险

典型文档结构示例

{
  "_id": "evt_20240315_001",
  "timestamp": "2024-03-15T08:32:11Z",
  "device": {
    "id": "PLC_LINE_A_01",
    "name": "A线主控 PLC",
    "location": "车间A-东"
  },
  "alarm": {
    "code": "E4021",
    "level": "HIGH",
    "description": "电机温度超限",
    "threshold": 85.0,
    "actual": 91.3
  },
  "context": {
    "operator": "张伟",
    "shift": "早班",
    "production_order": "PO20240315003"
  },
  "ack": {
    "acknowledged": true,
    "acked_by": "李明",
    "acked_at": "2024-03-15T08:35:22Z"
  }
}

适用场景

最适合:

报警管理系统(报警结构复杂、字段因设备类型不同而差异大) 设备档案管理(不同类型设备的属性字段差异巨大) 生产日志、操作审计(写多读少,结构灵活) 配合微服务架构,作为独立的文档存储服务


综合对比

radar title 四种数据库在上位机场景的能力雷达 options max: 5 "SQLite3": [5, 1, 1, 4, 3, 5] "MySQL": [3, 4, 3, 2, 4, 3] "PostgreSQL": [3, 4, 5, 4, 4, 3] "MongoDB": [2, 3, 3, 5, 2, 3] axes: ["运维轻量", "并发能力", "查询能力", "结构灵活", "生态成熟", "嵌入友好"]
对比维度SQLite3MySQLPostgreSQLMongoDB
部署方式嵌入式,无服务进程C/S,需独立服务C/S,需独立服务C/S,需独立服务
并发写入❌ 弱✅ 良✅ 良✅ 良
时序数据⚠️ 可用但无优化⚠️ 可用但无优化✅ TimescaleDB✅ 原生支持
JSON 支持⚠️ 文本存储⚠️ 基础支持✅ JSONB + 索引✅ 原生文档
复杂查询⚠️ 基础 SQL✅ 较好✅ 最强⚠️ 聚合管道
事务 ACID⚠️ 多文档有限
水平扩展⚠️ 有限⚠️ 有限✅ 原生分片
学习成本⭐ 极低⭐⭐ 低⭐⭐⭐ 中⭐⭐⭐ 中
离线可用✅(本地部署)✅(本地部署)✅(本地部署)

选型决策树

flowchart TD Start([上位机数据库选型]) --> Q1{是否单机部署\n无需多客户端共享?} Q1 -- 是 --> Q2{数据量是否\n小于 5GB?} Q2 -- 是 --> R1[✅ SQLite3\n零部署,最简单] Q2 -- 否 --> Q3{有无时序\n分析需求?} Q1 -- 否 --> Q4{数据结构是否\n高度统一规整?} Q3 -- 有 --> R2[✅ PostgreSQL\n+ TimescaleDB] Q3 -- 无 --> R3[✅ PostgreSQL\n或 MySQL] Q4 -- 是 --> Q5{团队是否\n熟悉 PostgreSQL?} Q4 -- 否 --> R4[✅ MongoDB\n灵活 Schema] Q5 -- 是 --> R5[✅ PostgreSQL\n功能更强] Q5 -- 否 --> R6[✅ MySQL\n生态更熟悉]

实战组合方案

在实际上位机项目中,单一数据库往往无法覆盖所有场景。以下是两种常见的组合策略:

方案 A:SQLite3 + PostgreSQL(边缘 + 云端)

flowchart LR A[传感器 / PLC] --> B[边缘采集程序] B -->|本地写入| C[(SQLite3\n边缘缓存)] C -->|网络恢复后\n批量同步| D[(PostgreSQL\n中心服务器)] D --> E[报表 / 大屏]

适合网络不稳定、需要断点续传的工厂现场。边缘 SQLite3 保证数据不丢失,中心 PostgreSQL 承担历史分析。

方案 B:PostgreSQL + MongoDB(结构化 + 非结构化)

flowchart TD A[上位机应用] --> B{数据类型} B -->|采集数值\n工单记录| C[(PostgreSQL\n结构化数据)] B -->|报警详情\n设备档案\n操作日志| D[(MongoDB\n文档数据)] C --> E[业务报表] D --> F[审计追溯]

适合功能复杂的 MES 类系统,各取所长,避免"用锤子看什么都是钉子"。


总结

没有"最好"的数据库,只有"最合适"的选择:

单机 HMI / 工控机 / 离线部署SQLite3,首选无服务嵌入式方案 多客户端共享、熟悉关系型、注重生态MySQL,稳健的中间选择 新项目、时序 + 业务数据一体化、复杂查询PostgreSQL,综合能力最强的关系型 报警/日志/档案等 Schema 复杂多变MongoDB,文档模型天然契合

最后一个实用建议:如果你在做一个新的上位机项目,不确定从哪里开始,先从 SQLite3 起步——它会让你在原型阶段飞速迭代;当数据规模增长或多用户并发需求出现时,再迁移到 PostgreSQL。这条路径风险最低,且两者的 SQL 方言差异极小,迁移成本可控。


关键词:上位机数据库, SQLite3, MySQL, PostgreSQL, MongoDB, 工业数据存储, TimescaleDB, 数据库选型

本文作者
成都尘轻扬技术团队

尘轻扬科技团队长期服务于制造业、军工和高可靠场景,聚焦 AI 私有知识库、工业软件与现场控制系统交付。

联系作者团队
RELATED

继续阅读

查看全部文章
工业软件24 分钟阅读

Qt/PySide 上位机开发 RS485 Modbus 对接全攻略:从总线拓扑到线程安全

系统梳理在 Qt(C++)或 PySide6(Python)环境下对接 RS485 Modbus RTU/ASCII 设备时的工程实践要点,涵盖总线拓扑与物理层规范、帧结构与 CRC 校验、分级轮询策略、超时重试机制、线程安全通信架构(Worker + 信号槽)、收发切换时序、多从机设备管理及通信质量诊断,帮助开发者规避工业现场的常见陷阱。

成都尘轻扬技术团队
上位机 / HMI18 分钟阅读

在上位机开发中,我们为什么选择 QML 而不是 Qt Widgets?

在工业 HMI 和上位机开发中,Qt Widgets 与 QML 的选型之争从未停歇。本文结合多个实际项目经验,从渲染架构、动画系统、分层设计与工程协作四个维度,系统解析我们为何最终将 QML + Qt Quick 作为主力界面开发方案,以及 Widgets 仍然适用的场景边界。

成都尘轻扬技术团队
上位机 / HMI18 分钟阅读

Qt 上位机开发:用异步串口 + 状态机彻底解决 Modbus 485 通信卡顿问题

在基于 RS-485 Modbus RTU 协议的 Qt 上位机开发中,"一问一答"的半双工通信极易导致界面卡顿。本文深入剖析卡顿根因,提出"异步 QSerialPort + 命令队列 + 请求/响应状态机 + QTimer 超时保护"的完整非阻塞架构,并附完整 C++ 实现代码,彻底告别 waitForReadyRead 式阻塞带来的上位机卡顿问题。

成都尘轻扬技术团队