RefineDB:一款强类型文档数据库
项目介绍
RefineDB 是一款运行在任何事务性键值存储上的强类型文档数据库。它旨在提供比传统 SQL 数据库更高的可扩展性,比 NoSQL 数据库更强的结构化支持,以及比现有数据库更强的静态类型检查。RefineDB 的设计初衷是为了满足开发者对数据库的更高要求,使其成为开发者自己愿意使用的数据库。
目前,RefineDB 支持以下后端:
- FoundationDB:适用于分布式部署。
- SQLite:适用于单机部署。
- 一个简单的内存键值存储,用于 Web 演示。
你可以在 Web Playground 上尝试 RefineDB!
注意:目前尚未准备好用于生产环境。
项目技术分析
架构设计
RefineDB 的架构设计非常独特,它将数据库的查询执行视为数据流图的简化过程。核心组件包括 TreeWalker VM 和 RefineAsm。TreeWalker VM 是一个大规模并发的数据流虚拟机,用于运行查询;而 RefineAsm 则是查询图的文本表示,提供了一些语法糖以简化编写过程。
类型系统和模式定义
RefineDB 的类型系统非常强大,支持多种基本类型(如 int64
、double
、string
、bytes
和 set<T>
),并且可以通过组合这些基本类型来定义复杂的模式。例如,一个简单的博客模式可以定义如下:
type SiteConfig {
site_name: string,
registration_open: int64,
}
type BlogPost {
@primary
id: string,
author_email: string,
author_name: string,
title: string,
content: string,
access_time: AccessTime,
}
type AccessTime {
create_time: int64,
update_time: int64,
}
export SiteConfig site_config;
export set<BlogPost> posts;
查询语言
RefineDB 的查询语言 RefineAsm 非常灵活,允许开发者以数据流图的形式编写查询。例如,向上述博客模式中添加一篇新文章的 RefineAsm 脚本如下:
type PostMap = map {
id: string,
author_email: string,
author_name: string,
title: string,
content: string,
access_time: map {
create_time: int64,
update_time: int64,
},
};
export graph add_post(root: schema, post: PostMap) {
s_insert root.posts $ call(build_post) [post];
}
graph build_post(post: PostMap): BlogPost {
return build_table(BlogPost)
$ m_insert(access_time) (build_table(AccessTime) post.access_time) post;
}
存储计划和模式迁移
RefineDB 通过分离模式和存储计划,使得模式变更变得非常快速。在迁移过程中,新增字段会自动分配新的存储键,而删除的字段则不会从存储中自动删除。这种设计允许多个模式版本共存,客户端可以选择使用哪个模式版本,从而防止意外的数据删除。
项目及技术应用场景
RefineDB 适用于需要高度结构化和强类型检查的应用场景,特别是在以下领域:
- 分布式系统:RefineDB 支持 FoundationDB 作为后端,非常适合需要高可扩展性和分布式部署的应用。
- 单机应用:对于不需要分布式部署的应用,RefineDB 支持 SQLite 作为后端,提供了轻量级的解决方案。
- Web 应用:RefineDB 的 Web Playground 提供了一个简单易用的在线演示环境,适合开发者快速上手和测试。
项目特点
- 强类型检查:RefineDB 提供了比现有数据库更强的静态类型检查,减少了运行时错误的可能性。
- 灵活的模式定义:支持多种基本类型和复杂类型的组合,使得模式定义非常灵活。
- 高效的查询执行:通过 TreeWalker VM 和 RefineAsm,查询执行效率高且易于编写。
- 快速的模式迁移:通过分离模式和存储计划,模式变更非常快速,且支持多个版本共存。
- 多后端支持:支持 FoundationDB、SQLite 和内存键值存储,适用于不同的部署场景。
RefineDB 是一个正在快速发展中的项目,虽然目前尚未准备好用于生产环境,但其独特的设计和强大的功能已经吸引了众多开发者的关注。如果你正在寻找一款兼具可扩展性、结构化和强类型检查的数据库,RefineDB 绝对值得你一试!