2009-11-05 18 views
23

Próbuję zrobić model do kategoryzacji niektórych obiektów.Dniegowate drzewo Django jakie są różnice między AL, NS, MP

Próbowałem już za pomocą Django mptt łatwo odzyskać powiązane kategorie, a teraz szukam różnych rozwiązań, aby znaleźć najlepszy.

nie mogę dowiedzieć się, chociaż jakie są główne różnice między ścieżce, zmaterializowanych adjacency Lista i Zagnieżdżony Set. Wikipedia nie dał mi krótką odpowiedź, wiem tylko mptt jest prawdopodobnie Zagnieżdżony Set ...

Czy ktoś może mi to wyjaśnić w kilku słowach?

Odpowiedz

51

Łatwiej wytłumaczyć z przykładów niż kilka słów. Rozważ drzewo przykładowe, przechowując nazwy:

William 
    Jones 
    Blake  
     Adams   
    Tyler  
Joseph 
    Miller 
    Flint 

Ścieżka zmaterializowana oznacza, że ​​każdy węzeł przechowuje zakodowaną pełną ścieżkę. Na przykład, można przechowywać swój indeks używając kropki jako separatora

Name  Path 
William  1 
Jones  1.1 
Blake  1.2 
Adams  1.2.1 
Tyler  1.3 
Joseph  2 
Miller  2.1 
Flint  2.2 

So, Adams zna jego pełne imię to William Blake Adams, ponieważ ma ścieżkę 1.2.1, wskazując na węźle na pierwszym poziomie 1 - William - do węzła 1.2 na poziomie 2 - Blake - i 1.2.1 węzeł na poziomie 3 - Adams.

adjacency Lista oznacza drzewo jest przechowywana przez utrzymanie łącza do niektórych sąsiednich węzłów. Na przykład możesz zapisać, kto jest rodzicem i kto jest następnym rodzeństwem.

Name  Parent  Next 
William  null  Joseph 
Jones  William Blake 
Blake  William Tyler 
Adams  Blake  null 
Tyler  William null 
Joseph  null  null  
Miller  Joseph  Flint 
Flint  Joseph  null 

Zauważ, że może to być tak proste, jak tylko przechowywanie rodzica, jeśli nie musimy trzymać dzieci węzła zamówione. Teraz Adams może pobierać rekursywnie wszystkich swoich przodków do zera, aby znaleźć swoje pełne imię.

Zestawy zagnieżdżone oznaczają, że każdy węzeł jest przechowywany z pewnym indeksem, zwykle z lewą i prawą wartością, przypisywanym każdemu z nich podczas przemierzania drzewa w kolejności DFS, dzięki czemu wiadomo, że jego potomkowie mieszczą się w tych wartościach. Oto jak numery byłyby przypisane do przykładowego drzewa:

1 William 10 
    2 Jones 3 
    4 Blake 7 
     5 Adams 6 
    8 Tyler 9 
11 Joseph 16 
    12 Miller 13 
    14 Flint 15 

i byłoby przechowywane jako:

Name  left right 
William  1  10 
Jones  2  3 
Blake  4  7 
Adams  5  6 
Tyler  8  9 
Joseph  11  16 
Miller  12  13 
Flint  14  15 

Więc teraz Adams może znaleźć swoich przodków, badając, który ma niższą lewej i wyższą prawą wartość i posortuj je według lewej wartości.

Każdy model ma swoje mocne i słabe strony. Wybór, którego użyć, zależy od aplikacji, używanej bazy danych i najczęściej wykonywanych operacji. Możesz znaleźć dobre porównanie here.

Porównanie wspomina o czwartym modelu, który nie jest bardzo popularny (nie znam żadnej innej implementacji, ale mojej) i bardzo skomplikowany do wyjaśnienia w kilku słowach: Zagnieżdżony interwał poprzez kodowanie Matrix.

Po wstawieniu nowego węzła w zagnieżdżonego zestawu trzeba ponownie wyliczyć wszystkich, którzy przed nim na przechodzenie. Ideą odstępów zagnieżdżonych jest to, że istnieje nieskończona liczba liczb wymiernych między dowolnymi dwiema liczbami całkowitymi, więc możesz zapisać nowy węzeł jako ułamek poprzedniego i następnego węzła.Przechowywanie i odpytywanie frakcji może być kłopotliwe, a to prowadzi do techniki kodowania macierzy, która przekształca te frakcje w matrycę 2x2, a większość operacji może być wykonana za pomocą jakiejś algebry macierzy, która nie jest oczywista na pierwszy rzut oka, ale może być bardzo wydajna.

Drzewko ma bardzo prostą implementację każdego z Zmaterializowanej Ścieżki, Zestawów Zagnieżdżonych i Listy Przyległości, bez nadmiarowości. django-mptt w rzeczywistości używa kombinacji zestawów zagnieżdżonych i list relacji, ponieważ utrzymuje również link do elementu nadrzędnego i może go użyć do skuteczniejszego sprawdzania dzieci i odbudowywania drzewa w przypadku, gdy ktoś je zepsuł.

Powiązane problemy