Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Drzewka w Mysql, Jak się obsługuje ten typ ?
astropanic
post 17.02.2007, 22:49:43
Post #1





Grupa: Zarejestrowani
Postów: 24
Pomógł: 0
Dołączył: 4.07.2006

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
prond
post 19.02.2007, 09:26:30
Post #2





Grupa: Zarejestrowani
Postów: 254
Pomógł: 10
Dołączył: 8.11.2006
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


Ż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.

Ten post edytował prond 19.02.2007, 09:28:11


--------------------
--------------------------------------------------------------------------------
weblog.axent.pl
--------------------------------------------------------------------------------
Go to the top of the page
+Quote Post
astropanic
post 19.02.2007, 16:39:32
Post #3





Grupa: Zarejestrowani
Postów: 24
Pomógł: 0
Dołączył: 4.07.2006

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
prond
post 19.02.2007, 16:49:42
Post #4





Grupa: Zarejestrowani
Postów: 254
Pomógł: 10
Dołączył: 8.11.2006
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


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;


--------------------
--------------------------------------------------------------------------------
weblog.axent.pl
--------------------------------------------------------------------------------
Go to the top of the page
+Quote Post
astropanic
post 19.02.2007, 20:05:29
Post #5





Grupa: Zarejestrowani
Postów: 24
Pomógł: 0
Dołączył: 4.07.2006

Ostrzeżenie: (0%)
-----


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

Ten post edytował astropanic 19.02.2007, 20:05:52
Go to the top of the page
+Quote Post
prond
post 20.02.2007, 09:33:58
Post #6





Grupa: Zarejestrowani
Postów: 254
Pomógł: 10
Dołączył: 8.11.2006
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


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).

Ten post edytował prond 20.02.2007, 09:34:35


--------------------
--------------------------------------------------------------------------------
weblog.axent.pl
--------------------------------------------------------------------------------
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 18.07.2025 - 00:24