SQLite 与嵌入式数据库
问题
SQLite 有什么特点?什么是边缘数据库?
答案
SQLite 特点
| 特点 | 说明 |
|---|---|
| 零配置 | 无需安装服务器,嵌入进程 |
| 单文件 | 整个数据库就是一个文件 |
| 高性能 | 读性能极佳(无网络开销) |
| ACID | 完整事务支持 |
| 限制 | 不适合高并发写入 |
适用场景
- 本地优先应用:离线 + 同步
- Electron/Tauri 桌面应用:本地数据存储
- 边缘计算:Cloudflare D1、Turso
- 嵌入式设备:IoT、移动端
- 开发/测试:代替 MySQL 做本地开发
边缘数据库
| 方案 | 基于 | 特点 |
|---|---|---|
| Cloudflare D1 | SQLite | Cloudflare Workers 原生 |
| Turso | libSQL(SQLite 分支) | 嵌入式复制 |
| LiteFS | SQLite | Fly.io 生态 |
| PGlite | PostgreSQL | 浏览器端 PG |
Turso + Drizzle 使用
turso-drizzle.ts
import { drizzle } from 'drizzle-orm/libsql';
import { createClient } from '@libsql/client';
const client = createClient({
url: process.env.TURSO_DATABASE_URL!,
authToken: process.env.TURSO_AUTH_TOKEN,
});
const db = drizzle(client);
// 和普通 SQL 使用方式一样
const users = await db.select().from(usersTable).where(eq(usersTable.name, 'Alice'));
浏览器端数据库
browser-db.ts
// sql.js: SQLite 编译为 WASM 在浏览器运行
import initSqlJs from 'sql.js';
const SQL = await initSqlJs({ locateFile: (file) => `/${file}` });
const db = new SQL.Database();
db.run('CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT)');
db.run('INSERT INTO users VALUES (1, "Alice")');
const result = db.exec('SELECT * FROM users');
// result: [{columns: ['id', 'name'], values: [[1, 'Alice']]}]
// 持久化到 IndexedDB 或文件
const data = db.export(); // Uint8Array
常见面试问题
Q1: 什么时候不该用 SQLite?
答案:
- 高并发写入(SQLite 写锁是库级别的)
- 需要远程访问(SQLite 是嵌入式的)
- 数据量超过几十 GB
- 需要多进程写入
Q2: 边缘数据库的优势?
答案:
- 低延迟:数据在离用户最近的边缘节点
- 离线支持:本地副本可离线工作
- 成本低:减少中心数据库请求
- 简单部署:随应用部署,无需独立服务
Q3: 本地优先(Local-First)是什么?
答案:
数据优先存在本地,后台与服务端同步。用户体验类似本地应用(快速、离线可用),同时支持多设备同步。代表方案:CRDTs + SQLite。
相关链接
- SQL vs NoSQL - 数据库选型
- Serverless 与边缘计算 - 边缘计算