Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Drzewo depesza - pobieranie drzewa
Forum PHP.pl > Forum > Bazy danych > MySQL
acidm
Witam !

Zaznajamiam się właśnie z drzewkami w mysql i mam takie pytanie..
Jak za pomocą jednego zapytania pobrac cale drzewo depesza wraz z strukturą w taki sposób aby odtworzyć całą strukturę w php np. do postaci tablicy wielowymiarowej?

Widziałem przykłady na postgressa wykorzystujące funkcje czy procedury do stworzenia struktury w postaci sciezek ale to rozwiązanie nie przypadło mi do gustu.

alegorn
wyszukaj na tym forum, wątków o drzewkach, sam w kilku się rozpisywałem, więc wiem że takowe istnieją wink.gif

drzewko, moim skromnym zdaniem trzeba dobierać wg potrzeb, nie ma jednego optymalnego rozwiązania.


j.
acidm
Przegłądałem posty na forum i nie znalazłem w nich odpowiedzi na moje pytanie ...
W wynikach z google widziałem metode depesza która w wyniku końcowym zwracałe strukture drzewek w postaci ścieżki , wiec tak się zastanawiam że zamiast drzewka depesza można by zimplementować drzewko ip...
Lub drzewko depesza w którym można odtworzyć pełną strukturę w php jednym zapytaniem ,jeśli tak się da oczywiście??
alegorn
uf.
Drzewko depesza to takie z parent_id? przedstaw szerzej o czym piszesz.
jeśli tak, to nie ma takiego polecenia sql, które by dało rade za jednym razem wyciągnąć cala ułożoną w strukturę.

jeśli potrzebujesz coś takiego - to drzewa typu nested set. wyciągnięcie posortowanej struktury jednej gałęzi czy całego drzewka jest tam bardzo uproszczone (w zamian masz bardziej skomplikowane wszelkie modyfikacje)

powiedz, co chcesz osiągnąć, a może uda się jakoś bardziej ci podpowiedzieć.

jeśli chodzi Ci tylko o teorie - to ja znam jakieś cztery typy drzewek, każde z nich ma swoje zalety i wady. kwestia umiejętności wybrania odpowiedniego algorytmu, dla konkretnego problemu, ewentualnie niekiedy hybrydy powyższego, ale to już świadomie trzeba się na to decydować.

j.
acidm
Drzewko depesza jest rozdzielone na dwie tabele , pierwsza tabel ma pola id,nazwa a w drugiej tabeli są pola id_rodzica,id_dziecka,głębokość.

Zna ktoś jekieś proste przykłady na odtworzenie struktury calego dzrewka???Najlepiej łopatologiczne bo już zeza dostaje :|
Czy cheć obróbki takiego zapytania na drzewo w php z mojej strony jest wogóle dobrym ppomysłem ??Zastanawiam się czy nie powinna się tym zajmować baza?

A teraz z innej beczki jest możliwość w drzewku IP poukładać strukturę calego drzewa bez uzycia rekurencji odnośnie pola id_parent ?
(drzewko ip o które mi chodzi sklada się z id, nazwy, id_rodzica, ip, głębokości )

PS ogółem potrzebuje drzewka prostego w implementacji i modyfikacji
alegorn
czyli coś a'la tabela domknięcia. chyba.
ciekawe rozwiązanie, pozwala na użycie jednego elementu w wielu miejscach drzewa, chyba jedyna taka struktura.
ja osobiście nie korzystam z tej struktury ale:

pobranie potomnych dla konkretnego elementu to:
  1. SELECT k.*
  2. FROM komentarze k
  3. JOIN sciezka s ON k.id_komentarza = s.id_child
  4. WHERE s.id_parent =4

to powinno dac ci cala galez drzewa od id 4

w gore to bedzie jakos tak:
  1. SELECT k.*
  2. FROM komentarze k
  3. JOIN sciezka s ON k.id_komentarza = s.id_parent
  4. WHERE s.id_child = 6



dobry opis tego drzewa masz w ksiazce : antywzorce jezyka sql
acidm
hehe to akurat wiem smile.gif

Tylko jak po pobraniu tych wszystkich wezłow potomnych danego elementu odtworzyć strukturę ,tak aby nie wykonywac już węcej zapytan?
alegorn
nie uzywalem tego, wiec nie chce sie wypowiadac.
ale skoro masz lvl i parent_id, to zawsze w php funkcją rekurencyjną jestes wstanie to ogarnac.

mar1aczi
Coś w ten deseń: http://piotrekkr.info/2009/08/me-vs-tree-c...-w-mysql-i-php/ ?
alegorn
w podanym linku masz hybrydę nested set i metody opartej na parent_id.

coś takiego charakteryzuje się całkiem niezłym pobieraniem drzewa, ale jest dość skomplikowane przy aktualizowaniu.
dla metody z parent_id, nie ma opcji by łatwo wyciągnąć drzewo. chyba, że zakładamy iż drzewko ma np. max 4 poziomy, i więcej ich nie będzie. wtedy da się na sztywno porobic odpowiednią ilość joinow.

j.
alegorn
ok, kursory w procedurach - ok, to da rade, ale czy to jest łatwe..?

tak jak pisałem wcześniej, trzeba poznać tych kilka rozwiązań, i świadomie wybierać najlepsze dla konkretnego zadania.
j.
acidm
Cytat(alegorn @ 1.02.2013, 13:48:19 ) *
ok, kursory w procedurach - ok, to da rade, ale czy to jest łatwe..?

Właśnie smile.gif

NestedSets mnie nie interesują (aktualnie , może kiedyśsmile.gif) ale dzieki za linki smile.gif

Tak na marginesie czy funkcje skladwane mogą wyciagac dane z bazy ? Pytam bo jak przerabiam przykladzik
http://diabl0.gazeta.ie/2009/03/drzewo-dep...ql-ciag-dalszy/
to w mysql mi zwraca błąd ?

Pomijając drzewko depesza (najpierw muszę się zaznajomić z procedurami i funkcjami skladowanymi bo jestem z nich zielony :] )
macie może pomysł jak w drzewku ip :
http://www.binboy.org/mysql/articles/575/D..._metoda_IP.html

na wyciągniętych już elegancko danych ,odtworzyc je .Podany tam przyklad stosuje ip do wyciągniecia wezla z potomkami co sprawdza się pieknie:) ale już przetwarzane rekordy sklejane są rekunrencyjnie po id_parent w php ...
W przypadku zagnieżdżeń do 100 jest ok , ale co dalej..
Maci może pomysł jak to zmienić ?
Do dyspozycji sa pola ip, id_rodzica ,id,głębokość.
Może dało by się ułożyć takie drzewko w listy zagnieżdżone prze iteracjęquestionmark.gif?
I jeszcze jedno powiedźcie mi proszę czy jakbym zmienił typ pola ip z CHAR na TEXT to spadek wydajniości byłby znaczny?
Pytam ponieważ pole ip ma typ CHAR a co za tym idzie samo w sobie nie pozwoli na zbyt wiele zagnieżdżeń,więc trzeba by zmienic na typ TEXT ale jeśli to oznacza duży spadek wydajności to trzeba będzie ograniczyć się do pola CHAR->czyli mniejszej ilości zagłebień w drzewie , i wtedy nie ma się co przejmować ograniczeniami rekurencji w php.
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.