1、数据库基础与选型:关系型与非关系型数据库对比、SQLite vs MySQL vs PostgreSQL、桌面应用数据库选型原则

做桌面应用开发这么多年,我踩过最大的坑之一,就是数据库选型。说实话,很多人一开始根本不把这当回事——随便选一个,写到一半发现性能扛不住,或者部署时发现用户还得装个数据库服务端,那叫一个头疼。

这一章,咱们就把数据库选型这件事彻底聊透。我会从最基础的概念讲起,然后对比几款主流数据库,最后给出桌面应用的选型原则。嗯,都是实战经验,你拿过去就能用。

1.1 关系型 vs 非关系型:到底怎么选?

先搞清楚这两个阵营的区别。关系型数据库,说白了就是「表格+关系」。你用 Excel 管理数据时,一个 sheet 放客户信息,另一个 sheet 放订单信息,然后用客户 ID 把两张表关联起来——这就是关系型数据库的核心理念。

非关系型数据库呢?它更灵活。你可以存 JSON 文档、键值对、甚至图结构。我早期做过一个配置管理工具,数据格式经常变,用关系型数据库改表结构改到崩溃,后来换成 MongoDB,世界清净了。

核心区别一句话总结:

  • 关系型:数据关系明确、需要事务支持、查询复杂——选它
  • 非关系型:数据结构灵活、高并发读写、海量数据——选它

但桌面应用场景下,我个人的建议是:优先考虑关系型数据库。为什么?因为桌面应用的数据量通常不大,但数据关系往往很复杂。你想想看,一个进销存系统,商品、客户、订单、入库单……这些数据天然就是关系型的。

我的经验:除非你的数据是纯粹的键值对(比如配置文件缓存),或者文档结构经常变,否则别碰非关系型。我在一个项目中试过用 MongoDB 做桌面应用,结果用户想做个多表关联查询,折腾了半天——得不偿失。

1.2 SQLite vs MySQL vs PostgreSQL:三款主流数据库深度对比

这三款是我在桌面项目中最常用的。咱们一个一个说。

SQLite:轻量级之王

SQLite 是个「嵌入式数据库」。什么意思?它不需要独立的服务进程,数据直接存在一个文件里。你的应用启动时,直接调用 SQLite 的库函数就能读写数据。

我特别喜欢 SQLite 的一点:零配置。用户下载你的软件,双击就能用,不需要安装 MySQL、不需要配置端口、不需要创建用户。对于单机版桌面应用来说,这简直是天选之子。

适用场景:

  • 单用户桌面应用(记账软件、笔记工具、个人知识库)
  • 移动端应用(Android/iOS 原生支持)
  • 嵌入式设备(路由器、智能家居)
  • 原型开发(快速验证想法)

但 SQLite 也有短板。并发写入能力弱——多个进程同时写同一个数据库文件,会报错。我记得有一次,一个同事把 SQLite 用在了 Web 服务后端,结果高并发下频繁出现「database is locked」错误。嗯,这就是选型失误。

MySQL:生态最成熟

MySQL 是关系型数据库的老大哥。它需要独立安装服务端,客户端通过网络连接访问。对于需要多用户同时操作的桌面应用,MySQL 是稳妥的选择。

我做过一个连锁店管理系统,每个门店的客户端都连接中心服务器的 MySQL。数据实时同步,权限控制精细,事务支持完善。这种场景下,SQLite 根本扛不住。

注意:MySQL 的安装和配置对普通用户来说是个门槛。如果你的软件需要用户自己装 MySQL,那体验会大打折扣。我建议:要么用 SQLite 做单机版,要么你提供一键部署脚本

PostgreSQL:功能最强大

PostgreSQL 是关系型数据库里的「技术流」。它支持 JSON、数组、自定义类型、地理空间数据……功能多到让你怀疑它是不是关系型数据库。

我个人习惯在需要复杂查询和数据分析的场景下用 PostgreSQL。比如一个报表系统,需要做窗口函数、递归查询、甚至全文检索——PostgreSQL 都能原生支持,不需要额外插件。

但 PostgreSQL 的缺点是:学习曲线陡。它的配置项比 MySQL 多,性能调优也更复杂。如果你团队里没人熟悉 PostgreSQL,我建议谨慎选择。

特性 SQLite MySQL PostgreSQL
部署方式 嵌入式(文件) 客户端-服务端 客户端-服务端
配置复杂度 零配置 中等 较高
并发能力 弱(单写多读)
事务支持 支持(但粒度粗) 支持(InnoDB) 支持(MVCC)
数据类型 基础类型 丰富 极其丰富
适用规模 单机/小数据量 中小型应用 中大型应用
典型场景 个人工具、移动端 Web应用、多用户系统 数据分析、GIS、复杂查询

1.3 桌面应用数据库选型原则

好了,理论讲完了,咱们来点实际的。我给桌面应用数据库选型总结了四条原则,你照着做,基本不会出大问题。

原则一:优先考虑部署体验

桌面应用和 Web 应用最大的区别是什么?用户不会配置数据库。你想想看,一个普通用户下载了你的记账软件,结果还要去装 MySQL、建数据库、配用户权限——他大概率直接卸载了。

所以我的建议是:能用 SQLite 就用 SQLite。除非你的应用明确需要多用户并发访问,否则别给自己找麻烦。

避坑指南:我曾经做过一个项目,一开始用 SQLite 开发,后来客户要求支持多用户。我花了整整两周把数据迁移到 MySQL,还改了所有 SQL 语句(SQLite 和 MySQL 的 SQL 语法有差异)。如果一开始就选 MySQL,能省一半时间。

原则二:数据量决定一切

你的应用会存多少数据?这是个关键问题。

  • 小于 1GB:SQLite 完全够用。我做过一个个人知识管理工具,数据库文件才 200MB,查询速度飞快。
  • 1GB - 10GB:可以考虑 MySQL 或 PostgreSQL。这个量级下,SQLite 的查询性能会明显下降。
  • 大于 10GB:必须用 MySQL 或 PostgreSQL。而且我建议你考虑分库分表,或者引入缓存层。

原则三:查询复杂度决定数据库类型

如果你的查询很简单——就是根据 ID 查一条记录,或者按条件筛选——那 SQLite 足够了。

但如果你需要做多表 JOIN、子查询、聚合函数、窗口函数……那 PostgreSQL 是更好的选择。MySQL 也能做,但某些复杂查询的性能不如 PostgreSQL。

我记得有一次,一个财务软件需要做「每个月的累计销售额」——这要用到窗口函数的 SUM() OVER (ORDER BY date)。PostgreSQL 原生支持,MySQL 8.0 之后才支持。如果你的用户还在用 MySQL 5.7,那就尴尬了。

原则四:考虑未来的扩展性

很多开发者犯的一个错误:只考虑当前需求。你的应用现在只是单机版,但万一客户要求联网呢?万一需要对接其他系统呢?

我建议:选一个「向上兼容」的数据库。什么意思?

  • 先用 SQLite 快速开发,但 SQL 语句尽量写标准 SQL,避免使用 SQLite 特有的语法。
  • 在代码中抽象出数据访问层(DAL),这样以后换数据库时,只需要改 DAL 的实现。
  • 如果预算允许,直接上 PostgreSQL。它的功能最全,未来扩展空间最大。

我的最终建议:

  • 个人工具/小团队内部工具:SQLite(省心、快速)
  • 多用户桌面应用(如进销存、CRM):MySQL(生态好、文档多)
  • 需要复杂查询/数据分析的桌面应用:PostgreSQL(功能强、性能稳)

嗯,这一章的内容就到这里。数据库选型没有银弹,关键是根据你的实际场景做权衡。下一章,我会带你手把手搭建 SQLite 的开发环境,并写第一个 CRUD 示例。到时候你就知道,为什么我说 SQLite 是桌面应用开发者的好朋友了。