需求:客戶端無網絡環境,數據量約 100 萬條,需支持增刪改查。領導指定 Node-Webkit (NW.js),核心疑慮:數據存在哪?怎麼操作?
離線環境下,數據庫本質是磁盤文件。主流方案對比:
| 方案 | 適用場景 | 優點 | 缺點 |
|---|---|---|---|
| SQLite | 結構化數據、複雜查詢、并發讀寫 | 單文件、零配置、支持 SQL、ACID、跨平台、Node.js 原生支持 (better-sqlite3) |
寫入并發受限(文件鎖),超大數據量分頁查詢需索引優化 |
| Access (.mdb/.accdb) | Windows 專用、需 Office 生態集成 | 可視化工具強、支持 SQL、VBA 腳本 | 文件體積大、跨平台差、需安裝 ACE 驅動、并發極弱 |
| XML / JSON 文件 | 配置數據、小數據量、層級結構 | 人類可讀、無依賴、Web 技術原生解析 | 全量讀寫、無索引、100 萬條性能極差、并發無鎖機制 |
| LevelDB / RocksDB (Node 綁定) | 鍵值存儲、極高寫入吞吐 | LSM 樹架構、壓縮、迭代器、嵌入式 | 無 SQL、需手寫索引邏輯、學習曲線陡 |
// package.json 依賴
"dependencies": {
"better-sqlite3": "^9.0.0" // 同步 API、性能極佳
}
// 主進程 database.js
const Database = require('better-sqlite3');
const db = new Database('app_data.db'); // 單文件自動創建
// 初始化表
db.exec(`CREATE TABLE IF NOT EXISTS records (
id INTEGER PRIMARY KEY AUTOINCREMENT,
data TEXT NOT NULL,
created_at INTEGER DEFAULT (strftime('%s','now'))
)`);
// 增
const insert = db.prepare('INSERT INTO records (data) VALUES (?)');
for (let i = 0; i < 1000000; i++) insert.run(`data_${i}`);
// 刪
db.prepare('DELETE FROM records WHERE id = ?').run(123);
// 改
db.prepare('UPDATE records SET data = ? WHERE id = ?').run('new', 456);
// 查(分頁)
const page = db.prepare('SELECT * FROM records LIMIT ? OFFSET ?').all(20, 0);
CREATE INDEX idx_created ON records(created_at),100 萬條分頁查詢毫秒級。db.pragma('journal_mode = WAL'),讀寫不阻塞,適合多標籤頁 NW.js 應用。nwjs-builder-phoenix 打包時確保 better-sqlite3 原生模塊隨架構(x64/ia32)正確包含。app_data.db 到用戶可見目錄(如 Documents),防數據丟失。結論:離線 100 萬條增刪改查,SQLite 是唯一務實選擇,NW.js 生態完美支持。