Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

3 Stron V   1 2 3 >  
Reply to this topicStart new topic
> drzewka sqlowe
chmolu
post
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)
Go to the top of the page
+Quote Post
sf
post
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 ;]
Go to the top of the page
+Quote Post
hwao
post
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.
Go to the top of the page
+Quote Post
chmolu
post
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?
Go to the top of the page
+Quote Post
DeyV
post
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.
Go to the top of the page
+Quote Post
Ace
post
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.
Go to the top of the page
+Quote Post
chmolu
post
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 :/
Go to the top of the page
+Quote Post
aleksander
post
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
Go to the top of the page
+Quote Post
chmolu
post
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?
Go to the top of the page
+Quote Post
aleksander
post
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
Go to the top of the page
+Quote Post
Levabul
post
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)
Go to the top of the page
+Quote Post
SongoQ
post
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.
Go to the top of the page
+Quote Post
chmolu
post
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)
Go to the top of the page
+Quote Post
aleksander
post
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:)
Go to the top of the page
+Quote Post
SongoQ
post
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?
Go to the top of the page
+Quote Post
hwao
post
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.
Go to the top of the page
+Quote Post
aleksander
post
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 :]
Go to the top of the page
+Quote Post
chmolu
post
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:
  • rośliny: 1
  • owoce: 1.2
  • warzywa: 1.3
  • banan: 1.2.4
Tak to powinno być?

Co do pobierania drzewa, to chyba będzie to coś takiego:
SELECT * FROM tree WHERE path LIKE '1%' ORDER BY path.
Go to the top of the page
+Quote Post
hwao
post
Post #19


Developer


Grupa: Moderatorzy
Postów: 2 844
Pomógł: 20
Dołączył: 25.11.2003
Skąd: Olkusz




Cytat
Co do pobierania drzewa, to chyba będzie to coś takiego:
  1. SELECT *
  2. FROM tree WHERE path LIKE '1%' ORDER BY path.


To jest calego drzewka w gore:)

a w dol to tak jak ja napisalem chyba najlepiej (mam metode)
Go to the top of the page
+Quote Post
Ociu
post
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.
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 24.09.2025 - 07:02