Megjelent az EdgeDB 4.0 adatbázis-kezelő rendszer, amely relációs-grafikus adatmodell és EdgeQL lekérdező nyelvet valósít meg, optimalizálva a komplex hierarchikus adatok kezelésére. A kód Python és Rust nyelveken készült (parser és a teljesítmény szempontjából kritikus részek), és az Apache 2.0 licenc alatt érhető el. A projekt a PostgreSQL köré épül. Ügyfélkönyvtárak érhetők el Python, Go, Rust, .NET, Elixir és TypeScript/Javascript nyelveken. A parancssori eszközök biztosítanak lehetőséget az adatbázis kezelésére és interaktív lekérdezések végrehajtására (REPL).
Az EdgeDB adatmodellt nem táblák alapján, hanem deklaratív rendszer alapján építik fel, amely objektumtípusokkal dolgozik. A típusok közötti kapcsolatok meghatározására nem használnak külső kulcsokat (foreign key), hanem hivatkozásokkal történik a kapcsolódás (egy objektum használható másik objektum jellemzőjeként).
type Person { required name: str; } type Movie { required title: str; multi actors: Person; }
A lekérdezések feldolgozásának felgyorsítására indexek alkalmazhatók. Továbbá támogatottak a szigorú típusellenőrzés, a jellemzők értékeinek korlátozása, a számított jellemzők és a tárolt eljárások. Az EdgeDB objektum-tárolási sémájában, amely hasonlít az ORM-re, kiemelkedik a sémák keverésének, különböző objektumok jellemzőinek összekapcsolásának és a JSON integrált támogatásának lehetősége.
Beépített eszközök állnak rendelkezésre a tárolási séma migrálására — a sémában végrehajtott változtatások után, amelyeket egy külön esdl-fájlban adtak meg, elegendő végrehajtani az „edgedb migration create” parancsot, és az adatbázis elemzi a sémában lévő eltéréseket, interaktív módban generálja az új sémára való áttéréshez szükséges szkriptet. Automatikusan nyomon követi a sémaváltoztatások történetét.
Lekérdezések kialakításához támogatott a GraphQL lekérdező nyelv, valamint az EdgeDB saját nyelve, amely az SQL adaptációja hierarchikus adatokhoz. Az eredményeket nem listákban, hanem strukturált formában szolgáltatják, és a beágyazott lekérdezések és JOIN műveletek helyett lehetőség van egy EdgeQL lekérdezés megadására egy másik lekérdezés kifejezéseként. Támogatottak a tranzakciók és ciklusok.
válasszon Film { cím, színészek: { név } } szűrő .cím = „A Mátrix” beszúrás Film { cím := „A Mátrix Feltámadások”, színészek := ( válasszon Ember szűrő .név a { ‘Keanu Reeves’, ‘Carrie-Anne Moss’, ‘Laurence Fishburne’ } ) }
Az új verzióban:
- Teljes szöveg keresés támogatása került bevezetésre, amelyet az fts modulon keresztül valósítottak meg. Bármely objektum kereshető dokumentummá alakításához az fts::index indexet kell használni, míg egy adott kifejezés keresésére az indexelt dokumentumok között megoldást nyújt az fts::search() függvény. Az eredmények egy tuple formájában térnek vissza, amelyek tartalmazzák a megtalált objektumot és annak keresési súlyát. Például: type Cikk { kötelező elérhető: bool { alapértelmezett := false; }; kötelező név: str; kötelező leírás: str; index fts::index on ( fts::with_options( .név, nyelv := fts::Language.eng ) ); } res := ( válasszon fts::search(Cikk, ‘candy corn’, nyelv := ‘eng’) ) válassza res.object {név, pontszám := res.pontszám} rendezés res.pontszám csökkenő;
- Új multirange adattípus került bevezetésre, amely egy vagy több értéktartományt határoz meg megszakított intervallumok képviseletére. A megadott tartományokban az átfedő területek normalizálása automatikusan történik. A „multirange” típussal az összes korábban elérhető függvény és operátor működhet a tartományok kezelésére. válasszon multirange([range(8, 10)]) + range(1, 5) — range(3, 4);
- Az autentikációs támogatás hozzáadása és alapértelmezés szerint bekapcsolása a GraphQL és EdgeQL HTTP feletti hozzáférés korlátozása érdekében.
- Az adatbázis példánytól függetlenül működő autentikációs szolgáltatás indításához megjelent az „auth” kiterjesztés, amely támogatja az OAuth-ot vagy az e-mail/jeszkönyv belépést.
- Bevezetésre került a pgcrypto kiterjesztés, amely hmac, gen_salt és crypt függvényeket biztosít a hashing és titkosításhoz. válasszon ext::pgcrypto::digest(‘titkosítsd ezt’, ‘sha1’);
- Bevezetésre került a pg_trgm kiterjesztés, amely függvényeket biztosít a sztringek hasonlóságának meghatározására.
- Optimalizálások történtek, amelyek javították a teljesítményt. A memóriafelhasználás szerveren 40%-kal csökkent. Az EdgeQL lekérdezések parszoló kódját Rust nyelven átírták.
- Az EdgeQL nyelvhez hozzáadódott a szoftveres kifejezések (if … then .. else …) megszokottabb szintaxisának támogatása. Lehetővé vált a feltételes DML használata különböző objektumok létrehozásához, frissítéséhez és törléséhez a megadott feltételek alapján. Új funkciók kerültek bevezetésre, mint a to_bytes(), to_str(), enc::base64_encode és enc::base64_decode. A triggereknél lehetővé vált a „when” kifejezés használata. 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’);
- Új módszer került bevezetésre a globális értékek GraphQL lekérésekbe történő átadására – az elkülönült mezők használata helyett lehetőség nyílik objektum alapú __globals__ változók átadására.
Forrás: opennet.ru
