Rilindja e EdgeDB 4.0, një DBMS që implementon modelin relacional-grafik të të dhënave dhe gjuhën e pyetjeve EdgeQL, e optimizuar për të punuar me të dhëna hierarkike komplekse. Kodi është shkruar në gjuhët Python dhe Rust (parseri 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 klient janë përgatitur për gjuhët Python, Go, Rust, .NET, Elixir dhe TypeScript/Javascript. Ofron një mjet komande për menaxhimin e DBMS dhe ekzekutimin interaktiv të pyetjeve (REPL).
Në EdgeDB, në vend të modelit të të dhënave të bazuara në tabela, përdoret një sistem deklarativ i bazuar në tipa objektesh. Në vend të çelësave të jashtëm (foreign key) për të përkufizuar lidhjet mes tipave, është e mundur të lidhen përmes lidhjeve (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; }
Indekset mund të përdoren për të përshpejtuar përpunimin e kërkesave. Mbështeten gjithashtu mundësi të tilla si tipizimi i rigoroz i pronave, kufizimet e vlerave të pronave, pronat e llogaritur dhe procedurat e ruajtura. Një nga veçoritë e skemës objektike të ruajtjes EdgeDB, e cila ngjan disi me ORM, është mundësia e përzierjes së skemave, lidhjes së pronave nga objekte të ndryshme dhe mbështetje e integruar për JSON.
Ofrohen mjete tĂ« integruara pĂ«r migrimin e skemĂ«s sĂ« ruajtjes â pas ndryshimit tĂ« skemĂ«s, tĂ« pĂ«rcaktuar nĂ« njĂ« skedĂ« tĂ« veçantĂ« esdl, mjafton tĂ« ekzekutohet komanda "edgedb migration create" dhe DBMS do tĂ« analizohet ndryshimet nĂ« skemĂ« dhe do tĂ« gjenerojĂ« njĂ« skenar pĂ«r kalimin nĂ« skemĂ«n e re nĂ« mĂ«nyrĂ« interaktive. Historiku i ndryshimeve tĂ« skemĂ«s Ă«shtĂ« i monitoruar automatikisht.
Për formimin e pyetjeve, mbështetet si gjuha e pyetjeve GraphQL ashtu edhe gjuha e vet EdgeDB, e cila është një adaptim i SQL për të dhëna hierarkike. Në vend të listave, rezultatet e pyetjes paraqiten në një format të strukturuar, dhe në vend të nënpyetjeve dhe operacioneve JOIN, ofrohet mundësia për të caktuar një pyetje EdgeQL si një shprehje brenda një pyetje 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ë këtë version të ri:
- Shtuar mbĂ«shtetje pĂ«r kĂ«rkimin me tekst tĂ« plotĂ«, e implementuar pĂ«rmes njĂ« moduli tĂ« plug-in fts. PĂ«r tĂ« kthyer çdo objekt nĂ« njĂ« dokument tĂ« aksesueshĂ«m pĂ«r kĂ«rkim, duhen pĂ«rdorur indeksi fts::index, ndĂ«rsa pĂ«r tĂ« kĂ«rkuar njĂ« frazĂ« tĂ« caktuar midis dokumenteve tĂ« indeksuara Ă«shtĂ« propozuar funksioni fts::search(). Rezultatet kthehen nĂ« formĂ«n e tuple-ve, tĂ« cilat pĂ«rmbajnĂ« objektin e gjetur dhe pesha e tij e kĂ«rkimit. 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 ) ); } with 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Ă« dhĂ«nash "multirange", qĂ« pĂ«rcakton njĂ« ose mĂ« shumĂ« intervale vlerash pĂ«r tĂ« pĂ«rfaqĂ«suar intervale tĂ« ndĂ«rprera. Normalizimi i zonave tĂ« mbivendosura nĂ« intervalet e dhĂ«na bĂ«het automatikisht. TĂ« gjitha funksionet dhe operatorĂ«t e mĂ«parshĂ«m pĂ«r pĂ«rpunimin e intervaleve mund tĂ« punojnĂ« me tipin "multirange". select multirange([range(8, 10)]) + range(1, 5) â range(3, 4);
- Shtuar dhe aktivizuar si standart mbështetje për autentifikimin për të kufizuar aksesin në GraphQL dhe EdgeQL mbi HTTP.
- Për të nisur shërbimin e autentifikimit, që funksionon veçmas nga instanca e DB, është shtuar një shtesë "auth", që mbështet OAuth ose hyrjen me email dhe fjalëkalim.
- Shtuar shtesĂ«n pgcrypto, qĂ« ofron funksionet hmac, gen_salt dhe crypt pĂ«r hashimin dhe enkriptimin. select ext::pgcrypto::digest(âencrypt thisâ, âsha1â);
- Shtuar shtesën pg_trgm me funksione për përcaktimin e ngjashmërisë së vargjeve.
- Optimizime janë bërë për të rritur performancën. Konsumi i memories është serveri reduktuar me 40%. Kodi i parserit 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Ă« familjare tĂ« shprehjeve kushtore (if ⊠then .. else âŠ). Ofron mundĂ«sinĂ« e pĂ«rdorimit tĂ« DML kushtore pĂ«r krijimin, azhurnimin dhe fshirjen e objekteve tĂ« ndryshme nĂ« bazĂ« tĂ« kushteve tĂ« caktuara. Shtuar funksionet to_bytes(), to_str(), enc::base64_encode dhe enc::base64_decode. NĂ« triggere lejohet pĂ«rdorimi i shprehjes "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â);
- Shtuar një mënyrë të re për të kaluar vlera globale në pyetje GraphQL - në vend të përdorimit të një fushe të veçantë, ofrohet mundësia për të kaluar variablat mbi objektin __globals__.
Burimi: opennet.ru
