![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 179 Pomógł: 0 Dołączył: 8.10.2004 Ostrzeżenie: (0%) ![]() ![]() |
Witam,
Piszę ten temat bo ogarnęła mnie już całkowita niemoc. Próbuję zaimplementować jakiś sensowny algorytm drzewek do mojego CMFa. Nie chcę korzystać z Nested Sets (left, right), bo to kompletnie nie nadaje się do większych drzew. Znalazłem coś takiego: http://fungus.teststation.com/%7Ejon/treeh...reeHandling.htm Metoda bardzo fajna, ale utknąłem na jednej bardzo istotnej rzeczy - wyświetlaniu drzewa. Teoretycznie, zgodnie z tym co piszą w artykule, by pobrać drzewo (lub daną część drzewa) wystarczy użyć zapytania: Select Id from Path where AncestorId = 2 Przypuśćmy, że drzewo wygląda tak: Kod rośliny (1) / \ / \ / \ / \ owoce(2) warzywa(3) / / banan(4) (gdzie cyfry w nawiasach to numery ID elementów -- 'banan' został dodany później niż 'warzywa'). W tym wypadku, używając powyższego zapytania dostanę: Kod Rośliny Owoce Warzywa Banan Czy jest jakiś sensowny sposób, by pobrać odpowiednio posortowane drzewo korzystając z powyższego przykładu? A może znacie jakieś inne efektywne sposoby przechowywania drzew w bazie danych? Zależy mi przede wszystkim na efektywności i elastyczności. Nested Sets odpadają (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif) |
|
|
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 1 597 Pomógł: 30 Dołączył: 19.02.2003 Skąd: Tychy Ostrzeżenie: (0%) ![]() ![]() |
co zas odpadaja? (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) poprostu trzeba dodac n-level i wyswietla sie bardzo latwo...
http://www.phpriot.com/d/articles/php/appl...sign/index.html wydaje mi sie ta klasa idealna, chyba, ze ktos znalazl cos lepszego ;] |
|
|
![]()
Post
#3
|
|
Developer Grupa: Moderatorzy Postów: 2 844 Pomógł: 20 Dołączył: 25.11.2003 Skąd: Olkusz ![]() |
Ja kozystam z "przerobionych" drzewek ip, jak kiedys rozmawailem z Its_me to mowil nawet on ze to najlepsze drzewka.
Nie testowalem nigdy innych, dlatego nie wiem jak tam inne, ale wybieranie i cala reszta szlo mi calkiem sprawnie (czyt. bez problemow). Teraz stoje wlasnie przed problemem drzewek, i nie wiem do konca jakie najlepiej wybrac... jak ktos ma jakies ciekawe, przestestowane drzewka (z porowaniem wydajnosci) to chetnie sie w nie zaglebie. |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 179 Pomógł: 0 Dołączył: 8.10.2004 Ostrzeżenie: (0%) ![]() ![]() |
Cytat co zas odpadaja? winksmiley.jpg poprostu trzeba dodac n-level i wyswietla sie bardzo latwo... Wydawało mi się, że wyraźnie powiedziałem, że nie chcę Nested Sets. Korzystałem z tego do tej pory (tak z n-level (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif) ), ale widzę, że dla dużych drzew ta metoda jest nie do przyjęcia. Wyobraź sobie ile zajmie np dodawanie nowego posta na forum, gdzie jest 90 000 wątków. Poza tym, jeśli coś pójdzie nie tak przy dodawaniu, to całe drzewo jest rozwalone. Nie chcę Nested Sets. Kropka. Użyję ich w ostatecznej ostateczności. Cytat jak kiedys rozmawailem z Its_me to mowil nawet on ze to najlepsze drzewka. Coś więcej? |
|
|
![]()
Post
#5
|
|
Grupa: Zarząd Postów: 2 277 Pomógł: 6 Dołączył: 27.12.2002 Skąd: Wołów/Wrocław ![]() |
Najlepsze znane (przynajmniej mi) drzewko to drzewko depesza, ma ono jednak sens tylko na PgSQL lub innej bazie tego poziomu.
Oczywiście mówię o ostatnim z omawianych przez niego przykladów - to, które sam opracował. Ja do tego dodaję jeszce zawsze parent_id w kategoriach - jednak dzieki temu jest łatwiej. |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 216 Pomógł: 0 Dołączył: 9.08.2003 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
DeyV, tez uzywam drzewka depeszy ;] z tym ze na mysql je oprogramowalem na potrzeby swojego cms'a. Pol roku temu jak tworzylem cms'a wydawalo mi sie odpowiednie, teraz po prostu wybralbym postgresql i jego drzewo, wtedy wiekszosc problemow znika.
|
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 179 Pomógł: 0 Dołączył: 8.10.2004 Ostrzeżenie: (0%) ![]() ![]() |
Przyjrzałem się dokładniej rozwiązaniu depesza. Z tego, co widzę to jest ono bardzo podobne do tego, co podałem w pierwszym poście, z tym, że dodatkowo wprowadził kolumnę depth.
Sposób dość fajny, ale też nie rozwiązuje mojego problemu - do sortowania drzewa musi być użyta dodatkowa funkcja. Jeszcze przejrzę jak to jest w ezPublish. Wydaje mi się, że tam jest chyba dodatkowa kolumna 'path' typu varchar, w której przechowywana jest ścieżka drzewa, np.: /rosliny/owoce/banan. Oj coś mi się zdaje, że chyba wrócę do Nested Sets, mimo, że nie jest mi to na rękę :/ Jeśli o mnie chodzi, to z mysqla zrezygnowałbym już dawno. Mam na swoim serwerze postgresa i nie byłoby problemów z uruchomieniem skryptu. Problem tkwi w tym, że system ma posłużyć także dla ewentualnych klientów, którzy nie zawsze będą mieli możliwość instalacji PgSQL na serwerze. MySQL niestety musi zostać. Dołujący jest też fakt, że praktycznie ze świecą można szukać firmy hostingowej, która udostępnia mySQL 4.1 :/ |
|
|
![]()
Post
#8
|
|
Grupa: Przyjaciele php.pl Postów: 742 Pomógł: 0 Dołączył: 14.12.2003 Skąd: Gdańsk, Trójmiasto Ostrzeżenie: (0%) ![]() ![]() |
ja potwierdzam, ze drzewka IP sa dosyc dobre. Nie ma wiekszych problemow z implementacja i utrzymaniem
|
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 179 Pomógł: 0 Dołączył: 8.10.2004 Ostrzeżenie: (0%) ![]() ![]() |
drzewka IP? co to oznacza? Immediate Parent?
|
|
|
![]()
Post
#10
|
|
Grupa: Przyjaciele php.pl Postów: 742 Pomógł: 0 Dołączył: 14.12.2003 Skąd: Gdańsk, Trójmiasto Ostrzeżenie: (0%) ![]() ![]() |
to drzewka, ktorych galezie rpzedzielone sa dzielnikiem w tym wypadku kropka:
warzywa/jadalne/kapusta/kiszona to np 18.57.36.2 |
|
|
![]()
Post
#11
|
|
Grupa: Zarejestrowani Postów: 197 Pomógł: 0 Dołączył: 11.07.2005 Ostrzeżenie: (0%) ![]() ![]() |
Nigdy nie wiedziałem w czym tkwi problem z drzewkami (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif) . U mnie każdy wpis ma własne pole 'id' oraz pole 'parent_id' dzięki czemu bardzo łatwo można wyświetlić wszystkie dzieci danego rodzica, a potem dzieci tamtych dzieci, a potem ... (IMG:http://forum.php.pl/style_emoticons/default/biggrin.gif)
|
|
|
![]()
Post
#12
|
|
Grupa: Przyjaciele php.pl Postów: 2 923 Pomógł: 9 Dołączył: 25.10.2004 Skąd: Rzeszów - studia / Warszawa - praca Ostrzeżenie: (0%) ![]() ![]() |
Cytat to drzewka, ktorych galezie rpzedzielone sa dzielnikiem w tym wypadku kropka: warzywa/jadalne/kapusta/kiszona to np 18.57.36.2 Pomysl jaki implementuje M$, sprawdzony ale jak widac na tym forum nie jest dla baz polecany, poniewaz trudnosc w wyciaganiu danych. Kolejne typ drzewka juz wymieniony w tym watku to odwolanie do parenta, elastyczny sposob, przydaje sie jesli chesz szybko wyciagnac "dzieci", wszystko ladnie zindeksowane itd, trudnosc polega na tym ze problem jest ze sciezka, bo wszytko musimy robic rekurencyjne, no chyba ze laczymy 2 podane sposoby. |
|
|
![]()
Post
#13
|
|
Grupa: Zarejestrowani Postów: 179 Pomógł: 0 Dołączył: 8.10.2004 Ostrzeżenie: (0%) ![]() ![]() |
Cytat to drzewka, ktorych galezie rpzedzielone sa dzielnikiem w tym wypadku kropka: To się chyba zwie Materialized Path. Rzeczywiście chyba muszę się nim poważniej zająć :] @Levabul: jasne, że nie ma w tym nic złego (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif) dopóki nie używasz rekurencji do wyświeltania drzewa (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif) |
|
|
![]()
Post
#14
|
|
Grupa: Przyjaciele php.pl Postów: 742 Pomógł: 0 Dołączył: 14.12.2003 Skąd: Gdańsk, Trójmiasto Ostrzeżenie: (0%) ![]() ![]() |
ja u siebie jedna funkcja zrzucam drzewka do pliku txti potem juz elegancko i szybko wszystko pobieram:)
|
|
|
![]()
Post
#15
|
|
Grupa: Przyjaciele php.pl Postów: 2 923 Pomógł: 9 Dołączył: 25.10.2004 Skąd: Rzeszów - studia / Warszawa - praca Ostrzeżenie: (0%) ![]() ![]() |
Cytat ja u siebie jedna funkcja zrzucam drzewka do pliku txti W jakim celu? |
|
|
![]()
Post
#16
|
|
Developer Grupa: Moderatorzy Postów: 2 844 Pomógł: 20 Dołączył: 25.11.2003 Skąd: Olkusz ![]() |
Ja mam to tak:
http://windforce.strefaphp.net/code/tree/?...pTree.class.php Testowalem tylko troszke, poniewaz potem pad dysku mi usuna wszytko (czesc kodu zostala). To byla 1wsza podstawowa wersja, tabeli wam dac nie moge poniewaz jej nie mam (ale chyba wszytko jest w miare jasne. Uzywalem tego i dziala bardz dobrze (testowalem tylko chwile, poniewaz jak to pisalem to poprostu mialo to byc (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) zeby sie na tym reszta oparla). Nie testowalem wydajnosci, jedyne co wiem to to ze to dziala (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif) Wszelkie uwagi mile widziane. |
|
|
![]()
Post
#17
|
|
Grupa: Przyjaciele php.pl Postów: 742 Pomógł: 0 Dołączył: 14.12.2003 Skąd: Gdańsk, Trójmiasto Ostrzeżenie: (0%) ![]() ![]() |
Cytat(SongoQ @ 2005-09-02 21:06:22) Cytat ja u siebie jedna funkcja zrzucam drzewka do pliku txti W jakim celu? jezeli bym operowal na bazie danych, musialbym wykonywac duzo zapytan sql ( srednio 4-5). tutaj nie wykonuje zadnego :] |
|
|
![]()
Post
#18
|
|
Grupa: Zarejestrowani Postów: 179 Pomógł: 0 Dołączył: 8.10.2004 Ostrzeżenie: (0%) ![]() ![]() |
Sprawdźmy, czy dobrze rozumuję:
Kod rośliny (1) / \ / \ / \ / \ owoce(2) warzywa(3) / / banan(4) Tak więc wartość 'path' dla elementów powyższego drzewa wygląda:
Co do pobierania drzewa, to chyba będzie to coś takiego: SELECT * FROM tree WHERE path LIKE '1%' ORDER BY path. |
|
|
![]()
Post
#19
|
|
Developer Grupa: Moderatorzy Postów: 2 844 Pomógł: 20 Dołączył: 25.11.2003 Skąd: Olkusz ![]() |
|
|
|
![]()
Post
#20
|
|
Grupa: Moderatorzy Postów: 1 566 Pomógł: 37 Dołączył: 14.05.2003 Skąd: Kraków ![]() |
Ja się właśnie zastanawiałem którą z metod użyć i chyba zrobie IP (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) W samą porę ten temat.
|
|
|
![]() ![]() |
![]() |
Aktualny czas: 24.09.2025 - 07:02 |