A fost lansată versiunea 4.0 a bazei de date EdgeDB, care implementează un model de date relațional-grafic și un limbaj de interogare EdgeQL, optimizat pentru lucrul cu date complexe și ierarhice. Codul este scris în limbajele Python și Rust (parser și părțile critice pentru performanță) și este distribuit sub licența Apache 2.0. Proiectul se dezvoltă ca un supliment pentru PostgreSQL. Bibliotecile client sunt pregătite pentru limbajele Python, Go, Rust, .NET, Elixir și TypeScript/Javascript. Este furnizat un instrument de linie de comandă pentru gestionarea bazei de date și executarea interactivă a interogărilor (REPL).
În locul modelului de date bazat pe tabele, EdgeDB utilizează un sistem declarațiv bazat pe tipuri de obiecte. În loc de chei externe (foreign key) pentru a defini relațiile între tipuri, se aplică legarea prin referințe (un obiect poate fi folosit ca proprietate a altui obiect).
type Person { required name: str; } type Movie { required title: str; multi actors: Person; }
Pentru a accelera procesarea interogărilor, pot fi utilizate indecși. De asemenea, sunt suportate funcționalități cum ar fi tiparea strictă a proprietăților, restricții asupra valorilor proprietăților, proprietăți calculate și proceduri stocate. Printre caracteristicile schemei de stocare obiectuală EdgeDB, care este similară cu ORM, se numără posibilitatea de amestecare a schemelor, legarea proprietăților din diferite obiecte și suportul integrat pentru JSON.
Sunt furnizate instrumente încorporate pentru migrarea schemei de stocare — după modificarea schemei specificate într-un fișier esdl separat, este suficient să executați comanda „edgedb migration create”, iar SGBD-ul va analiza diferențele în schemă și va genera interactiv un script pentru trecerea la noua schemă. Istoricul modificărilor schemei este urmărit automat.
Pentru formarea interogărilor se suportă atât limbajul de interogare GraphQL, cât și propriul limbaj EdgeDB, care reprezintă o adaptare a SQL pentru datele ierarhice. În loc de liste, rezultatele interogării sunt prezentate într-o formă structurată, iar în locul subinterogărilor și operațiunilor JOIN, se oferă posibilitatea de a specifica o interogare EdgeQL ca expresie în cadrul unei alte interogări. Se susțin tranzacții și bucle.
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 noua versiune:
- A fost adăugată suportul pentru căutarea full-text, implementată printr-un modul conectabil fts. Pentru a transforma orice obiect într-un document căutabil, ar trebui utilizat indicele fts::index, iar pentru a căuta o anumită frază printre documentele indexate, este propusă funcția fts::search(). Rezultatele sunt returnate sub formă de tuple, conținând obiectul găsit și greutatea sa în căutare. De exemplu: 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;
- A fost adăugat un nou tip de date „multirange”, care definește unul sau mai multe intervale de valori pentru a reprezenta intervale discontinue. Normalizarea zonelor suprapuse în intervalele specificate se realizează automat. Tipul „multirange” poate fi utilizat cu toate funcțiile și operatorii disponibili anterior pentru procesarea intervalelor. select multirange([range(8, 10)]) + range(1, 5) — range(3, 4);
- A fost adăugată și activată implicit suportul pentru autentificare pentru restricționarea accesului la GraphQL și EdgeQL prin HTTP.
- Pentru a lansa serviciul de autentificare, funcționând separat de instanța Bazei de Date, a fost adăugat un plugin „auth”, care suportă OAuth sau autentificarea prin email și parolă.
- A fost adăugat pluginul pgcrypto, care oferă funcții hmac, gen_salt și crypt pentru hashing și criptare. select ext::pgcrypto::digest(‘encrypt this’, ‘sha1’);
- A fost adăugat pluginul pg_trgm cu funcții pentru determinarea similitudinii între șiruri de caractere.
- Au fost realizate optimizări care au îmbunătățit performanța. Consumul de memorie a server a fost redus cu 40%. Codul parser-ului pentru interogările EdgeQL a fost rescris în limbajul Rust.
- În limbajul EdgeQL a fost adăugat suport pentru o sintaxă de expresie condiționată (if … then .. else …) mai familiară. A fost oferită posibilitatea de utilizare a DML condiționate pentru crearea, actualizarea și ștergerea diferitelor obiecte în funcție de condițiile specificate. Au fost adăugate funcțiile to_bytes(), to_str(), enc::base64_encode și enc::base64_decode. În declanșatoare este permisă utilizarea expresiei „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’);
- A fost adăugată o nouă modalitate de a transmite valori globale în interogările GraphQL — în loc să folosească un câmp separat, a fost oferită posibilitatea de a transmite variabile pe baza obiectului __globals__.
Sursa: opennet.ro
