Доступен релиз СУБД EdgeDB 5.0, реализующей реляционно-графовую модель данных и язык запросов EdgeQL, оптимизированные для работы со сложными иерархическими данными. Проект развивается в форме надстройки над PostgreSQL, код которой написан на языках Python и Rust (парсер и критичные к производительности части), и распространяется под лицензией Apache 2.0. Клиентские библиотеки подготовлены для языков 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’ } ) }
В новой версии:
- Добавлена поддержка ветвления (“branching”), позволяющая использовать при работе с данными и схемами концепцию веток, применяемую в системах управления версиями. Вместо термина “база данных” в новом выпуске предложено понятие “ветка” (branch), а команды “create database” и “drop database” объявлены устаревшими и вместо них рекомендовано использовать новые команды “create empty branch” и “drop branch”. Помимо пустых веток при помощи команд “create schema branch” и “create data branch” можно создавать ответвления от существующих веток и БД, копируя из них схему хранения и данные.
С практической стороны поддержка веток позволяет синхронизировать данные с кодом, используемым для их обработки, сохранив при этом совместимость со старым кодом. Например, после обновления кода можно привязать к нему новую ветку данных, учитывающую внесённые в коде изменение схемы хранения. Рассмотренную функциональность удобно использовать для упрощения разработки и тестирования новых версий ПО, после готовности которых достаточно переключиться на уже протестированную ветку.
- В расширение pgvector, применяемое для эффективного хранения и запроса векторов, добавлен новый тип индексов HNSW (Hierarchical Navigable Small Worlds), который, по аналогии с индексом IVFFlat, доступен в трёх вариантах: ext::pgvector::hnsw_euclidean, ext::pgvector::hnsw_ip и ext::pgvector::hnsw_cosine. Кроме того, в pgvector расширены возможности по тонкой настройке индексов через объект ext::pgvector::Config.
- Добавлены дополнительные возможности аутентификации. В расширении auth реализована поддержка беспарольных схем аутентификации WebAuthn (Passkeys) и “magic links” (на базе email). Добавлена поддержка использования платформ Slack и Discord в качестве OAuth-провайдеров.
- Внесены оптимизации производительности. В реализации кэша с результатами компиляции запросов обеспечено сохранение состояния между перезапусками и добавлена автоматическая перекомпиляция после миграции. Повышена скорость работы с большими схемами хранения.
- В языке запросов EdgeQL в выражении “for” разрешено не указывать ключевое слово “union” в базовых запросах, в которых используются выражения insert, update или delete.
- Добавлена команда vacuum() для чистки, оптимизации и упаковки содержимого БД.
- Разрешено преобразование данных между типом bytes и типами int16, int32, int64 и uuid, используя функции to_bytes(), to_uuid() и to_int*().
- Добавлена возможность закрытия всех соединений к БД после выполнения операции “drop database”.