1 个不稳定版本
0.1.0-alpha | 2021 年 12 月 20 日 |
---|
#59 在 #single-file
135KB
2.5K SLoC
Hoardbase
Hoardbase 是一个伪装成 NoSql 数据库的 sqlite,其 API 与 mongodb 类似。我曾多次需要单文件嵌入式 NoSql 解决方案,却找不到任何。针对我的用例,一个好的选择应满足以下要求:
- 它必须是 NoSql。当数据较脏时,这在数据 ETL 用例中很常见。NoSql 还能带来另一个好处,即实现数据向后兼容的难度降低。即使最终可以定义数据模式并希望使用 Sql 数据库,使用 NoSql 进行原型设计也更容易。
- 数据库必须是可嵌入的,以便易于部署。在许多用例中,例如独立的桌面应用程序,最终用户可能没有设置和维护数据库服务器的技能。
- 数据库必须包含在一个文件中。这将保证数据完整性,并使未经培训的用户更容易进行数据迁移和备份。
- 应有跨语言支持(至少 C/C++、Python、Rust 和 Nodejs)。
我认为嵌入式 NoSql 是一个非常常见的构建块,但缺乏好的选择。在我看来,最接近的是 ejdb2。然而,该项目已停止开发,其代码可读性较差。但是,这个项目呢?Sqlite 是一个坚实的基石,并且已经过实战检验。我试图使包装层简单,并确保内部文档完善以便可修复。
使用方法
Hoardbase 试图提供一个类似于 mongodb 的编程接口。如果您已经熟悉 mongodb,使用 Hoardbase 应该非常简单。
内部结构
使用 sqlite 存储和查询 json 数据的关键机制是将 json 文档序列化为 blob 类型。目前使用 bson
作为序列化格式。另一个有趣的格式是 Amazon Ion。我可能会在 Ion 的 rust 绑定成熟时添加对其的支持。
索引和搜索是通过使用 sqlite 的 应用定义函数 实现的。基本上,我们可以定义自定义函数,这些函数在 blob 类型上操作以提取 json 字段或修补 blob。只要这些自定义函数是确定的,就可以用于索引和搜索。例如,我们可以定义一个函数 bson_field(path, blob)
,它从 blob 中提取 bson 字段。如果我们使用 WHERE bson_field('name.id', blob) = 3
来调用此函数针对集合,我们将找到所有 name.id 等于 3 的文档。我们还可以使用此函数在 bson 字段上创建索引。更多参考资料,以下是一些有用的链接
依赖关系
~42MB
~747K SLoC