Je dostupná první stabilní verze databázového systému EdgeDB, který představuje rozšíření nad PostgreSQL s implementací relačně-grafového modelu dat a jazyka dotazů EdgeQL, optimalizovaných pro práci se složitými hierarchickými daty. Kód je napsán v jazycích Python a Rust a je šířen pod licencí Apache 2.0. Klientské knihovny jsou připraveny pro jazyky Python, Go, Rust a TypeScript/Javascript. Je poskytováno nástroje příkazového řádku pro správu databáze a interaktivní vykonávání dotazů (REPL).
Místo tabulkové modelu dat používá EdgeDB deklarativní systém založený na objektových typech. Místo cizích klíčů (foreign key) pro určení vazby mezi typy se používá vazba pomocí odkazů (jeden objekt může být použit jako vlastnost jiného objektu). type Person { required property name -> str; } type Movie { required property title -> str; multi link actors -> Person; }
Pro zrychlení zpracování dotazů mohou být použity indexy. Také jsou podporovány možnosti, jako je přísné typování vlastností, omezení hodnot vlastností, vypočítávané vlastnosti a uložené procedury. Zvláštností objektového schématu ukládání EdgeDB, které se poněkud podobá ORM, je možnost mixování schémat, propojení vlastností z různých objektů a integrovaná podpora JSON.
Jsou poskytovány integrované nástroje pro migraci schématu ukládání — po změně schématu definovaného v samostatném esdl souboru stačí provést příkaz „edgedb migration create“ a databáze analyzuje rozdíly v schématu a v interaktivním režimu vygeneruje skript pro přechod na nové schéma. Historie změn schématu je automaticky sledována.
Pro tvorbu dotazů je podporován jak jazyk dotazů GraphQL, tak vlastní jazyk EdgeDB, který představuje adaptaci SQL pro hierarchická data. Místo seznamů jsou výsledky dotazu strukturovány, a místo poddotazů a operací JOIN je možné uvést jeden dotaz EdgeQL jako výraz uvnitř jiného dotazu. Jsou podporovány transakce a cykly. 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 } );
Zdroj: opennet.ru
