De release van de EdgeDB 4.0 database is aangekondigd, die het relationeel-grafische datamodel en de EdgeQL-querytaal implementeert, geoptimaliseerd voor complex hiërarchische gegevens. De code is geschreven in Python en Rust (de parser en prestatiekritische onderdelen) en is beschikbaar onder de Apache 2.0-licentie. Het project ontwikkelt zich als een uitbreiding op PostgreSQL. Klantbibliotheken zijn beschikbaar voor Python, Go, Rust, .NET, Elixir en TypeScript/Javascript. Er is een opdrachtregelhulpmiddel beschikbaar voor databasebeheer en interactieve query-uitvoering (REPL).
In plaats van een tabel-gebaseerd datamodel, gebruikt EdgeDB een declaratief systeem gebaseerd op objecttypen. In plaats van buitenlandse sleutels (foreign key) om de relatie tussen typen te definiëren, wordt binding door middel van referenties toegepast (een object kan als eigenschap van een ander object worden gebruikt).
type Person { required name: str; } type Movie { required title: str; multi actors: Person; }
Voor het versnellen van het verwerken van aanvragen kunnen indexen worden gebruikt. Ook worden functionaliteiten ondersteund zoals strikte typering van eigenschappen, waarde-beperkingen voor eigenschappen, berekende eigenschappen en opgeslagen procedures. Een van de kenmerken van het opslagobjectmodel van EdgeDB, dat enige gelijkenis vertoont met ORM, is de mogelijkheid tot het mengen van schema's, het koppelen van eigenschappen van verschillende objecten en de geïntegreerde ondersteuning voor JSON.
Er zijn ingebouwde tools beschikbaar voor het migreren van het opslagchema — na een wijziging in het schema, zoals opgegeven in een afzonderlijk esdl-bestand, is het voldoende om het commando 'edgedb migration create' uit te voeren, waarna de database de verschillen in het schema analyseert en interactief een script genereert voor de overgang naar het nieuwe schema. De geschiedenis van schemawijzigingen wordt automatisch bijgehouden.
Voor het vormen van aanvragen wordt zowel de GraphQL-querytaal als de eigen EdgeDB-querytaal ondersteund, die een aanpassing van SQL voor hiërarchische gegevens vertegenwoordigt. In plaats van lijsten worden de resultaten van de aanvraag gestructureerd weergegeven, en in plaats van sub-aanvragen en JOIN-operaties is het mogelijk om een enkele EdgeQL-aanroep als expressie binnen een andere aanvraag op te geven. Transacties en lussen worden ondersteund.
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’ } ) }
In de nieuwe versie:
- Er is ondersteuning voor volledige tekstzoekopdrachten toegevoegd, gerealiseerd via de plug-inmodule fts. Om elk object om te zetten in een doorzoekbaar document, dient men de fts::index-index te gebruiken, en voor het zoeken naar een specifieke zin onder de geïndexeerde documenten is de functie fts::search() voorgesteld. De resultaten worden geretourneerd in de vorm van tuples, die het gevonden object en zijn zoekgewicht bevatten. Bijvoorbeeld: 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;
- Een nieuw gegevenstype 'multirange' is toegevoegd, waarmee één of meerdere waarden geschoven zijn om onderbroken intervallen weer te geven. Normalisatie van overlappende gebieden in de opgegeven intervallen gebeurt automatisch. Alle eerder beschikbare functies en operators voor het verwerken van intervallen kunnen met het type 'multirange' worden gebruikt. select multirange([range(8, 10)]) + range(1, 5) — range(3, 4);
- Ondersteuning voor authenticatie om toegang tot GraphQL en EdgeQL via HTTP te beperken is toegevoegd en standaard ingeschakeld.
- Om de authenticatieservice te starten, die onafhankelijk van de database-instantie functioneert, is de extensie 'auth' toegevoegd, die OAuth of inloggen via e-mail en wachtwoord ondersteunt.
- De pgcrypto-extensie is toegevoegd, die functies voor hmac, gen_salt en crypt voor hashing en encryptie biedt. select ext::pgcrypto::digest('encrypt this', 'sha1');
- De pg_trgm-extensie is toegevoegd met functies voor het bepalen van de gelijkenis van strings.
- Er zijn optimalisaties doorgevoerd die de prestaties hebben verbeterd. Geheugenverbruik is met de server 40% verminderd. De code van de EdgeQL-queryparser is herschreven in de programmeertaal Rust.
- De EdgeQL-taal heeft ondersteuning gekregen voor een meer gebruiksvriendelijke syntaxis van voorwaardelijke uitdrukkingen (if … then .. else …). Er is een mogelijkheid toegevoegd voor voorwaardelijke DML voor het aanmaken, bijwerken en verwijderen van verschillende objecten op basis van opgegeven voorwaarden. De functies to_bytes(), to_str(), enc::base64_encode en enc::base64_decode zijn toegevoegd. Het gebruik van de uitdrukking 'when' is toegestaan in triggers. 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');
- Een nieuwe manier om globale waarden in GraphQL-query's door te geven is toegevoegd — in plaats van een apart veld te gebruiken, is er nu de mogelijkheid om variabelen door te geven op basis van het object __globals__.
Bron: opennet.ru
