Выпуск реляционно-графовой СУБД EdgeDB 4.0

Представлен релиз СУБД EdgeDB 4.0, реализующей реляционно-графовую модель данных и язык запросов EdgeQL, оптимизированные для работы со сложными иерархическими данными. Код написан на языках Python и Rust (парсер и критичные к производительности части) и распространяется под лицензией Apache 2.0. Проект развивается в форме надстройки над PostgreSQL. Клиентские библиотеки подготовлены для языков Python, Go, Rust. .NET, Elixir и TypeScript/Javascript. Предоставляется инструментарий командной строки для управления СУБД и интерактивного выполнения запросов (REPL).

Вместо модели данных на основе таблиц в EdgeDB применяется декларативная система на основе объектных типов. Вместо внешних ключей (foreign key) для определения связи между типами применяется связывание ссылками (один объект может использоваться как свойство другого объекта).

type Person { required name: str; } type Movie { required title: str; multi actors: Person; }

Для ускорения обработки запросов могут применяться индексы. Поддерживаются также такие возможности как строгая типизация свойств, ограничения значений свойств, вычисляемые свойства и хранимые процедуры. Из особенностей объектной схемы хранения EdgeDB, которая чем-то напоминает ORM, отмечается возможность смешивания схем, связывания свойств из разных объектов и интегрированная поддержка JSON.

Предоставляются встроенные инструменты для миграции схемы хранения – после изменения схемы, задаваемой в отдельном esdl-файле, достаточно выполнить команду “edgedb migration create” и СУБД проанализирует различия в схеме и в интерактивном режиме сгенерирует скрипт для перехода на новую схему. Автоматически отслеживается история изменения схемы.

Для формирования запросов поддерживается как язык запросов GraphQL, так и собственный язык EdgeDB, представляющий собой адаптацию SQL для иерархических данных. Вместо списков результаты запроса оформляются в структурированном виде, а вместо подзапросов и операций JOIN предоставляется возможность указания одного запроса EdgeQL в качестве выражения внутри другого запроса. Поддерживаются транзакции и циклы.

select Movie { title, actors: { name } } filter .title = “The Matrix” insert Movie { title := “The Matrix Resurrections”, actors := ( select Person filter .name in { ‘Keanu Reeves’, ‘Carrie-Anne Moss’, ‘Laurence Fishburne’ } ) }

В новой версии:

  • Добавлена поддержка полнотекстового поиска, реализованная через подключаемый модуль fts. Для превращения любого объекта в доступный для поиска документ следует использовать индекс fts::index, а для поиска определённой фразе среди проиндексированных документов предложена функция fts::search(). Результаты возвращаются в форме кортежей, содержащих найденный объект и его поисковый вес.
    Например: type Item { required available: bool { default := false; }; required name: str; required description: str; index fts::index on ( fts::with_options( .name, language := fts::Language.eng ) ); } with res := ( select fts::search(Item, ‘candy corn’, language := ‘eng’) ) select res.object {name, score := res.score} order by res.score desc;
  • Добавлен новый тип данных “multirange“, определяющий один или несколько диапазонов значений для представления прерывающихся интервалов. Нормализация перекрывающихся областей в заданных диапазонах осуществляется автоматически. С типом “multirange” могут работать все ранее доступные функции и операторы для обработки диапазонов, включая “overlaps” и “contains”. select multirange([range(8, 10)]) + range(1, 5) – range(3, 4);
  • Добавлена и включена по умолчанию поддержка аутентификации для ограничения доступа к GraphQL и EdgeQL поверх HTTP. Для запуска сервиса аутентификации, функционирующего отдельно от сервера БД, добавлено расширение “auth”, поддерживающее OAuth или вход по email и паролю
  • Добавлено расширение hmac, gen_salt и crypt для хэширования и шифрования.
    [[PRE
    select ext::pgcrypto::digest(‘encrypt this’, ‘sha1’);
  • Добавлено расширение pg_trgm c функциями для определения схожести строк.
  • Внесены оптимизации, позволившие повысить производительность. Потребление памяти на сервере снижено на 40%. Код парсера языка EdgeQL переписан на языке Rust.
  • В язык EdgeQL добавлена поддержка более привычного синтаксиса условных выражений (if … then .. else …). Добавлена поддержка условных
    DML для создания, обновления и удаления разных объектов на основе заданных условий. Добавлены функции to_bytes(), to_str(), enc::base64_encode и enc::base64_decode. В триггерах разрешено использование выражения “when”. select if count(Object) > 0 then ‘got data’ else ‘no data’; select (select User filter .name = ‘Alice’) ?? (insert User { name := ‘Alice’ }); select enc::base64_encode(b’hello’);
  • GraphQL​ добавлен новый способ передачи глобальных значений в запросы GraphQL – вместо использования отдельного поля предоставлена возможность передачи переменных на основе объекта __globals__.

Release. Ссылка here.