Wydanie relacyjno-graficznej bazy danych EdgeDB 4.0

Wydano wersję bazy danych EdgeDB 4.0, implementującą model danych oparty na relacjach i grafach oraz język zapytań EdgeQL, zoptymalizowane do pracy z złożonymi danymi hierarchicznymi. Kod napisano w językach Python i Rust (parser oraz krytyczne dla wydajności części) i jest udostępniany na licencji Apache 2.0. Projekt rozwija się jako nakładka na PostgreSQL. Biblioteki klienckie są dostępne dla języków Python, Go, Rust, .NET, Elixir i TypeScript/Javascript. Udostępniane są także narzędzia wiersza poleceń do zarządzania bazą danych i interaktywnego wykonywania zapytań (REPL).

Zamiast modelu danych opartego na tabelach, w EdgeDB zastosowano deklaratywny system oparty na typach obiektowych. Zamiast kluczy obcych (foreign key) do określania powiązań między typami stosuje się łączenie przez odwołania (jeden obiekt może być używany jako właściwość innego obiektu).

type Person { required name: str; } type Movie { required title: str; multi 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.

Dla formułowania zapytań obsługiwany jest zarówno język zapytań GraphQL, jak i własny język EdgeDB, stanowiący adaptację SQL dla danych hierarchicznych. Zamiast list, wyniki zapytania są przedstawiane w postaci zorganizowanej, a zamiast podzapytań i operacji JOIN dostępna jest możliwość wskazania jednego zapytania EdgeQL jako wyrażenia wewnątrz innego zapytania. Obsługiwane są transakcje i 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’ } ) }

W nowej wersji:

  • Dodano wsparcie dla pełnotekstowego wyszukiwania, realizowane przez moduł plug-in fts. Aby przekształcić dowolny obiekt w dokument dostępny do wyszukiwania, należy użyć indeksu fts::index, a do wyszukiwania konkretnych fraz w zindeksowanych dokumentach zaproponowano funkcję fts::search(). Wyniki zwracane są w postaci krotek zawierających znaleziony obiekt i jego wagę wyszukiwania. Na przykład: 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;
  • Dodano nowy typ danych „multirange”, definiujący jeden lub kilka zakresów wartości do reprezentacji przerwanych przedziałów. Normalizacja nakładających się obszarów w określonych zakresach odbywa się automatycznie. Z typem „multirange” mogą pracować wszystkie wcześniej dostępne funkcje i operatory do przetwarzania zakresów. select multirange([range(8, 10)]) + range(1, 5) — range(3, 4);
  • Dodano i domyślnie włączono wsparcie dla uwierzytelniania, aby ograniczyć dostęp do GraphQL i EdgeQL przez HTTP.
  • Dodano rozszerzenie „auth” do uruchamiania usługi uwierzytelniania działającej niezależnie od instancji bazy danych, wspierające OAuth lub logowanie za pomocą e-maila i hasła.
  • Dodano rozszerzenie pgcrypto, które oferuje funkcje hmac, gen_salt i crypt do haszowania i szyfrowania. select ext::pgcrypto::digest(‘encrypt this’, ‘sha1’);
  • Dodano rozszerzenie pg_trgm z funkcjami do określania podobieństwa ciągów.
  • Wprowadzono optymalizacje, które pozwoliły na zwiększenie wydajności. Zużycie pamięci zostało serwerze zmniejszone o 40%. Kod parsera języka zapytań EdgeQL został przepisany w języku Rust.
  • Do języka EdgeQL dodano wsparcie dla bardziej znanej składni wyrażeń warunkowych (if … then .. else …). Umożliwiono użycie warunkowego DML do tworzenia, aktualizacji i usuwania różnych obiektów na podstawie zadanych warunków. Dodano funkcje to_bytes(), to_str(), enc::base64_encode oraz enc::base64_decode. W triggerach dozwolone jest użycie wyrażenia „when”. 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’);
  • Dodano nowy sposób przekazywania globalnych wartości w zapytaniach GraphQL — zamiast używać osobnego pola, wprowadzono możliwość przesyłania zmiennych na podstawie obiektu __globals__.

    Źródło: opennet.ru
Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS 🔥 Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS | ProHoster