Достъпен е първият стабилен релиз на СУБД EdgeDB, който представлява надстройка над PostgreSQL с реализация на релационно-графовата модел на данни и езика за запитвания EdgeQL, оптимизирани за работа със сложни йерархични данни. Кодът е написан на езиците Python и Rust и се разпространява под лиценцията Apache 2.0. Клиентски библиотеки са подготвени за езиците Python, Go, Rust и TypeScript/Javascript. Предоставя се инструментариум на командния ред за управление на СУБД и интерактивно изпълнение на запитвания (REPL).
Вместо модел на данни, базиран на таблици, в EdgeDB се прилага декларативна система, основана на обектни типове. Вместо външни ключове (foreign key) за определяне на връзките между типовете се използва свързване чрез референции (един обект може да се използва като свойство на друг обект). type Person { required property name -> str; } type Movie { required property title -> str; multi link 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' } ) } for number in {0, 1, 2, 3} union ( select { number, number + 0.5 } );
Източник: opennet.ru
