Издание на релационната графова СУБД 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“, определящ един или няколко диапазона стойности за представяне на прекъснати интервали. Нормализацията на overlapping района в зададените диапазони се извършва автоматично. С тип „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