#document-database #database #couch-db #server #default #programmable #database-schema

已删除 pliantdb

受 CouchDB 启发的可编程文档数据库

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日

#12 in #couch-db

每月 39 次下载

MIT/Apache

145KB
3K SLoC

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)))
    }
}

定义好您的集合后,您就可以打开数据库并查询它

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()
);

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

  • 部署高可用数据库很困难(并且通常很昂贵)。这不必如此。
  • 我们是充满激情的 Rustaceans,并致力于支持一个 100% 基于 Rust 的部署生态系统,用于新编写的软件。
  • 特别针对创始人@ecton,这个设计的想法可以追溯到他在运营基于CouchDB的上一家公司的业余项目时的想法。从事这个项目实现了他长久以来的愿望。

备份

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

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

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

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

开发PliantDB

提交前钩子

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

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

完成之后,包括cargo fmtcargo doccargo test在内的工具都将被检查,然后才会执行git commit命令。

开源许可

该项目,就像Khonsu Labs的所有项目一样,是开源的。该存储库可在MIT 许可证Apache 许可证 2.0下使用。

依赖

~2–16MB
~220K SLoC