WonderPen 存储格式迁移历程

💡 原文中文,约4100字,阅读约需10分钟。
📝

内容提要

WonderPen 写作软件将数据存储从 JSON 文件迁移至 SQLite 数据库,以解决文档多、搜索慢和易冲突的问题。桌面端采用 better-sqlite3 或 libsql,目前使用 Node.js 内置 SQLite;移动端共享数据库结构,通过 Drizzle.js 统一接口。但云盘同步可能损坏数据库文件,建议在数据量大或关系复杂时使用 SQLite。

🔎

延伸解读

从 JSON 到 SQLite 的迁移动因

WonderPen 最初使用 Markdown 文件存储文档,后因需要记录额外元数据而改为 JSON 文件。随着文档数量增多,全库搜索、批量替换等操作需要对大量小文件频繁读写,效率低下。作者曾考虑将整个文档库加载到内存中处理,但发现这相当于实现一个简化版内存数据库,于是转向成熟的 SQLite,以利用其结构化查询和索引能力。

桌面端 SQLite 库的选择与权衡

在 Electron 35 之前,Node.js 没有内置 SQLite,需借助第三方库。better-sqlite3 性能优异但包含原生模块,打包时需编译,可能遇到环境问题;libsql 无需编译、打包方便,但性能略逊约 20%。作者在正式项目用 better-sqlite3,测试用 libsql,以规避 ABI 差异。Electron 35 后,Node.js 内置 SQLite 已足够稳定,WonderPen 已迁移至内置库。

云盘同步 SQLite 文件的风险

将 SQLite 数据库文件放在 OneDrive 等云盘同步存在损坏风险。WonderPen 对数据库读写频繁,每次修改都可能触发同步,若文件较大或网络慢,易发生同步未完成又被修改的情况,云盘处理出错可能导致数据库文件损坏,进而影响所有文档。相比之下,JSON 文件损坏只影响单个文件。因此,不建议将大型且频繁变化的二进制文件放在云盘同步。

Q&A

WonderPen 为什么从 JSON 文件迁移到 SQLite 数据库?

因为随着文档数量增多,JSON 文件存储导致全库搜索、批量替换等操作低效,且文档间关系(如章节顺序)管理复杂,容易产生文件冲突。SQLite 作为成熟数据库,能高效处理结构化数据和复杂查询。

WonderPen 在桌面端使用什么 SQLite 库?

桌面端最初使用 better-sqlite3,后来也测试过 libsql,目前已经迁移到 Node.js 内置的 SQLite 库(从 Electron 35 开始支持)。

better-sqlite3 和 libsql 有什么区别?

better-sqlite3 性能更好,但包含原生模块,打包时需要编译;libsql 性能稍差(约 20%),但内置二进制文件,打包方便。

WonderPen 如何统一桌面端和移动端的数据库操作?

桌面端和移动端共享数据库迁移文件,确保数据库结构一致,并使用 Drizzle.js 作为 ORM,它支持 Proxy,可以适配不同底层 SQLite 库,从而共享业务代码。

将 SQLite 数据库放在云盘同步有什么风险?

SQLite 数据库是单个大二进制文件,频繁读写时云盘同步容易出错,可能导致数据库文件损坏,进而无法读取所有文档。

WonderPen 迁移到 SQLite 后,对用户有什么建议?

建议不要将 SQLite 数据库放在 OneDrive 等云盘中同步,以免文件损坏;如果数据量小且关系简单,可以继续使用 JSON 文件,但数据量大或关系复杂时建议使用 SQLite。

🏷️

标签

➡️

继续阅读