太微数据建模方案

林一二2021年12月22日 13:58

现状

太微里每个条目都是一个 JSON 对象,没有 JSONSchema 显式地对它所带有的字段作限制,而且目前对字段的假设都隐含在利用数据的代码里。

这导致第三方插件开发者不知道可以复用哪些数据,想知道只能去看代码或者找例子; 也导致社区缺乏对数据的共识,让不同插件之间的互操作性难以保证,增加了用户让多个插件联动起来的成本、图可视化时整合数据源的成本。

可参考的实现

Rust 使用 trait 系统来管理可复用的行为和数据结构(trait:定义共享的行为),例如:

结构体 NewsArticle 用于存放发生于世界各地的新闻故事,而结构体 Tweet 最多只能存放 280 个字符的内容,以及像是否转推或是否是对推友的回复这样的元数据。

trait NewsArticle {
    const headline: String;
    const location: String;
    const author: String;
    const content: String;
}

trait Tweet {
    const username: String;
    const content: String;
    const reply: bool;
    const retweet: bool;
}

pub struct ATiddler {}

impl NewsArticle for ATiddler {
}

impl Tweet for ATiddler {
}

修改过的示例 10-13:在 ATiddler 类型上实现 NewsArticle 和 Tweet trait

对太微的启发

Rust 中可以组合多个 trait 到一个数据结构体上,在太微里我们则可以结合多个标签到一个条目上。我们或许可以让标签不仅是一个索引,同时也让它是一个 JSONSchema,定义了加了它的条目上将要有那些字段。

这些 Schema 可以就填写在标签条目的字段里。