È disponibile il rilascio del DBMS EdgeDB 5.0, che implementa un modello di dati relazionale e grafico e un linguaggio di query EdgeQL, ottimizzati per la gestione di dati gerarchici complessi. Il progetto si sviluppa come un'estensione di PostgreSQL, il cui codice è scritto in Python e Rust (parser e parti critiche per le prestazioni), ed è distribuito con licenza Apache 2.0. Le librerie client sono disponibili per i linguaggi Python, Go, Rust, .NET, Elixir e TypeScript/Javascript. È fornito un set di strumenti da riga di comando per gestire il DBMS e per eseguire interattivamente le query (REPL).
In EdgeDB viene utilizzato un sistema dichiarativo basato su tipi di oggetti anziché un modello di dati basato su tabelle. Invece delle chiavi esterne (foreign key) per definire le relazioni tra i tipi, vengono utilizzate associazioni tramite riferimenti (un oggetto può essere utilizzato come proprietà di un altro oggetto).
type Person { required name: str; } type Movie { required title: str; multi actors: Person; }
Sono supportate funzionalità come la tipizzazione rigorosa delle proprietà, i vincoli sui valori delle proprietà, le proprietà calcolate e le procedure memorizzate. Tra le peculiarità dello schema di archiviazione oggettuale di EdgeDB, che in qualche modo ricorda un ORM, si segnala la possibilità di mescolare schemi, legare proprietà da oggetti diversi e un supporto integrato per JSON. Per accelerare l'elaborazione delle query possono essere utilizzati indici.
Sono forniti strumenti integrati per la migrazione dello schema di archiviazione: dopo aver modificato lo schema definito in un file esdl separato, è sufficiente eseguire il comando "edgedb migration create" e il DBMS analizzerà le differenze nel modello e genererà interattivamente uno script per l'aggiornamento del modello. La cronologia delle modifiche allo schema viene tracciata automaticamente.
Per la creazione delle query è supportato il linguaggio di query GraphQL e il linguaggio proprietario di EdgeDB, che rappresenta un adattamento di SQL per dati gerarchici. Invece di elenchi, i risultati delle query sono presentati in forma strutturata, mentre al posto di sottoparole e operazioni JOIN è prevista la possibilità di specificare una query EdgeQL come espressione all'interno di un'altra query. Sono supportate transazioni e cicli.
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’ } ) }
Nella nuova versione:
- È stata aggiunta la supporto per il branching, che consente di utilizzare il concetto di rami nel lavoro con dati e schemi, simile a quello dei sistemi di controllo versione. Invece del termine "database", nel nuovo rilascio è stato introdotto il concetto di "ramo" (branch), e i comandi "create database" e "drop database" sono stati dichiarati obsoleti, raccomandando in sostituzione i nuovi comandi "create empty branch" e "drop branch". Oltre ai rami vuoti, con i comandi "create schema branch" e "create data branch" è possibile creare ramificazioni da rami e database esistenti, copiando da essi lo schema di archiviazione e i dati.
Dal punto di vista pratico, il supporto dei rami consente di sincronizzare i dati con il codice utilizzato per l'elaborazione, mantenendo così la compatibilità con il codice legacy. Ad esempio, dopo l'aggiornamento del codice, è possibile collegare un nuovo ramo di dati che tenga conto delle modifiche apportate allo schema di memorizzazione. Questa funzionalità è particolarmente utile per semplificare lo sviluppo e il testing di nuove versioni del software, dopo di che è sufficiente passare al ramo già testato.
- Nel modulo pgvector, utilizzato per la memorizzazione e la richiesta efficiente di vettori, è stato aggiunto un nuovo tipo di indici HNSW (Hierarchical Navigable Small Worlds), che, analogamente all'indice IVFFlat, è disponibile in tre varianti: ext::pgvector::hnsw_euclidean, ext::pgvector::hnsw_ip e ext::pgvector::hnsw_cosine. Inoltre, pgvector ha ampliato le possibilità di configurazione fine degli indici attraverso l'oggetto ext::pgvector::Config.
- Sono state aggiunte ulteriori opzioni di autenticazione. Nel modulo auth è stato implementato il supporto per schemi di autenticazione senza password WebAuthn (Passkeys) e 'magic links' (basati su email). È stato aggiunto il supporto per l'uso delle piattaforme Slack e Discord come fornitori OAuth.
- Sono state apportate ottimizzazioni delle prestazioni. Nella realizzazione della cache con i risultati della compilazione delle query è stato garantito il salvataggio dello stato tra i riavvii e aggiunta la ricompilazione automatica dopo la migrazione. È stata aumentata la velocità di lavoro con grandi schemi di memorizzazione.
- Nel linguaggio di query EdgeQL, nell'espressione 'for' è stato consentito di non specificare la parola chiave 'union' nelle query di base che utilizzano le espressioni insert, update o delete.
- È stato aggiunto il comando vacuum() per la pulizia, ottimizzazione e impacchettamento del contenuto del database.
- È stata autorizzata la conversione dei dati tra il tipo bytes e i tipi int16, int32, int64 e uuid, utilizzando le funzioni to_bytes(), to_uuid() e to_int*().
- È stata aggiunta la possibilità di chiudere tutte le connessioni al database dopo aver eseguito l'operazione 'drop database'.
Fonte: opennet.ru
