Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Drzewka w Mysql
Forum PHP.pl > Forum > Bazy danych > MySQL
astropanic
Witam.

http://fungus.teststation.com/~jon/treehan...reeHandling.htm

Ma ktoś więcej informacji o tego typu implementacji drzewa w MySQL ?
Jak pobrać całe drzewo z wartością zagnieżdżenia każdego elementu ?

Pozdrawiam
prond
Żeby pobrać wszystkie węzły, które znajdują się w poddrzewie węzła o id = 123 wystarczy taka kwerenda :

  1. SELECT
  2. DATA.*
  3. FROM DATA LEFT OUTER JOIN path
  4. ON (DATA.id = path.id)
  5. WHERE path.ancestorid = 123;


Jak chcesz dodać do tego wartość zagnieżdżenia (rozumiem, że chodzi Tobie o głębokość) to wystarczy tak :

  1. SELECT
  2. DATA.id,
  3. count(path.*) AS depth
  4. FROM DATA LEFT OUTER JOIN path
  5. ON (DATA.id = path.id)


Problem z tą reprezentacją polega na tym, że brakuje w niej informacji o kolejności węzłów.
Można to naturalnie dodać do tabeli data.
astropanic
Dziekuje,
Ma ktos pomysl jak pobrac kolejnosc elementow ?
Generalnie chodzi mi o to ze chcialbym to wykorzystac do generowania drzewa znacznikami {tree} w nowym opt (1.1.0), w tym celu kolejnosc wezlow jest wymagana.

Pozdrawiam
prond
Dodałbym do tabeli data kolumnę 'weight', w której będą przechowywane informacje o położeniu węzła w gałęzi drzewka.

Teraz zapytanie może wyglądać tak :
  1. SELECT
  2. DATA.id,
  3. DATA.weight,
  4. count(path.*) AS depth
  5. FROM DATA LEFT OUTER JOIN path
  6. ON (DATA.id = path.id)
  7. GROUP BY
  8. DATA.id,
  9. DATA.weight
  10. ORDER BY depth ASC, DATA.weight ASC;
astropanic
To nie jest dobre rozwiązanie ze względu na konieczność przebudowania całej części drzewa pod którą wstawiasz element.
Załóżmy że masz po kolei elementy 1,2,3,4,5 załóżmy że między 2 a 3 chcesz wstawić kolejny, musisz wtedy zmienić poziomy elementów od 3 do końca. Doszliśmy do tego samego problemu co przy 'nested sest', mimo to dziękuję za podrzucenie pomysłu smile.gif
prond
Jeżeli chcesz mieć komplet informacji (ścieżka, kolejność) o każdym węźle drzewa to nie obejdziesz się bez operacji wymagających przebudowy części lub nawet całości drzewa.

Moim zdaniem nie jest to poważny problem - mając takie narzędzia jak transakcje, procedury składowe i triggery możecie osiągnąć zadowalający efekt.

Sam korzystam z drzewka opisanego mniej więcej tak :

id | parent_node_id | path
1 | NULL | .1
2 | NULL | .2
3 | 2 | .2.1

Do rozwiązań, które wykorzystują MySQL jest to model jak najbardziej zadowalający.
Jego wadą jest naturalnie ograniczenie na głębokość drzewa i ilość jego węzłów narzucane przez długość pola 'path'. Ale tak jak wcześniej napisałem jeżeli przewidywałbym, że będzie tam przechowywane tak duże drzewo nie zdecydowałbym się nigdy na MySQL.

Jak tylko znajdę trochę więcej czasu opublikuję tu na forum pełną implementację takiego drzewka (tabele, ograniczenia, procedury, triggery).
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.