![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 58 Pomógł: 2 Dołączył: 12.01.2006 Ostrzeżenie: (0%) ![]() ![]() |
Witam serdecznie. Stoję przed ciężkim problemem jakim jest drzewo kategorii.
Aktualnie korzystam z nested sets + parent_id Jaki problem? Mając następującą strukturę:
będąc w kategorii Sub 1.2 powinienen widzieć:
a będąc w kategorii SubSubSub 1.1.2.2
Próby skończyły się na następującym zapytaniu:
Przy takim zapytaniu muszę znać: 1. ID głównej gałęzi w nested sets (null lub id = 1, w zależności od struktury nested sets) 2. ID najwyższego rodzica otwartej kategorii (w moim zapytaniu id=1) 3. LFT i RGT najwyższego rodzica kategorii. Dla struktury
bedąc w SubSubSub 1.1.2.1 powinienen otrzymać
czyli muszę znać: 1. ID każdego rodzica 2. LFT i RGT najniższego rodzica i to już mnie przerasta... Może znacie jakiś sprytny sposób na to? Ten post edytował zaksmok 25.02.2010, 09:37:44 |
|
|
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 260 Pomógł: 34 Dołączył: 22.02.2010 Ostrzeżenie: (0%) ![]() ![]() |
a jakie masz tabele?
jedna tabela z 4 kolumnami, gdzie kazda kolumna odpowiada za poziom? Ja jestem zwolennikiem ze nie trzeba sie bac towrzenia i wizania ze soba tabel, wiec zrobil bym 4 table bo mamy 4 kategorie daje mi to przejrzystosc tabel, zapytan i kodu, wkoncu dlatego bazy nazywaja sie relacyjnymi
moze ktos powiedziec boze ile zapytan po co itd.. ja wiem z doswiadczenia (oracle+ bardzo duza baza) ze takie zapytania beda wykonywac sie szybiej niz jedno wielkie ktore moze zapchac serwer jak jest zle napisane, w tym ukladnie mozna dodawac odpowiednie warunki kiedy jaki poziom sie wyswietla i dla kogo.. + wile innych plusow |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 58 Pomógł: 2 Dołączył: 12.01.2006 Ostrzeżenie: (0%) ![]() ![]() |
gałęzie nie będą aż tak duże, maks 500 rekordów. Wszystko jest w jednej tabeli, struktura nested sets.
|
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 78 Pomógł: 2 Dołączył: 21.10.2006 Ostrzeżenie: (0%) ![]() ![]() |
Ja jestem zwolennikiem ze nie trzeba sie bac towrzenia i wizania ze soba tabel, wiec zrobil bym 4 table bo mamy 4 kategorie daje mi to przejrzystosc tabel, zapytan i kodu, wkoncu dlatego bazy nazywaja sie relacyjnymi OMG Może to ci pomoże: http://www.phpclasses.org/browse/package/1374.html http://articles.sitepoint.com/article/hier...l-data-database http://www.edutech.ch/contribution/nstrees/index.php Poza tym na moje oko wszystkie kategorie powinny być opakowane jeszcze w nadrzędny element, np root. |
|
|
![]()
Post
#5
|
|
![]() Grupa: Przyjaciele php.pl Postów: 1 202 Pomógł: 117 Dołączył: 13.04.2007 Skąd: 127.0.0.1 Ostrzeżenie: (0%) ![]() ![]() |
Witam!
@wiiir, to co proponujesz to jakiś absurd. Dobrych implementacji drzewek jak kilka. Można wybrać coś dla siebie w zależności od potrzeb i trudności. Jak w Twoim pomyśle będziesz realizował przeszukiwanie gałęzi lub przenoszenie? BTW relacją nie jest trzymanie danych tego samego rodzaju w 15 tabelkach. Co do tematu wątku, mogę polecić jeszcze tzw Drzewka Depesza. Bez trudu znajdziesz w Google materiały. Jest to modyfikacja drzewek IP (taka bardziej zmiana optymalizacyjna). W drzewkach IP chodzi o to, że oprócz id rodzica trzymasz całą ścieżkę jeszcze (np 1.23.345.1224, parent to 1224, kategoria główna to 1). Drzewek LEFT-RIGHT nie mogłem nigdy zrozumieć. Tzn ich fenomenu. Pozdrawiam! -------------------- |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 46 Pomógł: 10 Dołączył: 30.06.2008 Ostrzeżenie: (0%) ![]() ![]() |
Problem ciekawy ale rozwiązanie jest dość proste.
Pola przykładowej tablicy 'tbl_tree' - id - parent_id - n_left - n_right - level (liczba naturalna informująca o poziomie elementu w drzewie) Kolumna "level" jest opcjonalna ale zawsze ją dodaję bo znacznie ułatwia wiele operacji na tablicy. Zapytanie które wyciąga Ci id-ki wszystkich potomków elementu o id = :id już znasz i dla mojej przykładowej tabeli wygląda tak:
Zapytanie które wyciągnie Ci id-ki wszystkich rodziców elementu o id = :id wygląda identycznie z dwiema drobnymi różnicami (znaki '>' i '<' zamieniły się miejscami):
Żeby wyciągnąć n_left i n_right (u Ciebie LFT i RGT) najniższego rodzica przeszukujesz wynik poprzedniego zapytania w poszukiwaniu wiersza o najwyższej wartości 'level' lub robisz nowe zapytanie do bazy danych:
|
|
|
![]()
Post
#7
|
|
![]() Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Cytat Drzewek LEFT-RIGHT nie mogłem nigdy zrozumieć. Tzn ich fenomenu. Cały ich fenomen polega na tym, że część operacji wykonuje się na nich o wiele łatwiej - część oczywiście trudniej. Jest to po prostu kolejna implementacja tego samego mająca swoje wady i zalety.
|
|
|
![]()
Post
#8
|
|
![]() Grupa: Zarejestrowani Postów: 387 Pomógł: 66 Dołączył: 31.03.2005 Skąd: Kielce Ostrzeżenie: (0%) ![]() ![]() |
-------------------- ..::: Jak pomogłem to kliknij pomógł. Tak rzadko używacie tej opcji :( :::..
|
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 18.07.2025 - 17:10 |