![]() |
![]() ![]() |
![]() |
![]() ![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 123 Pomógł: 3 Dołączył: 29.10.2011 Ostrzeżenie: (0%) ![]() ![]() |
Witam
Problem wygląda tak: mam dwie tabele: kategorie oraz przedmiot, wiadomo że w przedmiocie(aukcji) zawierają się klucze o wartości "id_kategoria", jednak tabela przedstawia drzewo kategorii więc produkt jest przypięty do końcówki (kategoria "laptop" zawiera "acer" oaz "samsung" więc Acer inspiron X3 będzie zawierał klucz z "acer" anie z "laptop"), i właśnie tu zaczyna się problem: jak kliknę na link acer to wyświetlę spokojnie acery ale jak kliknę "laptop" to jak mam wyświetlić produkty podkategorii zachowując sortowanie ogólne (np. produkty po czasie rejestracji) - wspomnę iż zagłębienie kategorii jest nieograniczone. Niżej przedstawiam tabelę oraz funkcję rysującą drzewo kategorii. Tabela aukcji:
Tabela kategorie:
Funkcja rysująca drzewo:
|
|
|
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 48 Pomógł: 12 Dołączył: 7.03.2012 Ostrzeżenie: (0%) ![]() ![]() |
Możesz zrobić to zagnieżdzając zapytania MySQL albo dodając pole varchar zawierające numery id wszystkich kategorii od aktualnej do samej góry. Np.:
Acer; ID: 1; ścieżka: "1," Inspiron X3; ID: 2; ścieżka: "1,2," Ścieżkię generujesz przy dodawaniu przedmiotu. A zapytanie coś w tym stylu:
Wydaje mi się, że rozwiązanie jest dobre, choć niezbyt eleganckie. Jeśli nie jest dobre, to poproszę o krytykę (IMG:style_emoticons/default/smile.gif) |
|
|
![]() ![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 123 Pomógł: 3 Dołączył: 29.10.2011 Ostrzeżenie: (0%) ![]() ![]() |
Mi za bardzo to nie pasuje, jeżeli kategoria będzie częścią podkategorii to trzeba się liczyć z tym że przy dużej liczbie kategorii i zagnieżdżeń będzie taki moment że połączona ścieżka stworzy jakąś kategorię (chyba że tak jak napisałeś jest to pole varchar czymś tam rozdzielone) jednak rzeczywiście jest to nieeleganckie (IMG:style_emoticons/default/wink.gif)
wolałbym coś praktycznego, ponieważ kończę pisać dość pokaźny sklep jednak zatrzymałem się własnie na tej niby banalnej rzeczy (po prostu nie mogę sobie tego działania w głowie ułożyć) Czekam na więcej pomysłów jak by było można to wykombinować (IMG:style_emoticons/default/wink.gif) |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 2 178 Pomógł: 596 Dołączył: 25.09.2009 Skąd: Piwniczna-Zdrój Ostrzeżenie: (0%) ![]() ![]() |
@sebastian.rozmus: Oczywiście rozwiązanie jest jak najbardziej dobre i ma nawet swoją nazwę - drzewo IP.
@ksenonlogin: Niestety przy takiej budowie systemu kategorii i podkategorii, która opiera się jedynie na id i parentId ciężko będzie znaleźć wydajne rozwiązanie. Musisz bowiem napisać sobie funkcję rekurencyjną, która wyszuka wszystkie podkategorie w danej kategorii i w jej podkategoriach, i tak w kółko. Znalezione id podkategorii wrzucasz do zapytania: SELECT ... FROM `przedmiot` WHERE `klucz_kategoria_przedmiot` IN (tutaj znalezione identyfikatory kategorii) Niestety funkcja rekurencyjna wykonywać będzie masę zapytań SQL, co zdecydowanie wpłynie na spadek wydajności aplikacji i wyszukiwanie podkategorii danej kategorii trochę czasu zajmie (oczywiście to zależy od ilości kategorii i podkategorii). Zdecydowanie lepszym rozwiązaniem będą tutaj zaproponowane wyżej drzewa IP. Oczywiście są jeszcze inne sposoby na zaimplementowanie drzewa kategorii, a wszystkie je łączy wspólny element - zbiory zagłębione (nested sets). |
|
|
![]() ![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 123 Pomógł: 3 Dołączył: 29.10.2011 Ostrzeżenie: (0%) ![]() ![]() |
Szukałem szukałem i nic nie znalazłem więc zrobiłem według waszych zaleceń i powiem szczerze że jest ok - nie daje znacznego obciążenia (IMG:style_emoticons/default/wink.gif)
Dzięki (IMG:style_emoticons/default/wink.gif) |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 341 Pomógł: 40 Dołączył: 23.06.2009 Ostrzeżenie: (0%) ![]() ![]() |
@mortus nested sets jest trudnym sposobem implementacji drzewka (trochę nieintuicyjne na początek)
jednak jak sie człowiek zagłębi w temat - to widać same zalety :] tutaj topic odpisałem jak można łatwo wybrać cala gałąź drzewka. drzewa z rodzicem - są ok, ale tylko wtedy gdy znamy ilość zagłębień, no i tych zagłębień nie jest zbyt wiele. inaczej - wychodzi makabra, ilość zapytań jaka trzeba wysłać by pobrać pełne drzewo jest koszmarna... j. |
|
|
![]() ![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 123 Pomógł: 3 Dołączył: 29.10.2011 Ostrzeżenie: (0%) ![]() ![]() |
Przekonaliście mnie, powiem szczerze że nawet większy porządek i w razie problemu z bazą łatwiej znaleźć problem przy zagubionych elementach (IMG:style_emoticons/default/wink.gif)
@alegorn: dzięki za dodatkowy temat przydał się ;: |
|
|
![]() ![]() |
![]() |
Aktualny czas: 29.08.2025 - 23:58 |