È stato presentato il rilascio del DBMS EdgeDB 4.0, che implementa un modello di dati relazionale-grafico e il linguaggio di query EdgeQL, ottimizzati per lavorare con dati gerarchici complessi. Il codice è scritto in Python e Rust (parser e parti critiche per le prestazioni) e distribuito sotto licenza Apache 2.0. Il progetto si sviluppa come un'estensione di PostgreSQL. Le librerie client sono disponibili per i linguaggi Python, Go, Rust, .NET, Elixir e TypeScript/Javascript. È fornito un toolkit a riga di comando per gestire il DBMS e l'esecuzione interattiva delle 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; }
Per accelerare l'elaborazione delle query possono essere utilizzati gli indici. Sono supportate anche funzionalità come la tipizzazione rigorosa delle proprietà, le limitazioni dei valori delle proprietà, le proprietà calcolate e le procedure memorizzate. Tra le caratteristiche del modello di archiviazione a oggetti di EdgeDB, simile a un ORM, si segnala la possibilità di mescolare schemi, associare proprietà di oggetti diversi e il supporto integrato per JSON.
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 formazione delle query, sono supportati sia il linguaggio di query GraphQL che il proprio linguaggio EdgeDB, che è un'adattamento di SQL per dati gerarchici. Invece di elenchi, i risultati della query vengono presentati in forma strutturata, e invece di sottoquery e operazioni JOIN, viene fornita la possibilità di indicare 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 la ricerca full-text, implementata tramite un modulo plug-in fts. Per trasformare qualsiasi oggetto in un documento ricercabile, è necessario utilizzare l'indice fts::index, mentre per cercare una determinata frase tra i documenti indicizzati è stata proposta la funzione fts::search(). I risultati vengono restituiti sotto forma di tuple contenenti l'oggetto trovato e il suo peso di ricerca. Ad esempio: 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;
- È stato aggiunto un nuovo tipo di dato "multirange", che definisce uno o più intervalli di valori per rappresentare intervalli discontinui. La normalizzazione delle aree sovrapposte nei ranghi specificati avviene automaticamente. Il tipo "multirange" può essere utilizzato con tutte le precedenti funzioni e operatori per la gestione degli intervalli. select multirange([range(8, 10)]) + range(1, 5) — range(3, 4);
- È stato aggiunto e attivato di default il supporto per l'autenticazione per limitare l'accesso a GraphQL e EdgeQL su HTTP.
- Per avviare un servizio di autenticazione che opera separatamente dall'istanza del DB, è stata aggiunta l'estensione "auth", che supporta OAuth o accesso tramite email e password.
- È stata aggiunta l'estensione pgcrypto, che fornisce funzioni hmac, gen_salt e crypt per l'hashing e la crittografia. select ext::pgcrypto::digest(‘encrypt this’, ‘sha1’);
- È stata aggiunta l'estensione pg_trgm con funzioni per determinare la somiglianza delle stringhe.
- Sono state apportate ottimizzazioni che hanno migliorato le prestazioni. Il consumo di memoria è server stato ridotto del 40%. Il codice del parser delle query EdgeQL è stato riscritto in Rust.
- Nel linguaggio EdgeQL è stata aggiunta la supporto per una sintassi condizionale più familiare (if … then .. else …). È stato possibile utilizzare DML condizionali per la creazione, l'aggiornamento e la cancellazione di vari oggetti in base a condizioni specifiche. Sono state aggiunte le funzioni to_bytes(), to_str(), enc::base64_encode e enc::base64_decode. È permesso utilizzare l'espressione «when» nei trigger. 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');
- È stato aggiunto un nuovo modo di passare valori globali nelle query GraphQL: invece di utilizzare un campo separato, è stata fornita la possibilità di passare variabili basate sull'oggetto __globals__.
Fonte: opennet.ru
