2个版本

0.0.2 2019年10月2日
0.0.1 2019年9月12日

#2289编码

33 每月下载量

MIT 许可证

185KB
4.5K SLoC

Vinyl

在FoundationDB Record Layer之上的一层便利层。将允许

  1. 在代码中定义表和索引
  2. 用于查询和插入/删除的protobuf线格式
  3. 用户账户管理
  4. 元数据缓存和元数据持久化
  5. 类似于CloudKit的http层?

Record Layer已经通过record_metadata.proto作为扩展,向解析的protobuf记录添加所有必要的元数据。我们可能需要将这种逻辑从每种语言中提取出来并重新实现,这样我们就可以在所有地方使用相同的格式。目前我们只是定义了自己的元数据(作为一种便利),但这可能在将来发生变化。

来自论文和其他地方的笔记

Record Layer很复杂,我正在积极学习其结构和特性。这里的笔记旨在参考各种复杂性和考虑。其中一些正在实现,一些目前被忽略。

Record Layer层

确保描述符被验证

这在与文档中提到。有一个验证描述符的一般想法。这无疑对可以创建的表以及它们随时间的变化方式施加了约束。API应该考虑这一点

在调用eval(FDBRecordStoreBase, EvaluationContext, FDBRecord)之前必须调用validate(Descriptors.Descriptor),否则可能会发生坏事。

索引定义和维护

论文,第5节

相反,索引被禁用,重新索引作为描述在第6节中的后台作业进行。

这是否完全由客户端处理,或者这里有哪些行为需要考虑。

在表关系中使用主键

主键都在同一个索引中。论文第10.2节

例如,所有记录类型都有一个单一的扩展,因为CloudKit具有无类型的引用外键而没有“表”关联。默认情况下,选择特定类型的所有记录需要进行全扫描,跳过其他类型的记录,或者维护辅助索引。

对于不需要此共享扩展的客户,我们现在支持通过将类型特定的前缀添加到主键来为每种记录类型模拟单独的扩展。

很可能确保这作为一个配置选项或默认支持


lib.rs:

Vinyl是

use failure::Error;
use embly::prelude::*;
use vinyl_embly::query::field;
use vinyl_embly::DB;

use vinyl_core::proto::example::{Color, Flower, Order};

fn main() -> Result<(), Error> {
    let db = DB::new("flowers")?;

    let mut order = Order::new();
    order.order_id = 2;
    order.price = 20;

    let mut flower = Flower::new();
    flower.field_type = String::from("ROSE");
    flower.color = Color::RED;

    order.set_flower(flower);
    db.insert(order)?.wait()?;

    let orders: Vec<Order> = db
        .execute_query(
            field("price").less_than(50) &
            field("flower").matches(field("type").equals("ROSE")),
        )?
        .wait()?;

    db.delete_record::<Order, i32>(2)?.wait()?;

    Ok(())
}

依赖项

~7.5MB
~166K SLoC