A fost lansată versiunea 5.0 a sistemului de baze de date EdgeDB, care implementează modelul de date relațional-grafic și limbajul de interogare EdgeQL, optimizat pentru gestionarea datelor ierarhice complexe. Proiectul se dezvoltă ca o extensie a PostgreSQL, codul său fiind scris în limbajele Python și Rust (parserul și părțile critice pentru performanță), fiind distribuit sub licența Apache 2.0. Bibliotecile client sunt disponibile pentru limbajele Python, Go, Rust, .NET, Elixir și TypeScript/Javascript. Este disponibil un instrument de linie de comandă pentru gestionarea SGBD-ului ș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; }
Se susțin caracteristici precum tipizarea strictă a proprietăților, restricții asupra valorilor proprietăților, proprietăți calculate și procese stocate. O caracteristică a schemei obiectuale EdgeDB, care seamănă cu ORM, este posibilitatea de a amesteca schemele, de a lega proprietăți din obiecte diferite și suportul integrat pentru JSON. Pentru a accelera procesarea interogărilor, pot fi aplicate indice.
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, este susținut limbajul de interogare GraphQL și propriul limbaj EdgeDB, care este o adaptare a SQL pentru date ierarhice. În loc de liste, rezultatele interogării sunt prezentate într-o formă structurată, iar în loc de subinterogări și operațiuni JOIN, se oferă posibilitatea de a specifica o interogare EdgeQL ca expresie în interiorul alteia. Transacțiile și buclele sunt susținute.
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 suport pentru ramificare („branching”), permițând utilizarea conceptului de ramuri în lucrul cu datele și schemele, similar sistemelor de gestionare a versiunilor. În locul termenului „bază de date”, noua versiune propune conceptul de „ramură” (branch), iar comenzile „create database” și „drop database” au fost declarate învechite și în locul lor se recomandă utilizarea comenzilor noi „create empty branch” și „drop branch”. Pe lângă ramurile goale, utilizând comenzile „create schema branch” și „create data branch”, se pot crea ramificații din ramuri și Baze de Date existente, copind schema de stocare și datele acestora.
Din punct de vedere practic, suportul pentru ramuri permite sincronizarea datelor cu codul utilizat pentru prelucrarea acestora, păstrând în același timp compatibilitatea cu codul vechi. De exemplu, după actualizarea codului, se poate lega o nouă ramură de date la acesta, care ia în considerare modificările aduse schemei de stocare din cod. Această funcționalitate este convenabilă pentru simplificarea dezvoltării și testării noilor versiuni ale software-ului, după finalizarea cărora este suficient să te schimbi la ramura deja testată.
- În extensia pgvector, utilizată pentru stocarea eficientă și interogarea vectorilor, a fost adăugat un nou tip de indici HNSW (Hierarchical Navigable Small Worlds), care, similar indicelui IVFFlat, este disponibil în trei variante: ext::pgvector::hnsw_euclidean, ext::pgvector::hnsw_ip și ext::pgvector::hnsw_cosine. În plus, în pgvector s-au extins capacitățile pentru ajustarea fină a indicilor prin intermediul obiectului ext::pgvector::Config.
- S-au adăugat funcționalități suplimentare de autentificare. În extensia auth a fost implementat suport pentru schemele de autentificare fără parolă WebAuthn (Passkeys) și „magic links” (bazate pe email). S-a adăugat suport pentru utilizarea platformelor Slack și Discord ca furnizori OAuth.
- Au fost efectuate optimizări ale performanței. Implementarea cache-ului cu rezultatele compilației interogărilor asigură păstrarea stării între reporniri și s-a adăugat recompilarea automată după migrare. A crescut viteza de lucru cu schemele mari de stocare.
- În limbajul de interogare EdgeQL, în expresia „for” nu este necesar să se specifice cuvântul cheie „union” în interogările de bază care utilizează expresiile insert, update sau delete.
- A fost adăugată comanda vacuum() pentru curățarea, optimizarea și împachetarea conținutului bazei de date.
- Se permite conversia datelor între tipul bytes și tipurile int16, int32, int64 și uuid, folosind funcțiile to_bytes(), to_uuid() și to_int*().
- A fost adăugată opțiunea de a închide toate conexiunile la baza de date după executarea operațiunii „drop database”.
Sursa: opennet.ro
