2011-11-15 43 views
7

Podczas odtwarzania mojego CMS chciałem alternatywę dla tradycyjnego podejścia rodzic/dziecko do zarządzania hierarchią mapy/strony. Pamiętałem, jak jakiś czas temu zobaczyłem zagnieżdżony model, ale nie mogłem sobie przypomnieć, jak się nazywało. Tak więc natknąłem się na podobne podejście, które chcę ocenić i porównać z właściwościami, upewniając się, że później nie będę narażony na głupie ograniczenia, ponieważ nie poszedłem na to, co już zostało przetestowane. Tak więc, proszę doradzić, jeśli A) zostało już wynalezione (jak to się nazywa ?!), B) istnieją zasadnicze wady właściwości lub C) jest to dobre podejście (proszę podać dobre uzasadnienie!).Moje alernatywne do zestawów zagnieżdżonych dla hierarchicznych zestawów danych o dowolnej głębokości: Dobra lub Zła?

Rozważmy tę listę:

  • Home
    • O nas
    • Kontakt
    • Produkty
      • Odzież
      • Książki
      • Electronics
    • Baza wiedzy
    • Inne rzeczy

Pod model zbiorów zagnieżdżonych, wierzę, można przechowywać w lewo/prawo deskryptory dla każdego węzła o głębokości pierwszego przechodzenia:

Home     1-18 
    About Us   2-3 
    Contact Us  4-5 
    Products   6-13 
     Clothing  7-8 
     Books   9-10 
     Electronics 11-12 
    Knowledge Base 14-15 
    Other stuff  16-17 

Oto moja "zła droga", którą zaczynam lubić:

Home     1-9 
    About Us   2-2 
    Contact Us  3-3 
    Products   4-7 
     Clothing  5-5 
     Books   6-6 
     Electronics 7-7 
    Knowledge Base 8-8 
    Other stuff  9-9 

Zamiast pary lewej/prawej przechowuję identyfikator i LAST_CONTAINED_ID. Okazało się, że wiele z tych właściwości są takie same (lub bardzo podobne):

  • Węzeł główny jest ID = 1
  • Na „liście”, zarówno właściwości są równe, natomiast z oddziałów, nie są one
  • całkowita liczba „podwęzłów” dla danego węzła jest LAST_CONTAINED_ID - ID
  • Wszystkie zawarte węzły mają identyfikator> ID kontenera, ale < = LAST_CONTAINED_ID kontenera
  • węzły przodek mieć identyfikator < dziecka ID , ale także LAST_CONTAINED_ID> = identyfikator podrzędny
  • Głębokość jest sumą przodka węzłów

Dodatkowo, ID służy do konkretnego zamówienia, unikalny identyfikator (bez luk!). Zauważyłem, że łatwiej jest przechowywać referencje DEPTH i PARENT dla uproszczenia, ale to samo dotyczy zestawów zagnieżdżonych z tego, co rozumiem.

Czy to jest liczone jako zestaw zagnieżdżony? I czy to już jest wspólne podejście (ale dlaczego wcześniej o tym nie słyszałem ...)? Czy istnieje dobry powód, dla którego powinienem używać w tym celu zestawu zagnieżdżonego?

Witam Twoje myśli.

+0

FYI, model zestawu zagnieżdżonego jest sposobem posiadanie pojedynczej tabeli w magazynie RDBMS wszystkich informacji potrzebnych dla hierarchii o nieznanej głębokości (tj. nieskończonej liście bez rekursji): http://pl.wikipedia.org/wiki/Nested_set_model#Przykład – landons

Odpowiedz

4

Jedyną korzyścią, jaką daje, jest funkcja "brak luk", ale aby to osiągnąć, trzeba było zmienić logikę zastosowaną do prawidłowych wartości. W oryginalnym modelu otrzymujesz dzieci z "Produktów" widząc wszystkie te wartości 6 < .. < 13, ale w twoim modelu otrzymujesz te dzieci, widząc wartości 4 < .. < = 7. Mając do czynienia z prawami wartości różne od lewych wartości sprawiają, że jest nieco mniej elegancki.
Innym drobnym problemem jest to, że w oryginale, skok od 12 do 14 podkreśla, że ​​zmieniłeś poziom, podczas gdy w twoim modelu nie masz takich wizualnych wskazówek.
Więc jeśli jesteś szczęśliwy używając (<, < =) zamiast (<, <) to działa. (Ponieważ wygląda na to, że jest równoważny, nie mogę powiedzieć "dobry" lub "zły", ale już podkreśliłeś niebezpieczeństwa związane z implementacją ścieżki, która była mniej podróżowana.)

+2

Myślę, że masz rację o skoku od 12-14. Wierzę, że to prawda (w zwykłych zestawach zagnieżdżonych), że dla dowolnego węzła 'n1', jeśli istnieje węzeł,' n2', z 'n1.right + 1' ==' n2.left', to 'n2' jest następne rodzeństwo (i podobnie jak na lewo), które zaginęło w tym nowym modelu. –

+0

Dokładnie tego szukałem! (Chociaż miałem nadzieję uzyskać więcej informacji zwrotnych, ale jest to pomocne.) – landons

+1

Znalazłem kilka innych właściwości, które mi się podobają, takie dostosowanie wartości przy wstawianiu/usuwaniu w danym indeksie jest bardzo proste. Usunięcie gałęzi spowoduje, że wszystkie dzieci będą miały domyślnie wyższy poziom (jest to dobra alternatywa dla usuwania kaskadowego dla tradycyjnego ustawienia klucza obcego nadrzędny-podrzędny). Myślę, że można żyć bez prostoty nextSlingling(). – landons

Powiązane problemy