SQLite 压缩文本历史原型:Simon Willison 的新思路与中文圈应用前景
Simon Willison 提出在 SQLite 中存储文本修订历史的新方法:将所有旧版本打包为 JSON 数组并压缩。本文解析该原型的技术细节、压缩效果,并探讨对中文开发者在版本管理、内容编辑等场景的启示。
一句话看懂
Simon Willison 提出用 JSON 数组打包所有旧版本文本,再用 zlib 或 zstd 压缩,以高效存储 SQLite 中的修订历史。
详细发生了什么
Simon Willison 一直在探索关系数据库中存储修订历史的高效方案。传统做法是为每个版本单独存一行,但文档一旦较长(例如 20KB),每次编辑都会新增 20KB 数据,数据库体积迅速膨胀。
他在遛狗时想到一个新点子:把某个文本字段的所有历史版本(从最初到最新)全部放入一个大的 JSON 字符串数组,然后对整个数组应用 zlib 或 zstd 压缩。由于各版本之间高度相似,压缩算法能有效消除冗余,大幅减少存储占用。
为此,他创建了一个原型项目(GitHub 上的 sqlite-text-history-prototype),核心思路是在表中增加一个 BLOB 类型的 history 列,存储压缩后的 JSON 数组。他还利用 ChatGPT iPhone 应用中新推出的 GPT-Live 语音模式讨论了这个原型,并分享了对话的文字记录。
这个方案的优势在于简单:无需复杂的 diff 算法或专门的版本表,只需一个压缩函数。压缩率取决于文本的相似度,对于频繁小幅修改的文档,效果可能非常显著。
中文圈视角
这个原型对中文开发者有直接参考价值。国内很多应用(如笔记软件、CMS、协同编辑工具)都需要保存文本修订历史,但常面临存储成本问题。此方案提供了一种轻量级思路,尤其适合中小型项目,无需引入 Git 或专门的版本数据库。
不过,中文文本的压缩特性与英文略有不同,中文字符在 zlib/zstd 下的压缩率通常更高,因此该方案对中文内容可能更友好。但需要注意,JSON 数组中的字符串需要正确处理 Unicode 编码,避免乱码。
另外,国内开发者常用 SQLite 作为本地存储(如移动应用、桌面工具),此方案可直接落地。若担心压缩性能,可选用 zstd,它在速度和压缩率上更均衡。相比国产数据库(如 TiDB、OceanBase)的复杂版本管理,这个原型更轻量,适合快速实现。
几条值得记住的细节
- 原型代码在 GitHub 仓库
simonw/research的sqlite-text-history-prototype目录下。 - 核心机制:将历史版本放入 JSON 数组,再用 zlib 或 zstd 压缩,存入 BLOB 列。
- 传统逐行存储方式在文档为 20KB 时,每次编辑增加 20KB 数据。
- 压缩效果依赖文本重复度,频繁小幅修改的文档压缩率更高。
- 作者使用 GPT-Live 语音模式讨论原型,但语音对话暂不支持分享链接。
一句话总结
这个压缩历史方案为 SQLite 用户提供了一种低成本存储修订记录的新思路,值得中文开发者尝试。