#mongo-db #sqlite #user #single-file #api #sql-database

bin+lib hoardbase

Hoardbase 是一个基于 sqlite 的单文件嵌入式数据库,其 API 与 mongodb 相同。

1 个不稳定版本

0.1.0-alpha2021 年 12 月 20 日

#59#single-file

MIT/Apache

135KB
2.5K SLoC

Hoardbase

Hoardbase 是一个伪装成 NoSql 数据库的 sqlite,其 API 与 mongodb 类似。我曾多次需要单文件嵌入式 NoSql 解决方案,却找不到任何。针对我的用例,一个好的选择应满足以下要求:

  1. 它必须是 NoSql。当数据较脏时,这在数据 ETL 用例中很常见。NoSql 还能带来另一个好处,即实现数据向后兼容的难度降低。即使最终可以定义数据模式并希望使用 Sql 数据库,使用 NoSql 进行原型设计也更容易。
  2. 数据库必须是可嵌入的,以便易于部署。在许多用例中,例如独立的桌面应用程序,最终用户可能没有设置和维护数据库服务器的技能。
  3. 数据库必须包含在一个文件中。这将保证数据完整性,并使未经培训的用户更容易进行数据迁移和备份。
  4. 应有跨语言支持(至少 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 字段上创建索引。更多参考资料,以下是一些有用的链接

如何在数据库中查询 json

sqlite json 支持

依赖关系

~42MB
~747K SLoC