U prezantua versioni i DBMS EdgeDB 4.0, i cili implementon modelin e të dhënave lidhore-grafik dhe gjuhën e pyetjeve EdgeQL, të optimizuar për punën me të dhëna komplekse hierarkike. Kodi është shkruar në gjuhët Python dhe Rust (analizuesi dhe pjesët kritike për performancën) dhe shpërndahet nën licencën Apache 2.0. Projekti zhvillohet si një shtesë mbi PostgreSQL. Bibliotekat e klientëve janë përgatitur për gjuhët Python, Go, Rust, .NET, Elixir dhe TypeScript/Javascript. Ofron një mjet komandash për menaxhimin e DBMS dhe ekzekutimin interaktiv të pyetjeve (REPL).
Në vend të modelit të të dhënave të bazuar në tabela, EdgeDB përdor një sistem deklarativ të bazuar në tipe objektesh. Në vend të çelësave të jashtëm (foreign key) për të përcaktuar lidhjet mes tipeve, përdoret lidhja me referenca (një objekt mund të përdoret si një pronë e një objekti tjetër).
type Person { required name: str; } type Movie { required title: str; multi actors: Person; }
Për të përshpejtuar përpunimin e pyetjeve, mund të përdoren indekse. Nga këto mundësi, mbështeten gjithashtu tipizimi strikt i pronave, kufizimet e vlerave të pronave, pronat e llogaritura dhe procedurat e ruajtura. Një tipar i veçantë i skemës objektuale të ruajtjes në EdgeDB, e cila përshtatet me ORM-në, është mundësia për të përzier skema, lidhjen e pronave nga objekte të ndryshme dhe mbështetje e integruar për JSON.
Ofron mjete të integruara për migrimin e skemës së ruajtjes - pas ndryshimit të skemës, të përcaktuar në një skedar të veçantë esdl, mjafton të ekzekutoni komandën "edgedb migration create" dhe SGBD analizojnë diferencialet në skemë dhe në mënyrë interaktive gjeneron një skript për kalimin në skemën e re. Historia e ndryshimit të skemës ndiqet automatikisht.
Për formimin e pyetjeve, mbështetet si gjuhë pyetjesh GraphQL, ashtu edhe gjuha e saj EdgeDB, e cila është një përshtatje e SQL për të dhënat hierarkike. Në vend të LISTAVE, rezultatet e pyetjeve paraqiten në format të strukturuar, ndërsa në vend të nënpyetjeve dhe operacioneve JOIN ofrohet mundësia e specifikimit të një kërkese EdgeQL si një shprehje brenda një kërkese tjetër. Mbështeten transaksionet dhe ciklet.
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â } ) }
NĂ« versionin e ri:
- Shtuar mbĂ«shtetje pĂ«r kĂ«rkimin me tekst tĂ« plotĂ«, i implementuar pĂ«rmes modulit tĂ« ngarkueshĂ«m fts. PĂ«r tĂ« shndĂ«rruar çdo objekt nĂ« njĂ« dokument tĂ« kĂ«rkueshĂ«m, duhet tĂ« pĂ«rdoret indeksi fts::index, ndĂ«rsa pĂ«r tĂ« kĂ«rkuar njĂ« frazĂ« tĂ« caktuar ndĂ«r dokumentet e indekzuara, Ă«shtĂ« propozuar funksioni fts::search(). Rezultatet kthehen si tuple, tĂ« cilat pĂ«rmbajnĂ« objektin e gjetur dhe peshĂ«n e tij tĂ« kĂ«rkimit. PĂ«r shembull: 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 ) ); } me res := ( select fts::search(Item, âcandy cornâ, language := âengâ) ) select res.object {name, score := res.score} order by res.score desc;
- Shtuar njĂ« tip tĂ« ri tĂ« tĂ« dhĂ«nave «multirange», pĂ«rcaktuar pĂ«r njĂ« ose mĂ« shumĂ« intervale vlerash pĂ«r tĂ« pĂ«rfaqĂ«suar intervalet e prera. Normalizimi i fushave qĂ« mbivendosen nĂ« intervalet e pĂ«rcaktuara kryhet automatikisht. Me tipin «multirange» mund tĂ« punojmĂ« me tĂ« gjitha funksionet dhe operatorĂ«t e mĂ«parshĂ«m tĂ« disponueshĂ«m pĂ«r trajtimin e intervaleve. select multirange([range(8, 10)]) + range(1, 5) â range(3, 4);
- Shtuar dhe aktive në mënyrë të parazgjedhur mbështetje për autentifikimin për të kufizuar qasjen në GraphQL dhe EdgeQL mbi HTTP.
- Për të nisur shërbimin e autentifikimit, që funksionon ndarë nga instanca e DB, është shtuar zgjerimi «auth», i cili mbështet OAuth ose hyrjen përmes email-it dhe fjalëkalimit.
- Shtuar zgjerimin pgcrypto, i cili ofron funksionet hmac, gen_salt dhe crypt pĂ«r hashim dhe enkriptim. select ext::pgcrypto::digest(âencrypt thisâ, âsha1â);
- Shtuar zgjerimin pg_trgm me funksione për të përcaktuar ngjashmërinë e vargjeve.
- Bëhen optimizime që rrisin performancën. Konsumi i memories është server reduktuar me 40%. Kodi i analizuesit të pyetjeve EdgeQL është shkruar përsëri në gjuhën Rust.
- Në gjuhën EdgeQL është shtuar mbështetje për një sintaksë më të njohur të shprehjeve kushtetuese (nëse... atëherë... tjetër... ). është siguruar mundësia e përdorimit të DML kushtetues për krijimin, përditësimin dhe fshirjen e objekteve të ndryshme në bazë të kushteve të caktuara. Janë shtuar funksionet to_bytes(), to_str(), enc::base64_encode dhe enc::base64_decode. Në trigger-at është lejuar përdorimi i shprehjes "kur". select if count(Object) > 0 then 'kemi të dhëna' else 'nuk kemi të dhëna'; select (select User filter .name = 'Alice') ?? (insert User { name := 'Alice' }); select enc::base64_encode(b'hello');
- ĂshtĂ« shtuar njĂ« mĂ«nyrĂ« e re pĂ«r tĂ« transmetuar vlera globale nĂ« kĂ«rkesat GraphQL - nĂ« vend tĂ« pĂ«rdorimit tĂ« njĂ« fushe tĂ« veçantĂ«, Ă«shtĂ« siguruar mundĂ«sia e transmetimit tĂ« variablave mbi bazĂ«n e objektit __globals__.
Burimi: opennet.ru
