Byl uveden na trh release databázového systému EdgeDB 4.0, který realizuje relačně-grafový model dat a jazyk dotazů EdgeQL, optimalizované pro práci se složitými hierarchickými daty. Kód je napsán v jazycích Python a Rust (parser a výkonové části) a je distribuován pod licencí Apache 2.0. Projekt se vyvíjí jako nadstavba nad PostgreSQL. Klientské knihovny jsou připraveny pro jazyky Python, Go, Rust, .NET, Elixir a TypeScript/Javascript. Je poskytován nástroj příkazového řádku pro správu databáze a interaktivní vykonávání dotazů (REPL).
Místo modelu dat založeného na tabulkách používá EdgeDB deklarativní systém založený na objektových typech. Místo cizích klíčů (foreign key) pro určení vazeb mezi typy se používá propojování odkazy (jeden objekt může být použit jako vlastnost jiného objektu).
type Person { required name: str; } type Movie { required title: str; multi 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 formulaci dotazů je podporován jak jazyk dotazů GraphQL, tak vlastní jazyk EdgeDB, který je adaptací SQL pro hierarchická data. Místo seznamů jsou výsledky dotazů prezentovány ve strukturované podobě a místo poddotazů a operací JOIN je možné určit jeden dotaz EdgeQL jako výraz uvnitř jiného dotazu. Podporovány jsou 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’ } ) }
V nové verzi:
- Byla přidána podpora fulltextového vyhledávání, realizovaná prostřednictvím pluginového modulu fts. Pro přeměnu jakéhokoli objektu na vyhledávatelný dokument je třeba použít index fts::index, a pro hledání určité fráze mezi indexovanými dokumenty byla navržena funkce fts::search(). Výsledky se vracejí ve formě n-tic, které obsahují nalezený objekt a jeho vyhledávací váhu. Například: 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;
- Byl přidán nový datový typ „multirange“, který definuje jeden nebo více rozsahů hodnot pro reprezentaci přerušených intervalů. Normalizace překrývajících se oblastí v daných rozsazích probíhá automaticky. S typem „multirange“ mohou pracovat všechny dříve dostupné funkce a operátory pro zpracování rozsahů. select multirange([range(8, 10)]) + range(1, 5) — range(3, 4);
- Byla přidána a ve výchozím nastavení zapnuta podpora autentizace pro omezení přístupu k GraphQL a EdgeQL přes HTTP.
- Pro spuštění autentizačního servisu, který funguje odděleně od instance DB, bylo přidáno rozšíření „auth“, které podporuje OAuth nebo přihlášení přes email a heslo.
- Bylo přidáno rozšíření pgcrypto, které poskytuje funkce hmac, gen_salt a crypt pro hashování a šifrování. select ext::pgcrypto::digest(‘encrypt this’, ‘sha1’);
- Bylo přidáno rozšíření pg_trgm s funkcemi pro určení podobnosti řetězců.
- Byly provedeny optimalizace, které umožnily zvýšení výkonu. Spotřeba paměti byla serveru snížena o 40 %. Kód parseru dotazů EdgeQL byl přepsán v jazyce Rust.
- Do jazyka EdgeQL byla přidána podpora pro běžnější syntaxi podmínkových výrazů (if … then .. else …). Byla poskytnuta možnost využití podmínkového DML pro vytváření, aktualizaci a mazání různých objektů na základě zadaných podmínek. Přidány byly funkce to_bytes(), to_str(), enc::base64_encode a enc::base64_decode. V triggerách bylo povoleno použití výrazu „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’);
- Byl přidán nový způsob předávání globálních hodnot do dotazů GraphQL — místo použití samostatného pole byla poskytnuta možnost předat proměnné na základě objektu __globals__.
Zdroj: opennet.ru
