3 个版本
0.0.2 | 2020 年 2 月 12 日 |
---|---|
0.0.1 | 2020 年 2 月 12 日 |
0.0.0 | 2020 年 2 月 12 日 |
#2587 在 数据库接口
21KB
433 行
hotpot-db
警告:API 未完成,可能随时更改。新功能和文档将在 1.0 稳定版发布之前添加
🌶️🌶️🌶️ 最热的存储数据方式
hotpot-db 是一种辛辣、极其容易使用且美味的数据库系统。
hotpot_db = "0.0.1"
风味调色板
- 无模式
- 可靠(使用 SQLite3)
- 可嵌入
- 快速(搜索 +500K 对象耗时 <200ms)
- JSON 存储
- 可查询的 JSON 架构
示例
use hotpot_db::*;
use serde::{Deserialize, Serialize};
#[derive(Debug, Serialize, Deserialize)]
struct Person {
name: String,
age: u8,
}
fn main() -> Result<(), hotpot_db::Error> {
let mut pot = HotPot::new();
// lets make a new collection
pot.create_collection("address_book")?;
// well make a new item we want to store
let person = Person {
name: String::from("david holtz"),
age: 26,
};
// we insert the object into the collection!
pot.insert::<Person>("address_book", &person)?;
// before we query we can add an index to speed things up
pot.add_index_to_collection("address_book", "name", "naming_index")?;
// finally we can query
let query = QueryBuilder::new()
.collection("address_book")
.kind(QueryKind::Object)
.key("name")
.comparison("=")
.string("david holtz")
.finish();
let results = pot.execute(query);
println!("{:#?}", results);
Ok(())
}
食谱
hotpot-db 由少量,但经过时间考验的成分制成。它是对传统菜肴的新方法。
成分
- 1 杯,
SQLite 3.30.1
- 2 汤匙,
Rust
- 一撮,
JSON serde
概念
集合
从技术角度看,集合只是 SQLite 中的一个表,以特定格式存储数据。每一行都是一个 Entry
,它由三个列组成:id、time_created、data。数据列包含每个 JSON 对象,其他列用作 hotpot-db 元数据。
理论上,集合应存放类似数据以便于管理,但 hotpt-db 不关心模式,因此你可以在单个集合中存储任何类型的对象。
对象
每个条目包含一个对象,它们是 hotpot-db 的核心。对象之所以特殊,是因为你可以有效地查询其内容。
与其他数据存储中存储 JSON 相比,这是一个优势,因为你不需要读取整个对象来查询内容。hotpot-db 将 SQLite 的 json1 扩展包装在一个易于使用的 API 中。
速度估计
对象使我们能够存储无模式数据,同时仍然有效地搜索它们。小型数据库(约 10MB)的查询在 <5ms 内运行,并在大型数据库(约 100MB)上测试的查询在 <500ms 内运行。
查询类型
在火锅里,你只能以两种不同的方式查询。你可以检查数组的内容或对象的属性/值。
hotpot-db 为开发者提供了一个简单的 QueryBuilder,允许你方便地编写和读取查询。
查询数组
let query = QueryBuilder::new()
.collection("transaction_records")
.kind(QueryKind::Contains)
.comparison(">")
.int(100)
.finish();
查询对象
let query = QueryBuilder::new()
.collection("address_book")
.kind(QueryKind::Object)
.key("name")
.comparison("=")
.string("david holtz")
.finish();
依赖关系
~23MB
~448K SLoC