Je k dispozici vydání databáze EdgeDB 5.0, která implementuje relačně-grafový model dat a dotazovací jazyk EdgeQL, optimalizované pro práci se složitými hierarchickými daty. Projekt se vyvíjí jako nadstavba nad PostgreSQL, přičemž kód je napsán v Pythonu a Rustu (parser a výkonné části) a je distribuován pod licencí Apache 2.0. Klientské knihovny jsou připraveny pro jazyky Python, Go, Rust, .NET, Elixir a TypeScript/Javascript. Je k dispozici nástroj příkazového řádku pro správu databáze a interaktivní provádě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; }
Podporují se takové funkce jako přísná typizace vlastností, omezení hodnot vlastností, vypočítávané vlastnosti a uložené procedury. Mezi rysy objektového schématu ukládání EdgeDB, které připomíná ORM, lze zmínit možnost mísení schémat, propojování vlastností z různých objektů a integrovanou podporu JSON. Pro urychlení zpracování dotazů mohou být použity indexy.
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 vytváření dotazů se podporuje jazyk GraphQL a vlastní jazyk EdgeDB, což je adaptace SQL pro hierarchická data. Místo seznamů jsou výsledky dotazu strukturovány a místo poddotazů a operací JOIN se nabízí možnost zahrnout jeden dotaz EdgeQL jako výraz uvnitř jiného dotazu. Podporují se transakce a smyčky.
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 pro větvení („branching“), která umožňuje používat koncept větví při práci s daty a schématy, tak jak je to běžné v systémech správy verzí. Místo termínu „databáze“ se v novém vydání navrhuje pojem „větev“ (branch) a příkazy „create database“ a „drop database“ jsou prohlášeny za zastaralé, místo nich se doporučuje používat nové příkazy „create empty branch“ a „drop branch“. Kromě prázdných větví lze pomocí příkazů „create schema branch“ a „create data branch“ vytvářet odvozené větve ze stávajících větví a databází, přičemž se kopírují schéma ukládání a data.
Z praktického hlediska podpora větví umožňuje synchronizaci dat s kódem použitým pro jejich zpracování, přičemž se zachovává kompatibilita se starým kódem. Například po aktualizaci kódu lze k němu přiřadit novou datovou větev, která zohledňuje změny v kódu týkající se struktury ukládání. Tuto funkčnost je vhodné využít k usnadnění vývoje a testování nových verzí softwaru, po jejichž dokončení stačí přepnout na již otestovanou větev.
- Do rozšíření pgvector, používaného pro efektivní ukládání a dotazování vektorů, byl přidán nový typ indexů HNSW (Hierarchical Navigable Small Worlds), který je, obdobně jako index IVFFlat, dostupný ve třech variantách: ext::pgvector::hnsw_euclidean, ext::pgvector::hnsw_ip a ext::pgvector::hnsw_cosine. Kromě toho bylo v pgvector rozšířeno nastavení indexů prostřednictvím objektu ext::pgvector::Config.
- Byly přidány další možnosti autentizace. V rozšíření auth byla implementována podpora bezheslových schémat autentizace WebAuthn (Passkeys) a „magických odkazů“ (na základě e-mailu). Byla přidána podpora použití platforem Slack a Discord jako poskytovatelů OAuth.
- Byla provedena optimalizace výkonu. V implementaci cache s výsledky kompilace dotazů byla zajištěna konzistence mezi restartováním a přidána automatická rekopilace po migraci. Zrychlil se proces práce s velkými datovými schématy.
- V jazyce dotazů EdgeQL bylo ve výrazu „for“ povoleno vynechat klíčové slovo „union“ v základních dotazech, ve kterých se používají výrazy insert, update nebo delete.
- Byla přidána příkaz vacuum() pro čištění, optimalizaci a balení obsahu databáze.
- Bylo povoleno převádění dat mezi typem bytes a typy int16, int32, int64 a uuid pomocí funkcí to_bytes(), to_uuid() a to_int*().
- Byla přidána možnost uzavření všech připojení k databázi po provedení operace „drop database“.
Zdroj: opennet.ru
