Достъпен е първият стабилен релиз на СУБД EdgeDB, която представлява надстройка над PostgreSQL с реализация на релационно-графовата модел на данни и езика за заявки EdgeQL, оптимизирани за работа със сложни йерархични данни. Кодът е написан на езиците Python и Rust и се разпространява под лиценция Apache 2.0. Клиентските библиотеки са подготвени за езиците Python, Go, Rust и TypeScript/Javascript. Предоставя се инструментарий за команден ред за управление на СУБД и интерактивно изпълнение на заявки (REPL).
Вместо модел на данни, базиран на таблици, в EdgeDB се прилага декларативна система, основана на обектни типове. Вместо външни ключове за определяне на връзките между типовете се използва свързване чрез референции (един обект може да се използва като свойство на друг обект). 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
