Veröffentlichung von EdgeDB 4.0, einer relationalen Graph-Datenbank

Die Veröffentlichung von EdgeDB 4.0, einem Datenbanksystem, das ein relationales und graphbasiertes Datenmodell sowie die optimierte Abfragesprache EdgeQL zur Verarbeitung komplexer hierarchischer Daten implementiert, wurde angekündigt. Der Code ist in Python und Rust (für den Parser und performancekritische Teile) geschrieben und steht unter der Apache 2.0-Lizenz. Das Projekt entwickelt sich als Erweiterung von PostgreSQL. Client-Bibliotheken sind für die Programmiersprachen Python, Go, Rust, .NET, Elixir und TypeScript/Javascript verfügbar. Ein Befehlszeilenwerkzeug wird bereitgestellt, um die Datenbank zu verwalten und interaktive Abfragen (REPL) auszuführen.

Anstelle eines tabellenbasierten Datenmodells basiert EdgeDB auf einem deklarativen System aus objektbasierten Typen. Anstelle von Fremdschlüsseln (foreign keys) zur Bestimmung der Beziehungen zwischen den Typen wird eine Verlinkung durch Referenzen verwendet (ein Objekt kann als Eigenschaft eines anderen Objekts genutzt werden).

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

Zur Beschleunigung der Anfrageverarbeitung können Indizes verwendet werden. Es werden auch Funktionen wie strenge Typisierung von Attributen, Einschränkungen für Attributwerte, berechnete Attribute und gespeicherte Prozeduren unterstützt. Ein besonderes Merkmal des objektorientierten Speicherschemas von EdgeDB, das einem ORM ähnelt, ist die Möglichkeit, Schemas zu mischen, Attribute aus verschiedenen Objekten zu verknüpfen und die integrierte Unterstützung für JSON.

Integrierte Werkzeuge zur Migration des Speichschemas werden bereitgestellt — nach einer Änderung des Schemas, das in einer separaten esdl-Datei definiert ist, genügt es, den Befehl „edgedb migration create“ auszuführen, und das DBMS analysiert die Unterschiede im Schema und generiert interaktiv ein Skript für den Übergang zum neuen Schema. Die Historie der Schemaänderungen wird automatisch verfolgt.

Für die Abfrageerstellung werden sowohl die GraphQL-Abfragesprache als auch die eigene Sprache EdgeDB unterstützt, die eine Anpassung von SQL für hierarchische Daten darstellt. Anstelle von Listen werden die Abfrageergebnisse in strukturierter Form ausgegeben, 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 ebenfalls 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 durch ein Plug-in für fts implementiert. Um ein beliebiges Objekt in ein durchsuchbares Dokument zu verwandeln, sollte der Index fts::index verwendet werden. Für die Suche nach bestimmten Phrasen in den indizierten Dokumenten steht die Funktion fts::search() zur Verfügung. Die Ergebnisse werden in Form von Tupeln zurückgegeben, die das gefundene Objekt und dessen Suchgewicht enthalten. Beispielsweise: 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 sich überlappender Bereiche in den angegebenen Bereichen erfolgt automatisch. Mit dem Typ "multirange" können alle zuvor verfügbaren Funktionen und Operatoren zur Verarbeitung von Bereichen arbeiten. 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 standardmäßig aktiviert.
  • Ein Erweiterungspaket „auth“ wurde hinzugefügt, um einen Authentifizierungsservice zu starten, der unabhängig von der DB-Instanz funktioniert und Unterstützung für OAuth oder den Login per E-Mail und Passwort bietet.
  • Das Erweiterungspaket pgcrypto wurde hinzugefügt, das Funktionen wie hmac, gen_salt und crypt für Hashing und Verschlüsselung bereitstellt. select ext::pgcrypto::digest(‘encrypt this’, ‘sha1’);
  • Das Erweiterungspaket pg_trgm wurde mit Funktionen zur Bestimmung der Ähnlichkeit von Zeichenfolgen hinzugefügt.
  • Optimierungen wurden vorgenommen, die zu einer Leistungssteigerung führten. Der Speicherverbrauch wurde um Server 40 % reduziert. Der Parser-Code für EdgeQL-Anfragen wurde in Rust neu geschrieben.
  • Die Sprache EdgeQL unterstützt nun eine geläufigere Syntax für bedingte Ausdrücke (if … then … else …). Es wurde die Möglichkeit geschaffen, bedingte DML zu verwenden, um verschiedene Objekte basierend auf festgelegten Bedingungen zu erstellen, zu aktualisieren und zu löschen. Die Funktionen 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 Übertragung globaler Werte in GraphQL-Anfragen wurde eingeführt – anstelle eines separaten Feldes besteht die Möglichkeit, Variablen basierend auf dem Objekt __globals__ zu übergeben.

    Quelle: opennet.ru
Kaufen Sie zuverlässiges Hosting für Websites mit DDoS-Schutz, VPS VDS-Server 🔥 Kaufen Sie zuverlässiges Hosting für Websites mit DDoS-Schutz, VPS VDS-Server | ProHoster