Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[PHP][MySQL] Jak utworzyć drzewo katalogów?

Ostatnio zmodyfikowano 2011-04-29 15:55
Autor Wiadomość
absflg
Temat założony przez niniejszego użytkownika
[PHP][MySQL] Jak utworzyć drzewo katalogów?
» 2011-04-28 23:03:39
Piszę zbiór artykułów do strony w PHP. Zgodnie z założeniem artykuły są poukładane w działy, te znów w poddziały itd. W teorii głębokość(nie wiem jak to nazwać...) katalogów może być nieograniczona. Mam 2 tabele w bazie: do artykułów i do działów. Artykuły poza całą swoją treścią, mają numer ID oraz informacje o dziale, w którym się znajdują (jego ID). Działy posiadają swoje ID i ew. numer działu nadrzędnego.

Przychodzą mi na myśl 3 rozwiązania, ale żadne z nich mnie nie zadowala:
=> Artykuł musi się znajdować w poddziale działu głównego - tak więc porzucenie możliwości dowolnego rozplanowania. Zrobić z działów i poddziałów osobne tabele. (jedno zapytanie)
=> Przechowywać w działach informacje o WSZYSTKICH działach nadrzędnych - nie odpowiada mi, gdyż dziełu takiego nie będę mógł łatwo przenieść. (dwa zapytania o ile się nie mylę, bo musi być zapisane jako ciąg do przetworzenia przez PHP)
=> Zapytania w pętli PHP. Po uzyskaniu działu, bombardować bazę pojedynczymi zapytaniami o coraz bardziej zewnętrzne działy.
P-32215
DejaVu
» 2011-04-28 23:38:48
To zrób procedury składowane, które modyfikują kilka tablic za jednym wywołaniem i przenoszenie stanie się proste :)
P-32216
kamillo121
» 2011-04-29 13:01:21
Takie drzewko katalogów można łatwo wygenerować np:

dział:
 id | nazwa_działu | id_ocja | id_dziecka

Teraz pobierasz wszystkie działy z bazy poukładane według id_ojca rosnąco i tworzysz drzewko w php np wartość -1 id_ocja oznacza katalog główny resztę przyporządkowujesz według id i masz drzewko. Potem tylko pobrać nazwy wszystkich artykułów wraz z id kategorii i dodajesz elementy w odpowiednie gałęzie (wtedy można zaawansowane drzewka tworzyć, np w podkategorii może być kilka następnym podkategorii i artykuł itd.
Takie drzewo potem wrzucasz do cache i nie marnujesz za każdym razem mocy na generowanie samego drzewka.

Przy takim rozwiązaniu:
-edytujesz tylko id_kategorii artykułu w celu zmiany działu a nie całe drzewka...
-możesz zmieniać mniejsze drzewka kategorii i podczepiać pod inne gałęzie
P-32221
DejaVu
» 2011-04-29 15:24:45
Tyle, że ścieżki nie wyciągniesz jednym zapytaniem :)
P-32223
kamillo121
» 2011-04-29 15:48:33
ee jakiej ścieżki ?:D
P-32224
DejaVu
» 2011-04-29 15:51:27
nazw działów nadrzędnych. Czytaj: jesteś w dokumentacji na funkcji X i chcesz mieć ścieżkę do wszystkich działów nadrzędnych, a nie tylko do pierwszego rodzica (ścieżka => nawigacja).
P-32226
kamillo121
» 2011-04-29 15:55:42
To akurat zależy od potrzeb bo jeżeli przyjmiemy, że ścieżka może się składać z maks 5 "katalogów" to może w tym pomóc link ( href="doc/c++/sdl/grafika/blit_surface").
Jeżeli jednak będzie dłuższa ścieżka to nasze drzewo, które zostało wygenerowane wyżej podanym sposobem zawiera przecież wszystkie gałęzie wystarczy odczytać gałąź prowadzącą do danego artykułu i mamy całą ścieżkę bez użycia mysql'a(oczywiście gdy drzewko jest w cache).

//tylko trzeba byłoby obmyślić sensowny zapis drzewka, żeby za dużo pamięci nie zużyć  
P-32227
« 1 »
  Strona 1 z 1