WonderPen 存储格式迁移历程
内容提要
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。