Megjelent az EdgeDB 2.0 alapú adatbázis-kezelő rendszer, amely relációs-grafikus adatmodellt és EdgeQL lekérdező nyelvet valósít meg, optimalizálva a bonyolult hierarchikus adatok kezelésére. A kód Python és Rust nyelveken íródott (a parser és a teljesítménykritikus részek) és az Apache 2.0 licenc alatt terjesztik. A projekt a PostgreSQL fölé építkezik. Kliensek könyvtárai elérhetők Python, Go, Rust és TypeScript/Javascript nyelveken. Parancssori eszközök állnak rendelkezésre az adatbázis kezelésére és lekérdezések interaktív 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 property name -> str; } type Movie { required property title -> str; multi link 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.
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 } );
Az új verzióban:
- Beépített webes felület került hozzáadásra az adatbázis adminisztrálásához, amely lehetővé teszi az adatok megtekintését és szerkesztését, EdgeQL lekérdezések végrehajtását, valamint a használt tárolási séma elemzését. A felület az "edgedb ui" paranccsal indítható, és elérhető a localhost elérési úton.

- Megvalósításra került a "GROUP" kifejezés, amely lehetővé teszi az adatok szekciókba állítását és aggregálását, valamint az adatok csoportosítását tetszőleges EdgeQL kifejezések alapján, a SELECT utasítás csoportosításához hasonlóan.
- Lehetőség nyílik az objektumok szintű hozzáférés kezelésére. A hozzáférési szabályok a tárolási séma szintjén kerülnek meghatározásra, és lehetővé teszik bizonyos objektumkészletek használatának korlátozását a lekérdezések, beszúrások, törlések és frissítések során. Például hozzáadhatunk egy szabályt, amely csak a szerzőnek engedélyezi a közzététel frissítését.
- Bevezetésre került a globális változók használatának lehetősége a tárolási sémában. Az aktuális felhasználóhoz való kötéshez új globális változó került javaslatra: current_user.
- Bevezetésre került a tartományértékeket meghatározó típusok támogatása (range).
- Hivatalos klienskönyvtár készült Rust nyelvhez.
- Stabilizálva lett az EdgeDB bináris protokollja, amely lehetővé teszi több különböző munkamenet egyidejű kezelését egyetlen hálózati kapcsolat keretein belül, HTTP-n keresztüli áttolást, globális változók használatát és helyi állapotokat.
- Hozzáadva a socket-alapú aktiválás támogatása, amely lehetővé teszi, hogy a szerverkezelő ne maradjon a memóriában, és csak a kapcsolatfelvételi kísérletkor induljon el (hasznos a fejlesztői rendszerek erőforrásainak megtakarításához).
Forrás: opennet.ru

