Dobry przegląd
Mówiąc ogólnie, podejmujesz decyzję pomiędzy szybkim czasem odczytu (na przykład zestawem zagnieżdżonym) lub szybkim czasem zapisu (lista sąsiadów). Zwykle kończy się kombinacją poniższych opcji, które najlepiej pasują do twoich potrzeb. Poniżej przedstawiono dogłębną lekturę:
- Jeszcze jedno porównanie przedziałów zagnieżdżonych a porównanie listy adiakencji : najlepsze porównanie , jakie znalazłem, listy adiakencji, zmaterializowanej ścieżki, zestawu zagnieżdżonego i przedziału zagnieżdżonego.
- Modele danych hierarchicznych : slajdy z dobrymi objaśnieniami dotyczącymi kompromisów i przykładowego użycia
- Reprezentowanie hierarchii w MySQL : szczególnie bardzo dobry przegląd zestawu zagnieżdżonego
- Hierarchiczne dane w RDBMS : najbardziej kompleksowy i dobrze zorganizowany zestaw linków, jaki widziałem, ale niewiele w wyjaśnieniu
Opcje
Te, które znam i ogólne cechy:
- Lista adiakencji :
- Kolumny: ID, ParentID
- Łatwy do wdrożenia.
- Tanie przesuwanie, wstawianie i usuwanie węzłów.
- Drogie, aby znaleźć poziom, pochodzenie i potomkowie, ścieżkę
- Unikaj N + 1 poprzez wspólne wyrażenia tabel w bazach danych, które je obsługują
- Zestaw zagnieżdżony (znany również jako zmodyfikowane przemierzanie drzewa w przedsprzedaży )
- Kolumny: lewy, prawy
- Tanie pochodzenie, potomkowie
- Bardzo drogie
O(n/2)
ruchy, wstawianie, usuwanie z powodu niestabilnego kodowania
- Stolik pomostowy (inaczej zwany stołem zamknięcia / wyzwalaczami )
- Używa oddzielnej tabeli łączenia z: przodkiem, potomkiem, głębokością (opcjonalnie)
- Tanie pochodzenie i potomkowie
- Zapisuje koszty
O(log n)
(wielkość poddrzewa) dla wstawiania, aktualizacji, usuwania - Znormalizowane kodowanie: dobre dla statystyk RDBMS i planowania zapytań w złączeniach
- Wymaga wielu wierszy na węzeł
- Kolumna linii (aka zmaterializowana ścieżka , wyliczenie ścieżki)
- Kolumna: rodowód (np. / Rodzic / dziecko / wnuk / etc ...)
- Tanie potomkowie poprzez zapytanie o prefiks (np.
LEFT(lineage, #) = '/enumerated/path'
) - Zapisuje koszty
O(log n)
(wielkość poddrzewa) dla wstawiania, aktualizacji, usuwania - Nierelacyjny: opiera się na typie danych macierzy lub formacie ciągu szeregowego
- Zagnieżdżone interwały
- Jak zestaw zagnieżdżony, ale z rzeczywistym / zmiennoprzecinkowym / dziesiętnym, dzięki czemu kodowanie nie jest ulotne (niedrogi ruch / wstaw / usuń)
- Ma problemy z rzeczywistą / zmienną / dziesiętną reprezentacją / precyzją
- Wariant kodowania matrycowego dodaje kodowanie przodka (zmaterializowaną ścieżkę) dla „wolnego”, ale z dodatkową trudnością algebry liniowej.
- Płaski stół
- Zmodyfikowana lista Adjacency, która dodaje kolumnę Poziom i Pozycja (np. Kolejność) do każdego rekordu.
- Tanie iteracja / paginacja
- Drogie przenoszenie i usuwanie
- Dobre wykorzystanie: dyskusja w wątkach - komentarze na forach / blogach
- Wiele kolumn linii
- Kolumny: jedna dla każdego poziomu linii, odnosi się do wszystkich rodziców aż do katalogu głównego, poziomy w dół od poziomu elementu są ustawione na NULL
- Tanie przodkowie, potomkowie, poziom
- Tanie wstawianie, usuwanie, przenoszenie liści
- Drogie wstawianie, usuwanie, przenoszenie wewnętrznych węzłów
- Twardy limit głębokości hierarchii
Uwagi dotyczące bazy danych
MySQL
Wyrocznia
- Użyj CONNECT BY, aby przeglądać listy Adjacency
PostgreSQL
- Typ danych dla ścieżki zmaterializowanej
SQL Server
- Ogólne podsumowanie
- Oferty z 2008 r. Typ danych HierarchyId wydaje się pomagać w podejściu do kolumny linii i zwiększać głębokość, którą można przedstawić.
Closure Tables
są lepszeAdjacency List
,Path Enumeration
aNested Sets
pod względem łatwości użycia (i zgaduję wydajności, jak również).