Пускането на релационно-графичната СУБД 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“ могат да работят всички вече налични функции и оператори за обработка на диапазони. select multirange([range(8, 10)]) + range(1, 5) — range(3, 4);
  • Добавена е и включена по подразбиране поддръжка на автентификация за ограничаване на достъпа до GraphQL и EdgeQL върху HTTP.
  • За стартиране на услугата за автентификация, функционираща отделно от инстанцията на БД, е добавено разширение „auth“, което поддържа OAuth или вход чрез имейл и парола.
  • Добавено е разширение pgcrypto, предоставящо функции hmac, gen_salt и crypt за хеширане и шифроване. select ext::pgcrypto::digest(‘encrypt this’, ‘sha1’);
  • Добавено е разширение pg_trgm с функции за определяне на сходство между низове.
  • Внесени са оптимизации, които позволиха да се подобри производителността. Потреблението на памет е сървър намалено с 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 — вместо да се използва отделно поле, предоставена е възможност за предаване на променливи на базата на обекта __globals__.

    Източник: opennet.ru
Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри 🔥 Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри | ProHoster