Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MySQL]System kategorii
Forum PHP.pl > Forum > Przedszkole
siemieng
Witam,

Proszę o podpowiedź lub wskazówkę dotyczącą utworzenia mechanizmu kategorii w odniesieniu do dwóch sytuacji (posługiwać się będę przykładem bazy ogłoszeń, działającej po kilkoma domenami, czyli wchodzi ktoś z danej domeny, wyświetla mu się baza ogłoszeń przydzielonych do tej domeny, podzielona na kategorie i podkategorie):

1. Kategorie ogłoszeń:
Typowe drzewo kategorii - kategoria główna dalej podkategorie, itd...., do których przypisane są poszczególne ogłoszenia, zależało by mi, żeby jedno ogłoszenie mogło być przypisane do kilku kategorii. Zakłada się, że lista kategorii i podkategorii będzie to kilkadziesiąt pozycji.

2. Przypisanie ogłoszenia do jednej bądź kilku domen
Chodzi tu podpięcie jednej bazy ogłoszeń do kilku domen (np. regionalne), tak żeby wchodząc z danej domeny po jej odczytaniu wyświetlać ogłoszenia przypisane tylko jej lub wszystkim. Liczba tych domen nie będzie wielka - maksymalnie 20.


Rozwiązania, które przychodzą mi do głowy i nad którymi się zastanawiam, ewentualnie podpowiedzcie jakieś stosowane przez Was....

1. Dla kategorii ogłoszeń zastanawiam się nad 3 tabelami MySQL:

- OGLOSZENIA
------- ID (identyfikator ogłoszenia)
------- ... (reszta pól)

- KATEGORIE
------- ID (identyfikator kategorii lub podkategorii)
------- PARENT_ID (identyfikator rodzica, czyli jeśli wartość 0 znaczy, że to kategoria główna, jeśli inna znaczy, że to identyfikator kategorii a to jest podkategoria)
------- ... (reszta pól)

- POWIAZANIA
------- ID (identyfikator ogłoszenia)
------- CAT_ID (identyfikator kategorii lub podkategorii)

2. Dla powiązania jednej/kilku domen z danym ogłoszeniem zastanawiam się nad:

- OGLOSZENIA
------- ASSOC (pole przypisania ogłoszenia i teraz tak: wartościami byłyby oznaczenia domen np: "D1, D2, D3" przy odczytywaniu ogłoszenia wykorzystywał bym ... WHERE ASSOC LIKE 'D1' .... natomiast przy odczytywaniu danych zbiorczych, czyli ile ogłoszeń dla danej domeny, użyłbym PHP, używając np. funckji explode, żeby rozdzielić ciąg znaków i odczytać poszczególne oznaczenia domen)
------- ... (reszta pól)

Zastanawiałem się nad rozwiązaniem takim jak dla kategorii, ale kategorię będę potrzebował w dwóch obszarach danych, natomiast przypisanie do domeny/domen będzie dotyczyło większości danych (ogłoszenia, zdjęcia, użytkownicy, artykuły, galerie, forum.......) i tworzyć tyle dodatkowych tabel - nie wiem czy to ma sens....

Innym rozwiązaniem odnoście przypisania domen nad jakim się zastanawiałem to:
- OGLOSZENIA
------- D1 (TRUE/FALSE w zależności czy ogłoszenie przypisane danej domenie...)
------- D2 (TRUE/FALSE)
------- D3 (TRUE/FASLE)
------- ... (reszta pól)

Tyle, że to odrzuciłem bo przy ilości 20 domen, 20 dodatkowych pól prawie w każdej tabeli to chyba średni pomysł, nawet jeśli chodzi o jakąś wydajność.....


Proszę o Wasze opinie na temat tych moich pomysłów, bądź o jakieś wskazówki odnośnie jakie się robi tego typu mechanizmy lub co zmienić żeby było dobrze:)
Z góry dziękuje.......
Sephirus
Hmmm co do propozycji kategorii to ok - dla ułatwienia pobierania całej listy kategorii naraz możesz śmiało dodać jeszcze pole LEVEL w kategoriach określałby poziom zagnieżdzenia. Wówczas pobranie całego drzewa polegałoby na pobraniu wszystkiego sortując rosnąco po LEVELU. następnie w PHP przelatując po kolejnych elementach tworzyłbyś odpowiednią tablicę wielowymiarową i na koniec ją odpowiednio wyświetlił - odciąży to bazę danych jak będzie dobrze zrobione.

Co do domen to nieco cięższy problem - twój pierwszy pomysł nie jest zły ale mało wydajny, drugi z kolei to mnóstwo pól... Pomyślę nad tym wink.gif

EDIT:

Ok wydaje mi się, że jednak, biorąc pod uwagę różne czynniki, najlepszym rozwiązaniem byłoby utworzenie kolejnych tabel powiązań typu - kategoria-domena (nie wiem czy potrzebujesz w ogóle takie powiązanie) i ogłoszenie-domena. Będzie to dosyć wygodne gdyż przy wyświetlaniu zawsze będziemy dodawać jedynie dodatkowe pole - czy jest równe danej domenie. Wydajnościowo jest ok, a jeżeli chodzi o wygodę to też jest wygodne smile.gif
siemieng
Cytat(Sephirus @ 21.11.2011, 12:45:24 ) *
Hmmm co do propozycji kategorii to ok - dla ułatwienia pobierania całej listy kategorii naraz możesz śmiało dodać jeszcze pole LEVEL w kategoriach określałby poziom zagnieżdzenia. Wówczas pobranie całego drzewa polegałoby na pobraniu wszystkiego sortując rosnąco po LEVELU. następnie w PHP przelatując po kolejnych elementach tworzyłbyś odpowiednią tablicę wielowymiarową i na koniec ją odpowiednio wyświetlił - odciąży to bazę danych jak będzie dobrze zrobione.

Co do domen to nieco cięższy problem - twój pierwszy pomysł nie jest zły ale mało wydajny, drugi z kolei to mnóstwo pól... Pomyślę nad tym wink.gif

EDIT:

Ok wydaje mi się, że jednak, biorąc pod uwagę różne czynniki, najlepszym rozwiązaniem byłoby utworzenie kolejnych tabel powiązań typu - kategoria-domena (nie wiem czy potrzebujesz w ogóle takie powiązanie) i ogłoszenie-domena. Będzie to dosyć wygodne gdyż przy wyświetlaniu zawsze będziemy dodawać jedynie dodatkowe pole - czy jest równe danej domenie. Wydajnościowo jest ok, a jeżeli chodzi o wygodę to też jest wygodne smile.gif


Od razu dzięki za bardzo przydaną odpowiedźsmile.gif

Co do rozwiązania systemu kategorii, w tabeli powiązań między ogłoszeniami a kategoriami przewidywałem utworzenie pola "zagłębienia/poziomu". Jeśli chodzi o tworzenie tabeli kategorie-domena takowej faktycznie nie potrzebuję, powiązanie z domenami jest mi potrzebne w przypadku poszczególnych grup danych, jak to w przypadku typowego serwisu internetowego (ogłoszenia, firmy, artykuły, galerie, użytkownicy, tematy z forum).

Zastanawiałem się jeszcze nad jednym rozwiązaniem dotyczącym sposobu przypisania danych do domeny/domen - będącym niejako rozszerzeniem mojego pierwszego pomysłu, czyli:
mając tabelę OGLOSZENIA i w niej pole np: ASSOC z wartościami typu : "D1, D2, D5" / "D1" / "D1, D5" zawierające symbole danych domen połączone w jeden ciąg znaków, do których zostało przypisane dane ogłoszenie - zastanawiałem się nad utworzeniem widoków dla tabeli, w których to bym przetrzymywał dane (ogłoszenia) przypisane danej domenie......

Tyle, że to się znowu wiąże ze sporą ilością widoków dla większości tabel..... czyli Twoja (@Sephirus) podpowiedź odnośnie takiego samego rozwiązania jak dla kategorii wydaje się zdecydowanie lepsza....
Sephirus
Wiesz - tu już nie chodzi o lepszość ale metoda z ciągiem znaków (stringiem) ma więcej wad:

- Edycja jest bardziej skomplikowana (w sensie PHP - explode'y, implode'y itd.. itp...)
- Ciężko pobrać na przykład domeny w których występują dany przedmiot z bazy (jednym zapytaniem)
- dla wielu rekordów - będzie to obciążać niepotrzebnie nawet z indeksem,
- w razie jakichś zmian w systemie "moje" rozwiązanie jest bardziej skalowalne...

Po za tym widoki można zrobić - ale pamiętaj że to dalej muli bazę danych :/

To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.