Dostępna jest wersja bazy danych EdgeDB 5.0, która implementuje relacyjno-graficzny model danych oraz język zapytań EdgeQL, zoptymalizowane do pracy z złożonymi danymi hierarchicznymi. Projekt rozwija się w formie nakładki na PostgreSQL, którego kod został napisany w językach Python i Rust (parser oraz krytyczne dla wydajności części) i udostępniany jest na licencji Apache 2.0. Przygotowano biblioteki klienckie dla języków Python, Go, Rust, .NET, Elixir i TypeScript/Javascript. Oferowane są narzędzia wiersza poleceń do zarządzania bazą danych oraz 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; }
Obsługiwane są takie możliwości jak ścisła typizacja właściwości, ograniczenia wartości właściwości, właściwości obliczeniowe oraz procedury składowane. Do cech obiektowego schematu przechowywania w EdgeDB, który przypomina ORM, należy możliwość mieszania schematów, łączenia właściwości z różnych obiektów oraz zintegrowane wsparcie dla JSON. Aby przyspieszyć przetwarzanie zapytań, mogą być stosowane indeksy.
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 formowania zapytań obsługiwany jest język zapytań GraphQL oraz autorski język EdgeDB, który stanowi adaptację SQL do danych hierarchicznych. Zamiast list, wyniki zapytania prezentowane są w zorganizowanej formie, a zamiast podzapytań i operacji JOIN istnieje 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 gałęzi («branching»), umożliwiające korzystanie z koncepcji gałęzi w pracy z danymi i schematami, stosowanej w systemach kontroli wersji. Zamiast terminu „baza danych” w nowej wersji wprowadzono pojęcie „gałąź” (branch), a komendy „create database” i „drop database” zostały uznane za przestarzałe i zastąpione nowymi komendami „create empty branch” oraz „drop branch”. Oprócz pustych gałęzi, przy pomocy komend „create schema branch” i „create data branch” można tworzyć odgałęzienia od istniejących gałęzi oraz baz danych, kopiując z nich schemat przechowywania oraz dane.
Z praktycznego punktu widzenia, wsparcie gałęzi pozwala synchronizować dane z kodem używanym do ich przetwarzania, jednocześnie zachowując zgodność ze starszym kodem. Na przykład, po aktualizacji kodu można podłączyć do niego nową gałąź danych, uwzględniającą zmiany wprowadzone w schemacie przechowywania. Rozważaną funkcjonalność można wygodnie wykorzystać do uproszczenia rozwoju oraz testowania nowych wersji oprogramowania, po których gotowości wystarczy przełączyć się na już przetestowaną gałąź.
- W rozszerzeniu pgvector, stosowanym do efektywnego przechowywania i zapytywania o wektory, dodano nowy typ indeksów HNSW (Hierarchical Navigable Small Worlds), który, na wzór indeksu IVFFlat, dostępny jest w trzech wariantach: ext::pgvector::hnsw_euclidean, ext::pgvector::hnsw_ip oraz ext::pgvector::hnsw_cosine. Ponadto, w pgvector rozszerzono możliwości precyzyjnego dostosowania indeksów za pomocą obiektu ext::pgvector::Config.
- Dodano dodatkowe możliwości uwierzytelniania. W rozszerzeniu auth wprowadzono wsparcie dla bezhasłowych schematów uwierzytelniania WebAuthn (Passkeys) oraz „magic links” (na bazie email). Dodano wsparcie dla użycia platform Slack oraz Discord jako dostawców OAuth.
- Wprowadzono optymalizacje wydajności. W realizacji pamięci podręcznej z wynikami kompilacji zapytań zapewniono zachowanie stanu między ponownymi uruchomieniami oraz dodano automatyczną rekompilację po migracji. Zwiększono szybkość pracy z dużymi schematami przechowywania.
- W języku zapytań EdgeQL w wyrażeniu „for” pozwolono nie wskazywać słowa kluczowego „union” w podstawowych zapytaniach, w których używane są wyrażenia insert, update lub delete.
- Dodano komendę vacuum() do czyszczenia, optymalizacji i pakowania zawartości bazy danych.
- Zezwolenie na konwersję danych między typem bytes a typami int16, int32, int64 i uuid, przy użyciu funkcji to_bytes(), to_uuid() i to_int*().
- Dodano możliwość zamknięcia wszystkich połączeń z bazą danych po wykonaniu operacji „drop database”.
Źródło: opennet.ru
