Featured image of post 不要什么都用 PostgreSQL!SQLite 的嵌入式架构与零配置优势是什么?SQLite 的极限在哪?什么时候该选 SQLite、什么时候该选 PostgreSQL?

不要什么都用 PostgreSQL!SQLite 的嵌入式架构与零配置优势是什么?SQLite 的极限在哪?什么时候该选 SQLite、什么时候该选 PostgreSQL?

SQLite 是世界上部署最广泛的嵌入式数据库引擎,单一文件、零配置、免安装服务器。了解 SQLite 与 PostgreSQL 的核心架构差异、各自适用情境、SQLite 的极限(并发写入锁定、无法跨服务器、缺乏权限管理)。

你有没有想过,你每天打开的浏览器、手机里的通讯软件、甚至桌面上的笔记工具,里面都藏着同一个轻巧的数据库?

它不需要你安装任何服务器软件,不需要设置账号密码,甚至不需要网络连接。它就是一个 文件,静静地躺在你的硬盘里,随时准备好为你服务。

这个低调的存在,就是 SQLite

什么是 SQLite?世界上部署最广泛的数据库

SQLite 是一个用 C 语言编写的 嵌入式关系型数据库引擎

没有独立的服务器程序,而是直接嵌入你的应用程序中运作。

这跟你熟悉的 PostgreSQLMySQL 完全不同。传统数据库是一台 独立运作的服务器,你的程序必须透过 网络协议(TCP/IP) 去跟它「通讯」。

SQLite 不一样,它就是一段代码,直接跑在你的应用程序里面,读写硬盘上的那个 .db 文件。

比较维度 SQLite(嵌入式) PostgreSQL(Client-Server)
运作方式 直接嵌入应用程序,无独立服务器 独立服务器程序,透过网络连接
配置需求 零配置,免安装、免帐密 需要安装、配置账号密码与防火墙
数据存储 单一跨平台文件 服务器目录下的多个文件
备份方式 直接复制那个文件 需要使用 pg_dump 等专用工具

正因为这种 「即插即用」 的特性,SQLite 成为了世界上部署最广泛的数据库引擎。

从 Android 和 iOS 操作系统、Chrome 和 Firefox 浏览器,到 Adobe Lightroom、WhatsApp,甚至是 Airbus A350 的飞行系统,处处都有它的身影。

在 Node.js 中使用 SQLite

如果你是 Node.js 开发者,使用 SQLite 非常简单。你不需要在电脑上安装任何数据库服务器软件,只需要安装一个 npm 套件就能开始。

目前行业最常用的选择:

套件名称 特点 建议情境
sqlite3 最老牌,支持异步 API 需要大量同时处理多个异步任务
better-sqlite3 性能极佳,API 设计直观,速度极快 首选推荐,追求开发效率与执行速度

better-sqlite3 建立数据库并查询,不用五分钟就能完成:

const Database = require('better-sqlite3');
const db = new Database('my_project.db');

db.prepare('CREATE TABLE IF NOT EXISTS users (name TEXT, age INTEGER)').run();

const insert = db.prepare('INSERT INTO users (name, age) VALUES (?, ?)');
insert.run('John', 25);

const user = db.prepare('SELECT * FROM users WHERE name = ?').get('John');
console.log(user); // { name: 'John', age: 25 }

如果文件不存在,better-sqlite3自动帮你建立

SQLite 支持的 SQL 语法比你想的强大

很多人以为 SQLite 很阳春,但它支持绝大多数的标准 SQL 语法,包含许多进阶功能:

语法类别 支持项目
基础操作 SELECTINSERTUPDATEDELETE
数据定义 CREATE TABLECREATE INDEXCREATE VIEW
进阶查询 WITH (CTE 递归查询)、窗口函数(Window Functions)
冲突处理 UPSERTINSERT ... ON CONFLICT DO UPDATE
JSON 处理 json_extractjson_arrayjson_object 等内建函数
事务控制 BEGINCOMMITROLLBACKSAVEPOINT
连接查询 INNER JOINLEFT JOINRIGHT JOINFULL OUTER JOIN

SQLite 的核心哲学是「小而美」,它支持多数你日常需要的 SQL 能力,同时保持极致的轻量。

SQLite 的极限在哪?

轻巧是有代价的。如果把 SQLite 比喻为一间 只有一个结账柜台的文青杂货店,那 PostgreSQL 就是 配备 50 个收银台的好市多

1. 写入大塞车

SQLite 在写入数据时,会把整个数据库文件 锁起来

想像一间 只有一间厕所的餐厅:100 个人可以同时在外面看菜单(读取),但只要有 1 个人进去把门锁上(写入),其他人就只能排队等。

虽然开启 WAL 模式 (Write-Ahead Logging) 能改善读写并行的性能,但本质上仍然无法做到多线程同时写入不同的数据行。

2. 无法跨多台服务器

SQLite 的本质就是一个实体文件。如果你的系统部署在多台服务器上(水平扩展),这些服务器 无法安全地共用同一个文件

3. 缺乏精细的权限管理

SQLite 没有「使用者账号」的概念。谁能在操作系统层面读取那个 .db 文件,谁就能看光、修改所有数据。

对于 需要严格个资审查的商务系统,这是无法接受的。

SQLite vs. PostgreSQL:技术选型决策

工具没有好坏,只有适不适合。以下是一份帮助你做决策的终极检核表:

提問 答「是」→ 选 SQLite 答「否」→ 选 PostgreSQL
后端服务器是不是只有一台,或完全跑在本机端? 否(有水平扩展、多台机器)
系统行为是不是读远远大于写,且没有高频并行写入? 否(大家会同时抢着写入)
不需要精细的数据库账号权限或进阶索引? 否(极度依赖进阶功能)

更具体的情境对照:

情境 推荐选择 理由
桌面软件、手机 App、IoT 设备 SQLite 数据跟着设备走,免安装
个人部落格、展示型官网 SQLite 读多写少,省去维护服务器成本
快速原型开发、Demo SQLite 建个文件就能开工
社区论坛、电商平台 PostgreSQL 高并发写入,需要行级锁
多台服务器分散部署 PostgreSQL 需要跨机器共享数据源
医疗、金融等敏感系统 PostgreSQL 需要严格的角色权限管控

你的数据库是随身笔记还是中央总机

如果数据是 「单机、静态、单一拥有者」,选 SQLite 享受极致的轻量与自由;

如果数据是 「云端、動態、高度互动」,让 PostgreSQL 接管。

SQLite 的核心哲学是 「应用程序的内部元件」,而 PostgreSQL 的定位是 「系统架构的独立中枢」

下次在架构决策时,别急着拿出 PostgreSQL,先问问自己:

「我的数据库,是拿来当随身笔记,还是中央总机?」

答案清楚了,选择自然就明确了。

Reference

All rights reserved,未經允許不得隨意轉載
Built with Hugo
主题 StackJimmy 设计