Veröffentlichung des relationalen Graphen-Datenbankmanagementsystems EdgeDB 5.0

Die Version 5.0 des EdgeDB-Datenbankverwaltungssystems ist jetzt verfügbar und implementiert ein relationales-graphbasiertes Datenmodell sowie die EdgeQL-Abfragesprache, die für die Arbeit mit komplexen hierarchischen Daten optimiert ist. Das Projekt entwickelt sich als Erweiterung von PostgreSQL, dessen Code in Python und Rust (Parser und leistungsrelevante Komponenten) geschrieben wurde und unter der Lizenz Apache 2.0 verbreitet wird. Client-Bibliotheken sind für die Programmiersprachen Python, Go, Rust, .NET, Elixir und TypeScript/Javascript verfügbar. Es wird ein Kommandozeilenwerkzeug zur Verwaltung der Datenbank und zur interaktiven Ausführung von Abfragen (REPL) 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; }

Die Möglichkeiten umfassen strikte Typisierung von Eigenschaften, Einschränkungen der Eigenschaftswerte, berechnete Eigenschaften und gespeicherte Prozeduren. Ein besonderes Merkmal des EdgeDB-Datenmodells, das einer ORM ähnelt, ist die Möglichkeit, Schemata zu mischen, Eigenschaften aus verschiedenen Objekten zu verknüpfen und die integrierte Unterstützung für JSON. Indizes können zur Beschleunigung der Abfrageverarbeitung verwendet werden.

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 Erstellung von Abfragen wird die Abfragesprache GraphQL sowie die eigene EdgeDB-Sprache unterstützt, die eine Anpassung von SQL für hierarchische Daten darstellt. Anstelle von Listen werden die Ergebnisse der Abfrage strukturiert dargestellt, und anstelle von Unterabfragen und JOIN-Operationen besteht die Möglichkeit, eine Abfrage in EdgeQL 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 das "Branching" wurde hinzugefügt, sodass beim Arbeiten mit Daten und Schemata das Konzept von Branches angewendet werden kann, wie es in Versionsverwaltungssystemen verwendet wird. Anstelle des Begriffs "Datenbank" wird im neuen Release der Begriff "Branch" vorgeschlagen, während die Befehle "create database" und "drop database" als veraltet erklärt wurden und stattdessen die neuen Befehle "create empty branch" und "drop branch" empfohlen werden. Neben leeren Branches können mit den Befehlen "create schema branch" und "create data branch" Abzweigungen von bestehenden Branches und Datenbanken erstellt werden, indem deren Speicherschema und Daten kopiert werden.

    Aus praktischer Sicht ermöglicht die Unterstützung von Branches die Synchronisierung von Daten mit dem Code, der zu deren Verarbeitung verwendet wird, und dabei die Kompatibilität mit altem Code beizubehalten. Zum Beispiel kann nach der Aktualisierung des Codes ein neuer Datenbranch angebunden werden, der die im Code vorgenommenen Änderungen bezüglich des Speicherschemas berücksichtigt. Die beschriebene Funktionalität ist nützlich, um die Entwicklung und das Testen neuer Softwareversionen zu vereinfachen; nach deren Fertigstellung genügt es, auf den bereits getesteten Branch umzuschalten.

  • Im pgvector-Extension, das für die effiziente Speicherung und Abfrage von Vektoren verwendet wird, wurde ein neuer Typ von Indexen HNSW (Hierarchical Navigable Small Worlds) hinzugefügt, der, analog zum IVFFlat-Index, in drei Varianten verfügbar ist: ext::pgvector::hnsw_euclidean, ext::pgvector::hnsw_ip und ext::pgvector::hnsw_cosine. Darüber hinaus wurden die Möglichkeiten zur Feinabstimmung der Indizes über das Objekt ext::pgvector::Config erweitert.
  • Zusätzliche Authentifizierungsmöglichkeiten wurden hinzugefügt. Im auth-Extension wurde die Unterstützung für passwortlose Authentifizierungsschemata WebAuthn (Passkeys) und „magic links“ (auf Basis von E-Mail) implementiert. Es wurde die Nutzung der Plattformen Slack und Discord als OAuth-Anbieter hinzugefügt.
  • Leistungsoptimierungen wurden umgesetzt. In der Implementierung des Caches mit Abfragekompilierungsergebnissen wurde der Zustand zwischen Neustarts gespeichert und eine automatische Rekompilierung nach Migration hinzugefügt. Die Geschwindigkeit im Umgang mit großen Speicherschemata wurde erhöht.
  • In der Abfragesprache EdgeQL ist es erlaubt, das Schlüsselwort „union“ in den Basisabfragen, in denen die Ausdrücke insert, update oder delete verwendet werden, nicht anzugeben.
  • Der Befehl vacuum() wurde hinzugefügt, um die Datenbankinhalte zu säubern, zu optimieren und zu verpacken.
  • Die Datentypen conversion zwischen bytes und den Typen int16, int32, int64 und uuid ist nun erlaubt, unter Verwendung der Funktionen to_bytes(), to_uuid() und to_int*().
  • Die Möglichkeit, alle Verbindungen zur Datenbank nach der Ausführung der Operation „drop database“ zu schließen, wurde hinzugefügt.

Quelle: opennet.ru

60GB SSD 8Gb DDR4