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
