EdgeDB 4.0 er nu udgivet. Den implementerer en relations-grafdatamodel og EdgeQL-forespørgselsproget, som er optimeret til håndtering af komplekse hierarkiske data. Koden er skrevet i Python og Rust (parser og performance-kritiske dele) og distribueres under Apache 2.0-licensen. Projektet udvikles som en udvidelse af PostgreSQL. Klientbiblioteker er tilgængelige for Python, Go, Rust, .NET, Elixir og TypeScript/Javascript. Der leveres et kommandolinjeværktøj til at administrere databasen og til interaktiv udførelse af forespørgsler (REPL).
I stedet for en tabelbaseret datamodel anvender EdgeDB et deklarativt system baseret på objekt typer. I stedet for fremmednøgler (foreign key) til at definere forbindelser mellem typer anvendes binding via referencer (et objekt kan bruges som en egenskab af et andet objekt).
type Person { required name: str; } type Movie { required title: str; multi actors: Person; }
For at fremskynde behandling af forespørgsler kan der anvendes indekser. Der understøttes også funktioner som streng typificering af egenskaber, begrænsninger for værdier, beregnede egenskaber og gemte procedurer. I EdgeDB's objektlagringsskema, som minder om ORM, er der mulighed for at blande skemaer, knytte egenskaber fra forskellige objekter og integreret JSON-understøttelse.
Indbyggede værktøjer til migrering af lagringsskemaet tilbydes — efter ændring af skemaet, der angives i en separat esdl-fil, er det tilstrækkeligt at udføre kommandoen "edgedb migration create", og databasen vil analysere forskellene i skemaet og interaktivt generere et script til overgangen til det nye skema. Historikken for ændringer i skemaet spores automatisk.
Der understøttes både GraphQL og EdgeDB's eget forespørgselsprog, som er en tilpasning af SQL til hierarkiske data. I stedet for lister præsenteres forespørgselsresultaterne i struktureret form, og i stedet for subforespørgsler og JOIN-operationer kan man angive en EdgeQL-forespørgsel som et udtryk inden i en anden forespørgsel. Transaktioner og løkker understøttes.
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’ } ) }
I den nye version:
- Der er tilføjet understøttelse af fuldtekst-søgning, implementeret gennem en plug-in-modul fts. For at gøre ethvert objekt tilgængeligt som et søgbart dokument, bør man bruge indekset fts::index, og for at søge efter en bestemt sætning blandt de indekserede dokumenter er funktionen fts::search() blevet introduceret. Resultaterne returneres i form af tupler, der indeholder det fundne objekt og dets søgevægt. For eksempel: 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;
- En ny datatype "multirange" er blevet tilføjet, som definerer et eller flere intervaller af værdier til repræsentation af afbrudte intervaller. Normaliseringen af overlappende områder i de angivne intervaller sker automatisk. Alle tidligere tilgængelige funktioner og operatorer til behandling af intervaller kan arbejde med "multirange". select multirange([range(8, 10)]) + range(1, 5) — range(3, 4);
- Support til autentificering er blevet tilføjet og er som standard aktiveret for at begrænse adgangen til GraphQL og EdgeQL over HTTP.
- For at starte en autentificeringstjeneste, som fungerer separat fra BD-instansen, er udvidelsen "auth" tilføjet, der understøtter OAuth eller login via e-mail og adgangskode.
- Udvidelsen pgcrypto er blevet tilføjet, som giver funktioner som hmac, gen_salt og crypt til hashing og kryptering. select ext::pgcrypto::digest(‘encrypt this’, ‘sha1’);
- Udvidelsen pg_trgm med funktioner til bestemmelser af strænges lighed er blevet tilføjet.
- Optimaliseringer er blevet gennemført for at forbedre ydeevnen. Hukommelsesforbruget er serveren reduceret med 40%. Parserkoden for EdgeQL-forespørgsler er blevet omskrevet i Rust.
- Språket EdgeQL har fået support for en mere velkendt syntaks for betingede udsagn (if … then … else …). Muligheden for at bruge betingede DML til oprettelse, opdatering og sletning af forskellige objekter baseret på angivne betingelser er blevet tilføjet. Funktionerne to_bytes(), to_str(), enc::base64_encode og enc::base64_decode er blevet tilføjet. Brugen af udtrykket "when" i triggere er tilladt. 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’);
- En ny måde at sende globale værdier i GraphQL-forespørgsler er blevet tilføjet — i stedet for at bruge et særskilt felt, gives muligheden for at sende variabler baseret på objektet __globals__.
Kilde: opennet.ru
