Struktura strony jako drzewko.

0

Witam,
Robie cos w stylu "portalu" i chcialbym podzielic jakos dzialy na stronie, chcialbym ta informacje trzymac w jakiejs tabelce.
Wczesniej gdy mialem np Dział i Od razu wiadomosci ni ebylo problemu, robilem tabelke z nazwa dzialu a w tabeli wiadomosci wpisywalem id dzialu i po sprawie.
Teraz przyszlo mi sie zmierzyc z 5 krotnym zagniezdzenim czyli np
1.Dział1

  1. Poddział1
    1. Podpodrozdział1
      4......
      2.Dział2
  2. Podrodzial2
    3.Dzial3

Kazy dzial moze miec dowolna ilosc zagniezdzen i wiadomosci moze pochodzic z roznego zagniezdzenia.
Czy teraz taka sytuacje trzeba rozwiazac drzewkiem ?

Monza prosic o jakis przyklad?

0

Ja to zawsze robiłem tak:
id | id_rodzica | reszta
Jak id_rodzica = 0 (np.) to jest dział, jak nie, jak nie, to gdzieś głębiej. Drzewko wtedy łatwo zbudować jakąś rekurencją.

0

Czyli mam np tabelke w ktorej trzymam menu (drzewko) Np.

Id| Rodzic | Nazwa |glowny
1 - Informatyka 0 0-glowny
2 1 Software 1
3 1 Hardware 1
4 2 Software freeware 1
5 4 Software freew.2

I zapisuje do innej tabeli wiadomosc gdzie w id_temat wpisuje id z tabeli powyzej
Czyli
id_newsa | id_temat | tresc
1 5 lalallalal

itd..

I teraz jezeli bede mial wyswietlic wszystkie wiadomosci z dzialu INFORMATYKA to musze jakas funkcja poznajdowac wszystkie id tematów ktore odpowiadaja temu dzialowi czyz nie?
Czyli na poczatku musze sprawdzic gdzie rodzic=1 , przechwycic ich id i pozniej sprawdzic czy znowu tez ID nie znajduje sie w polu rodzic dalej. Tak to sie realizuje?

0

ja zawsze dodaje pole varchar/text "path", gdzie ścieżkę zapisuje w postaci "0|1|5|12|352". Może nie jest to rozwiązanie eleganckie, ani odzwierciedlające relacyjność bazy, ale za to pozwala na wyciągnięcie tego, co nas interesuje jednym zapytaniem i bez rekurencji...

0

Mam skonstruowane drzewo pozycji w tabeli w skrocie:

ID, RODZIC, NAZWA, CZY_GLOWNY

Teraz chce do selecta wypluc pelne sciezki do kazdego z wezlow, czyli jezeli mamy:

1 1 Nazwa1 1 //glowny
2 1 Podzanwa1 0
3 1 Podnazwa2 0
4 3 Podpodnazwa1 0

I teraz chcialbym w selecie uzyskac:

  1. Nazwa1 //id=1
  2. Nazwa1->Podnazwa1 //id=2
  3. Nazwa1->Podnazwa2 //id=3
  4. Nazwa1->Podnazwa2->Podpodnazwa1 //id=4

Jaki algorytm do tego wykorzystac?

0

Nie wiem, po to to "czy_glowny", równie dobrze możesz wykorzystać do tego rodzica (np. rodzic = 0 -> główny).
Mając takie drzewko najpierw do tabelki (np. $rekordy) wrzucasz wszystkie i tworzysz funkcje rekurencyjna, np. taką:

function sciezka( $rekord )
{
    if( $rekord['rodzic'] == 0 )
        return $rekord['nazwa'];
    else
        return sciezka( $rekordy[$rekord['rodzic']] ).'->'.$rekord['nazwa'];
}
0

bierz poprawkę na to, że przy bardzo dużym drzewku (np. jeżeli byś tak zrobił listę mailingową) nie starczy Ci pamięci :P

0
tomkiewicz napisał(a)

bierz poprawkę na to, że przy bardzo dużym drzewku (np. jeżeli byś tak zrobił listę mailingową) nie starczy Ci pamięci :P

Ja mam tylko ok 50 rekordow i raczej nie bedzie ich duzo wiecej.

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0