关系图DBMS EdgeDB 4.0发布

EdgeDB 4.0 DBMS 发布,它实现了关系图数据模型和 EdgeQL 查询语言,针对复杂的分层数据进行了优化。 该代码是用 Python 和 Rust(解析器和性能关键部分)编写的,并根据 Apache 2.0 许可证分发。 该项目正在作为 PostgreSQL 的附加组件进行开发。 客户端库是为 Python、Go、Rust 语言准备的。 .NET、Elixir 和 TypeScript/Javascript。 提供用于 DBMS 管理和交互式查询执行 (REPL) 的命令行工具。

EdgeDB 使用基于对象类型的声明性系统,而不是基于表的数据模型。 通过引用链接代替外键来定义类型之间的关系(一个对象可以用作另一个对象的属性)。

类型 Person { 必需名称:str; } 类型电影 { 必需的标题:str; 多参与者:人; }

索引可用于加速查询处理。 还支持强属性类型、属性值限制、计算属性和存储过程等功能。 EdgeDB 对象存储方案的功能有点让人想起 ORM,包括混合模式、链接不同对象的属性以及集成 JSON 支持的能力。

提供了用于存储模式迁移的内置工具 - 在更改单独的 esdl 文件中指定的模式后,只需运行“edgedb migration create”命令,DBMS 将分析模式中的差异并交互生成用于迁移到新架构。 自动跟踪架构更改的历史记录。

为了生成查询,支持 GraphQL 查询语言和专有的 EdgeDB 语言(这是针对分层数据的 SQL 的改编版)。 查询结果不是列表,而是以结构化方式格式化,并且您可以将一个 EdgeQL 查询指定为另一查询中的表达式,而不是使用子查询和 JOIN。 支持交易和周期。

select Movie { title, actor: { name } } filter .title = "The Matrix" insert Movie { title := "The Matrix Resurrections", Actor := ( select Person filter .name in { 'Keanu Reeves', 'Carrie-安妮·莫斯”、“劳伦斯·菲什伯恩” } ) }

在新版本中:

  • 添加了对全文搜索的支持,通过 fts 插件实现。 要将任何对象变成可搜索文档,您应该使用 fts::index 索引,并且建议使用 fts::search() 函数在索引文档中搜索特定短语。 结果以元组的形式返回,其中包含找到的对象及其搜索权重。 例如: type Item { required available: bool { default := false; }; 所需名称:str; 所需描述:str; 索引 fts::index on ( fts::with_options( .name, language := fts::Language.eng ) ); } with res := ( select fts::search(Ite​​m, 'candy corn', language := 'eng') ) select res.object {name, Score := res.score} order by res.score desc;
  • 添加了一种新的数据类型“multirange”,它定义一个或多个值范围来表示间歇间隔。 自动执行指定范围内重叠区域的标准化。 所有以前可用的处理范围函数和运算符都可以与“多范围”类型一起使用。 选择多范围([范围(8, 10)]) + 范围(1, 5) — 范围(3, 4);
  • 添加并默认启用身份验证支持,以限制通过 HTTP 访问 GraphQL 和 EdgeQL。
  • 为了启动与数据库实例分开运行的身份验证服务,添加了“auth”扩展,支持 OAuth 或使用电子邮件和密码登录。
  • 添加了 pgcrypto 扩展,提供用于散列和加密的 hmac、gen_salt 和 crypt 函数。 选择 ext::pgcrypto::digest('加密此', 'sha1');
  • 添加了 pg_trgm 扩展,其中包含用于确定字符串相似性的函数。
  • 已进行优化以提高性能。内存消耗 服务器 减少了 40%。EdgeQL 查询解析器代码已用 Rust 重写。
  • EdgeQL 添加了对更熟悉的条件语法的支持(if ... then .. else ...)。 提供使用条件DML根据指定条件创建、更新和删除各种对象的能力。 添加了函数 to_bytes()、to_str()、enc::base64_encode 和 enc::base64_decode。 触发器可以使用“when”表达式。 如果 count(Object) > 0,则选择“有数据”,否则选择“无数据”; 选择(选择用户过滤器.name = 'Alice')? (插入用户{名称:='爱丽丝'}); 选择 enc::base64_encode(b'hello');
  • 添加了一种将全局值传递给 GraphQL 查询的新方法 - 不再使用单独的字段,而是添加了基于 __globals__ 对象传递变量的功能。

    来源: opennet.ru

添加评论