Rilascio del DBMS relazionale e a grafo EdgeDB 4.0

È stato presentato il rilascio del DBMS EdgeDB 4.0, che implementa il modello di dati relazionale e a grafo 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 con 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. Viene fornito un toolkit a riga di comando per la gestione del DBMS e l'esecuzione interattiva delle query (REPL).

In EdgeDB, anziché un modello di dati basato su tabelle, si utilizza un sistema dichiarativo basato su tipi oggetto. Invece delle chiavi esterne (foreign key) per definire le relazioni tra i tipi, si utilizza il legame 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 richieste possono essere utilizzati indici. Sono supportate anche funzionalità come la tipizzazione rigorosa delle proprietà, le restrizioni sui valori delle proprietà, le proprietà calcolate e le procedure memorizzate. Tra le peculiarità dello schema di archiviazione ad oggetti di EdgeDB, che assomiglia a un ORM, si nota la possibilità di mescolare schemi, collegare proprietà di diversi oggetti e il supporto integrato per JSON.

Vengono 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 schema, generando interattivamente uno script per la transizione al nuovo schema. La cronologia delle modifiche allo schema viene tracciata automaticamente.

Per la creazione di query è supportato sia il linguaggio di query GraphQL sia il linguaggio proprietario EdgeDB, che rappresenta un adattamento di SQL per i dati gerarchici. Invece di restituire liste, i risultati delle query vengono presentati in forma strutturata e, anziché sottotrame e operazioni JOIN, è possibile 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 la ricerca full-text, implementata tramite il modulo plug-in fts. Per trasformare qualsiasi oggetto in un documento cercabile, è 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 dati "multirange", che definisce uno o più intervalli di valori per rappresentare intervalli discontinui. La normalizzazione delle aree sovrapposte negli intervalli specificati avviene automaticamente. Con il tipo "multirange" possono funzionare tutte le precedenti funzioni e operatori per la gestione degli intervalli. select multirange([range(8, 10)]) + range(1, 5) — range(3, 4);
  • È stata aggiunta e attivata per impostazione predefinita la possibilità di autenticazione per limitare l'accesso a GraphQL e EdgeQL tramite HTTP.
  • Per avviare il servizio di autenticazione, che funziona separatamente dall'istanza del database, è stata aggiunta l'estensione «auth», che supporta OAuth oppure l'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 è stato server ridotto del 40%. Il codice del parser delle query EdgeQL è stato riscritto in Rust.
  • Nel linguaggio EdgeQL è stato introdotto un sintassi più familiare per le espressioni condizionali (if … then .. else …). È stata fornita la possibilità di utilizzare DML condizionali per creare, aggiornare e rimuovere diversi oggetti basati su condizioni specifiche. Sono state aggiunte le funzioni to_bytes(), to_str(), enc::base64_encode e enc::base64_decode. Negli trigger è consentito utilizzare l'espressione «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’);
  • È stato aggiunto un nuovo modo per trasmettere valori globali nelle richieste GraphQL: invece di utilizzare un campo separato, ora è possibile passare variabili basate sull'oggetto __globals__.

    Fonte: opennet.ru
Acquista un hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista un hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster