A fost lansată versiunea 2.0 a sistemului de baze de date EdgeDB, care implementează un model de date relațional-grafic și limbajul de interogare EdgeQL, optimizat pentru gestionarea datelor hierarchice complexe. Codul este scris în limbajele Python și Rust (parserul și părțile critice pentru performanță) și este distribuit sub licența Apache 2.0. Proiectul se dezvoltă sub forma unei extensii pentru PostgreSQL. Bibliotecile client sunt pregătite pentru limbajele Python, Go, Rust și TypeScript/Javascript. Este oferit un instrument de linie de comandă pentru gestionarea sistemului de baze de date și pentru execuția 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 property name -> str; } type Movie { required property title -> str; multi link 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' } ) } for number in {0, 1, 2, 3} union ( select { number, number + 0.5 } );
În noua versiune:
- A fost adăugat un web interface încorporat pentru administrarea bazei de date, permițând vizualizarea și editarea datelor, executarea interogărilor EdgeQL și analiza schemei de stocare aplicate. Interfața se lansează cu comanda „edgedb ui”, după care devine accesibilă prin localhost.

- A fost implementat expresia „GROUP”, care permite secționarea și agregarea datelor și executarea grupării datelor după expresii EdgeQL arbitrare, similar cu gruparea în operația SELECT.
- Posibilitatea de a gestiona accesul la nivel de obiecte. Regulile de acces sunt definite la nivelul schemei de stocare și permit restricționarea utilizării unui anumit set de obiecte în operațiunile de selecție, inserare, ștergere și actualizare. De exemplu, se poate adăuga o regulă care permite actualizarea publicației doar autorului.
- A fost adăugată posibilitatea utilizării variabilelor globale în schema de stocare. Pentru asocierea cu utilizatorul a fost propusă o nouă variabilă globală current_user.
- A fost adăugată suportul pentru tipurile care definesc intervale de valori (range).
- A fost pregătită biblioteca oficială de client pentru limbajul Rust.
- A fost stabilizat protocolul binar EdgeDB, care acum oferă posibilitatea de a gestiona simultan mai multe sesiuni diferite în cadrul unei singure conexiuni de rețea, forwarding prin HTTP, utilizarea variabilelor globale și a stărilor locale.
- S-a adăugat suport pentru activarea prin socket, permițând păstrarea procesorului de server în memorie și pornirea acestuia doar la încercarea de a stabili o conexiune (util pentru economisirea resurselor pe sistemele dezvoltatorilor).
Sursa: opennet.ro

