Veröffentlichung der relationalen Graph-Datenbank EdgeDB 4.0

Die Veröffentlichung der Datenbank-Engine EdgeDB 4.0 wurde vorgestellt, die ein relationales und graphbasiertes Datenmodell sowie die fĂŒr komplexe hierarchische Daten optimierte Abfragesprache EdgeQL implementiert. Der Code ist in Python und Rust geschrieben (Parser und leistungskritische Teile) und erfolgt unter der Lizenz Apache 2.0. Das Projekt entwickelt sich als Erweiterung von PostgreSQL. Client-Bibliotheken sind fĂŒr die Sprachen Python, Go, Rust, .NET, Elixir und TypeScript/Javascript verfĂŒgbar. Ein Kommandozeilenwerkzeug zur Verwaltung der Datenbank und zur interaktiven AusfĂŒhrung von Abfragen (REPL) wird bereitgestellt.

Anstelle eines tabellenbasierten Datenmodells verwendet EdgeDB ein deklaratives System, das auf Objekttypen basiert. Anstelle von FremdschlĂŒsseln (foreign key) zur Definition von Beziehungen zwischen Typen wird eine VerknĂŒpfung ĂŒber Referenzen angewendet (ein Objekt kann als Attribut eines anderen Objekts verwendet werden).

type Person { required name: str; } type Movie { required title: str; multi actors: Person; }

Um die Verarbeitung von Abfragen zu beschleunigen, können Indizes verwendet werden. Es werden auch Funktionen wie strikte Typisierung von Eigenschaften, EinschrĂ€nkungen von Eigenschaftswerten, berechnete Eigenschaften und gespeicherte Prozeduren unterstĂŒtzt. Eine Besonderheit des objektbasierten Schemas von EdgeDB, das in gewisser Weise an ORM erinnert, ist die Möglichkeit, Schemata zu mischen, Eigenschaften aus verschiedenen Objekten zu verknĂŒpfen und integrierte JSON-UnterstĂŒtzung.

Es stehen integrierte Werkzeuge zur Migration des Speicherschemas zur VerfĂŒgung — nach einer Änderung des Schemas, das in einer separaten esdl-Datei festgelegt wird, genĂŒgt es, den Befehl "edgedb migration create" auszufĂŒhren, und die Datenbank analysiert die Unterschiede im Schema und generiert interaktiv ein Skript fĂŒr den Übergang zu dem neuen Schema. Die Historie der SchemaĂ€nderungen wird automatisch verfolgt.

FĂŒr die Abfrageerstellung wird sowohl die GraphQL-Abfragesprache als auch die eigene EdgeDB-Sprache unterstĂŒtzt, die eine Anpassung von SQL fĂŒr hierarchische Daten darstellt. Anstelle von Listen werden die Ergebnisse der Abfragen strukturiert dargestellt, und anstelle von Unterabfragen und JOIN-Operationen besteht die Möglichkeit, eine EdgeQL-Abfrage als Ausdruck innerhalb einer anderen Abfrage anzugeben. Transaktionen und Schleifen werden unterstĂŒtzt.

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 der neuen Version:

  • Die UnterstĂŒtzung fĂŒr die Volltextsuche wurde hinzugefĂŒgt, implementiert ĂŒber das modulare fts. Um ein beliebiges Objekt in ein durchsuchbares Dokument zu verwandeln, sollte der Index fts::index verwendet werden, und zur Suche nach einer bestimmten Phrase unter den indizierten Dokumenten wurde die Funktion fts::search() vorgeschlagen. Die Ergebnisse werden in Form von Tupeln zurĂŒckgegeben, die das gefundene Objekt und dessen Suchgewicht enthalten. Zum Beispiel: 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;
  • Ein neuer Datentyp "multirange" wurde hinzugefĂŒgt, der einen oder mehrere Wertebereiche zur Darstellung unterbrochener Intervalle definiert. Die Normalisierung ĂŒberlappender Bereiche in den angegebenen Bereichen erfolgt automatisch. Mit dem Typ "multirange" können alle zuvor verfĂŒgbaren Funktionen und Operatoren zur Bearbeitung von Bereichen verwendet werden. select multirange([range(8, 10)]) + range(1, 5) — range(3, 4);
  • Die UnterstĂŒtzung fĂŒr die Authentifizierung zur EinschrĂ€nkung des Zugriffs auf GraphQL und EdgeQL ĂŒber HTTP wurde hinzugefĂŒgt und ist standardmĂ€ĂŸig aktiviert.
  • Um den Authentifizierungsdienst, der unabhĂ€ngig von der Datenbankinstanz funktioniert, zu starten, wurde das Modul "auth" hinzugefĂŒgt, das OAuth oder die Anmeldung per E-Mail und Passwort unterstĂŒtzt.
  • Das Modul pgcrypto wurde hinzugefĂŒgt, das Funktionen fĂŒr hmac, gen_salt und crypt zur Hash- und VerschlĂŒsselung bereitstellt. select ext::pgcrypto::digest(‘encrypt this’, ‘sha1’);
  • Das Modul pg_trgm mit Funktionen zur Bestimmung der Ähnlichkeit von Zeichenfolgen wurde hinzugefĂŒgt.
  • Optimierungen wurden vorgenommen, die die Leistung erhöht haben. Der Speicherverbrauch wurde Server um 40 % gesenkt. Der Parsercode fĂŒr EdgeQL wurde in Rust neu geschrieben.
  • In die EdgeQL-Syntax wurde die UnterstĂŒtzung fĂŒr eine vertrautere Formulierung von bedingten AusdrĂŒcken (if 
 then .. else 
) integriert. Es wurde die Möglichkeit geschaffen, bedingte DML zum Erstellen, Aktualisieren und Löschen verschiedener Objekte basierend auf festgelegten Bedingungen zu verwenden. Funktionen wie to_bytes(), to_str(), enc::base64_encode und enc::base64_decode wurden hinzugefĂŒgt. In Triggern ist die Verwendung des Ausdrucks „when“ erlaubt. 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’);
  • Eine neue Methode zur Übergabe globaler Werte in GraphQL-Abfragen wurde hinzugefĂŒgt – anstelle der Verwendung eines separaten Feldes besteht die Möglichkeit, Variablen basierend auf dem Objekt __globals__ zu ĂŒbergeben.

    Quelle: opennet.ru
60GB SSD 8Gb DDR4