#json #sqlite #nosql #storage

hotpot-db

🌶️ 最热的方式在网络上存储数据。如果你喜欢 JSON 并处理后续事物

3 个版本

0.0.2 2020 年 2 月 12 日
0.0.1 2020 年 2 月 12 日
0.0.0 2020 年 2 月 12 日

#2587数据库接口

MIT 许可证

21KB
433

hotpot-db

警告:API 未完成,可能随时更改。新功能和文档将在 1.0 稳定版发布之前添加

🌶️🌶️🌶️ 最热的存储数据方式

hotpot-db 是一种辛辣、极其容易使用且美味的数据库系统。

hotpot_db = "0.0.1"

风味调色板

  1. 无模式
  2. 可靠(使用 SQLite3)
  3. 可嵌入
  4. 快速(搜索 +500K 对象耗时 <200ms)
  5. JSON 存储
  6. 可查询的 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. 1 杯,SQLite 3.30.1
  2. 2 汤匙,Rust
  3. 一撮,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