0.1.0-dev-2 2021年4月14日
0.1.0-dev-1 2021年3月31日
0.1.0-dev-0 2021年3月28日
0.1.0-dev.4 2021年6月23日
0.1.0-dev.3 2021年4月27日

#2 in #pliant-db

每月下载量 21
用于 4 个crate (直接使用 2 个)

MIT/Apache

14KB
338

PliantDB

PliantDB is considered experimental and unsupported crate version Live Build Status codecov Documentation for main branch HTML Coverage Report for main branch

PliantDB 旨在成为一个由 Rust 编写的、符合 ACID 的文档数据库,灵感来自 CouchDB。虽然它受到了 CouchDB 的启发,但这个项目不会试图与现有的 CouchDB 服务器兼容,它将实现自己的复制、集群和分片策略。

项目目标

本项目的高级目标是

  • ☑️ 使用 Rust 类型定义文档型数据库的模式。
  • ☑️ 在您的 Rust 二进制文件中运行,简化基本部署。
  • ☑️☑️ 作为仅本地文件数据库运行,不涉及网络。
  • ☑️☑️ 在多数据库、网络服务器模式下运行,默认启用 TLS
  • 轻松设置多个服务器之间的只读副本。
  • 轻松在至少 3 台服务器上运行高度可用的基于法定人数的集群。
  • 提供发布/订阅事件系统
  • 提供作业队列和调度系统 -- 类似于 SidekiqSQS

⚠️ 本项目的状态

请勿尝试将此软件用于除实验之外的其他用途。 此项目正在积极开发中 (GitHub 提交活动),但在编写此 README 时,该项目的开发还处于早期阶段,不适合使用。

如果您对这个项目感兴趣或想进行贡献,请加入我们的 Discord 进行交流: Discord

示例

请查看 ./pliantdb/examples 了解示例。为了了解其工作原理,这是一个简单的模式

// From pliantdb/examples/view-examples.rs
#[derive(Debug, Serialize, Deserialize)]
struct Shape {
    pub sides: u32,
}

impl Collection for Shape {
    fn id() -> collection::Id {
        collection::Id::from("shapes")
    }

    fn define_views(schema: &mut Schema) {
        schema.define_view(ShapesByNumberOfSides);
    }
}

#[derive(Debug)]
struct ShapesByNumberOfSides;

impl View for ShapesByNumberOfSides {
    type Collection = Shape;

    type Key = u32;

    type Value = ();

    fn version(&self) -> u64 {
        1
    }

    fn name(&self) -> Cow<'static, str> {
        Cow::from("by-sides")
    }

    fn map(&self, document: &Document<'_>) -> MapResult<Self::Key> {
        let shape = document.contents::<Shape>()?;
        Ok(Some(document.emit_key(shape.sides as u32)))
    }
}

在定义了您的集合(s)之后,您可以打开数据库并进行查询

let db =
    Storage::<Shape>::open_local("view-examples.pliantdb", &Configuration::default()).await?;

// Insert a new document into the Shape collection.
db.collection::<Shape>()?.push(&Shape::new(3)).await?;

// Query the Number of Sides View to see how many documents have 3 sides.
println!(
    "Number of triangles: {}",
    db.view::<ShapesByNumberOfSides>()
        .with_key(3)
        .query()
        .await?
        .len()
);

为什么还要编写另一个数据库?

  • 部署高度可用的数据库很难(并且通常很昂贵)。这不必如此。
  • 我们是热衷于 Rust 的程序员,正在努力实现一个理想,即支持 100% 基于 Rust 的新软件部署生态系统。
  • 特别是对于创始人@ecton,这个设计的想法可以追溯到我在使用基于CouchDB的上一家公司时,关于有趣侧项目的思考。从事这个项目实现了他长期以来的愿望。

备份

直接访问数据库的导出和恢复

如果您有一个本地的PliantDB数据库,您可以使用local-backup命令保存和加载备份

pliantdb local-backup <database-path> save
pliantdb local-backup <destination-database-path> load <backup-path>

如果是从PliantDB迁移到另一个解决方案,或者需要进行复杂的灾难恢复工作,这个导出格式应该很容易处理。它在这里描述

开发PliantDB

提交前钩子

我们的CI流程要求一些命令在无警告或错误的情况下成功。为了确保您提交的代码可以通过基本检查,请安装包含的pre-commit钩子

./git-pre-commit-hook.sh install

完成之后,包括cargo fmtcargo doccargo test在内的工具都会在执行git commit之前进行检查。

开源许可证

这个项目,就像Khonsu Labs的所有项目一样,都是开源的。这个仓库可以在MIT许可证Apache许可证2.0下使用。

依赖

~4–10MB
~101K SLoC