Dostępna jest pierwsza stabilna wersja systemu zarządzania bazami danych EdgeDB, który stanowi nakładkę na PostgreSQL, realizując model danych relacyjno-grafowych oraz język zapytań EdgeQL, zoptymalizowany do pracy z złożonymi danymi hierarchicznymi. Kod napisany jest w językach Python i Rust i jest dostępny na licencji Apache 2.0. Przygotowane są biblioteki klienckie dla języków Python, Go, Rust oraz TypeScript/Javascript. Oferowane jest narzędzie wiersza poleceń do zarządzania systemem zarządzania bazami danych oraz interaktywnego wykonywania zapytań (REPL).
Zamiast modelu danych opartego na tabelach, w EdgeDB stosuje się deklaratywny system oparty na typach obiektowych. Zamiast kluczy obcych (foreign key) do definiowania powiązań między typami stosuje się powiązania za pomocą linków (jeden obiekt może być używany jako właściwość innego obiektu). type Person { required property name -> str; } type Movie { required property title -> str; multi link actors -> Person; }
Aby przyspieszyć przetwarzanie zapytań, mogą być stosowane indeksy. Obsługiwane są również takie funkcje jak ścisła typizacja właściwości, ograniczenia wartości właściwości, właściwości obliczeniowe i procedury składowane. Z charakterystyk obiektowego schematu przechowywania EdgeDB, który przypomina ORM, można zauważyć możliwość mieszania schematów, wiązania właściwości z różnych obiektów oraz zintegrowane wsparcie dla JSON.
Dostarczane są wbudowane narzędzia do migracji schematu przechowywania – po zmianie schematu, określanego w oddzielnym pliku esdl, wystarczy wykonać polecenie 'edgedb migration create', a baza danych przeanalizuje różnice w schemacie i interaktywnie wygeneruje skrypt na przejście do nowego schematu. Historia zmian schematu jest automatycznie śledzona.
Do formułowania zapytań wspierany jest zarówno język zapytań GraphQL, jak i własny język EdgeDB, będący adaptacją SQL do danych hierarchicznych. Zamiast list, wyniki zapytania są przedstawiane w formie zorganizowanej, a zamiast podzapytania i operacji JOIN, można wskazać jedno zapytanie EdgeQL jako wyrażenie występujące w innym zapytaniu. Obsługiwane są transakcje oraz pętle. 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’ } ) } for number in {0, 1, 2, 3} union ( select { number, number + 0.5 } );
Źródło: opennet.ru
