EdgeDB 2.0 har blitt lansert, som implementerer en relasjons-grafdatamodell og forespørselsspråket EdgeQL, optimalisert for håndtering av komplekse hierarkiske data. Koden er skrevet i språkene Python og Rust (parseren og ytelseskritiske deler) og distribueres under Apache 2.0-lisensen. Prosjektet utvikles som et tillegg til PostgreSQL. Klientbibliotekene er klare for språkene Python, Go, Rust og TypeScript/Javascript. Det tilbys et kommandolinjeverktøy for administrasjon av databasen og interaktiv kjøring av forespørslene (REPL).
I EdgeDB brukes et deklarativt system basert på objekttyper i stedet for en datamodell basert på tabeller. For å definere relasjoner mellom typer brukes binding ved linker (ett objekt kan brukes som en egenskap av et annet objekt) i stedet for fremmednøkler.
type Person { required property name -> str; } type Movie { required property title -> str; multi link actors -> Person; }
For å akselerere spørringsbehandling kan indekser brukes. Det støttes også funksjoner som streng typet egenskaper, verdibegrensninger for egenskaper, beregnede egenskaper og lagrede prosedyrer. Blant spesifikasjonene for dataskjemaet i EdgeDB, som ligner på ORM, er muligheten til å blande skjemaer, koble egenskaper fra forskjellige objekter og integrert støtte for JSON.
Innebygde verktøy for migrasjon av lagringsskjemaer tilbys — etter endringer i skjemaet angitt i en separat esdl-fil, er det tilstrekkelig å utføre kommandoen «edgedb migration create», og DBMS analyserer forskjellene i skjemaet og genererer interaktivt et skript for å oppdatere til det nye skjemaet. Endringshistorikk for skjemaet spores automatiskt.
For å danne forespørselene støttes både GraphQL og det egne språket EdgeDB, som representerer en tilpasning av SQL for hierarkiske data. I stedet for lister presenteres resultatene i strukturert form, og i stedet for subseleksjoner og JOIN-operasjoner er det mulig å angi en EdgeQL-forespørsel som et uttrykk innenfor en annen forespørsel. Transaksjoner og løkker stø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' } ) } for number in {0, 1, 2, 3} union ( select { number, number + 0.5 } );
I den nye versjonen:
- Det er lagt til et innebygd webgrensesnitt for databaseadministrasjon, som tillater visning og redigering av data, utføring av EdgeQL-forespørsel og analyse av den anvendte lagringsskjemaet. Grensesnittet startes med kommandoen 'edgedb ui', etter hvilket det blir tilgjengelig ved tilgang til localhost.

- Uttrykket 'GROUP' er implementert, som gjør det mulig å seksjonere og aggregere data og utføre gruppering av data etter vilkårlige EdgeQL-uttrykk, lik gruppering i SELECT-operasjonen.
- Mulighet for tilgangskontroll på objektivnivå. Tilgangsreglene defineres på lagringskjema-nivå og tillater å begrense bruken av et spesifikt sett av objekt i valg-, innsettings-, slettings- og oppdateringsoperasjoner. For eksempel kan man legge til en regel som tillater oppdatering av publikasjoner kun for forfatteren.
- Muligheten for bruk av globale variabler i lagringsskjemaet er lagt til. For å knytte til bruker er en ny global variabel current_user foreslått.
- Støtte for typer som definerer verdieranger (range) er lagt til.
- Den offisielle klientbiblioteket for Rust-språket er blitt forberedt.
- EdgeDB-binaryprotokollen er stabilisert, hvor det nå er mulig å håndtere flere forskjellige sesjoner samtidig i én nettverksforbindelse, videresending via HTTP, bruk av globale variabler og lokale tilstander.
- Støtte for aktivering via socket er lagt til, noe som gjør det mulig å ikke ha serverbehandleren i minnet og bare kjøre den når det er et forsøk på å opprette en forbindelse (nyttig for ressursbesparelse på utviklersystemer).
Kilde: opennet.ru

