Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Kategoria i podkategorie
Forum PHP.pl > Forum > Bazy danych > MySQL
pc5
Witam ponownie!

Mój problem polega na tym że potrzebuję zrobić system przeglądania wpisów, z których każdy ma jakąś kategorie główną i podkategorie. Liczba kategori i podkategori jest dynamiczna, użytkownik sam sobie je definiuje.

PROBLEM :
Jak wstawić takie coś do bazy MySqla? Jak potem stworzyć zapytanie, w którym wybieramy wpisy z danej kategori lub podkategori? Głównie problem polega na tym że do bazy trzeba wstawić więcej niż 1 podkategorie.

Mam już kolumnę "Kategoria", myślałem nad stworzeniem drugiej kolumny "Podkategorie", ale co tam wstwaić? Stringi nazw kategori oddzielone przecinkami, potem ewentualnie rozbijać to przy użyciu funkcji expolde z php? Cały czas rozbijam się o to że w 1 kolumnie może być własnie te pare podkategori.

Niestety nie mogę dodać sobie komumn "Podkategoria_1", "Podkategoria_2" itd.

Myślałem nad typem enum... ale to chyba nie zda egzaminu.

Moja pierwsza propozycja jest taka :
Nazwy kategori zapisac jako string, rozdzielone przecinkami, kazda nazwa bedzie miala swoj znak konca i poczatku stringu, tzn. zapis bedzie mniej wiecej taki :
@nazwa kategori 1@, @nazwa kategori 2@... itd gdzie znaki @ to poczatek i koniec stringu. Potem dajemy tylko wyszukiwanie przez SELECT i w WHERE dajemy 'Podkategorie' LIKE '@%nazwa kategori szukanej%@'. Może nawet obejdzie się bez %.

Jakieś pomysły?
nospor
tabela kategorie (kolumny):
Cytat
ID
NAME
.....jakies tam jeszcze jakie bedą ci potrzebne
PARENT


gdzie, ID to ID kategorii
NAME - nazwa kategoriii
.....
PARENT to ID kategori nadrzędnej do danej. Jesli to ID jest null, znaczy się że dana kategoria nie jest podkategorią innej. Jesli to id jest ustawione, znaczy że dana kategoria jest podkategorią innej o podanym ID.

To jest dość powszechne stosowane rozwiązanie
pc5
Cytat(nospor @ 2005-04-20 06:55:16)
tabela kategorie (kolumny):
Cytat

ID
NAME
.....jakies tam jeszcze jakie bedą ci potrzebne
PARENT


gdzie, ID to ID kategorii
NAME - nazwa kategoriii
.....
PARENT to ID kategori nadrzędnej do danej. Jesli to ID jest null, znaczy się że dana kategoria nie jest podkategorią innej. Jesli to id jest ustawione, znaczy że dana kategoria jest podkategorią innej o podanym ID.

To jest dość powszechne stosowane rozwiązanie

Przyznam się że nie za bardzo rozumiem. Sytuacja wygląda teraz tak że mam już stworzoną tabelę 'Katrgorie' i jest tam id i nazwa. Mam też osobną tabelę 'Wpisy' i tam mam kolumnę 'Kategoria' (możę być wybrana tylko 1), a potrzebuje do każdego wpisu dołożyć jeszcze podkategorie, może ich być nawet 100.

Prosibłym o troszkę bardziej łopatologiczne wyjaśnienie tego rozwiązania. Z tego co zrozumiałem wychodzi na to że dana kategoria może być podkategoria innej itd, ale czy to nie jest zbyt ogólne? Chodzi mi o to by każdy wpis miał swój unikalny system podkategori i kategori. Przypisanie na stałe podkategori do kategori to nie problem. W głównej mierze chodzi mi o to by potem to łatwo zmieniac i nie konsturować trudnych zapytań do bazy.

A może da się to jakoś zrobić za pomocą 2 zapytań? Sam już nie wiem.

Pozdrawiam - KM
nospor
W rozwiązaniu co Ci podałem dla danej kategorii może istnieć nawet i milion podkategorii i to nie stanowi problemu.

Każda kategoria ma swój unikalny ID. On nic nie mówi o kategori czy podkategorii.
Dopiero gdy masz ustawiony PARENT, to wiesz, że dana kategoria jest podkategorią kategorii o ID w PARENT.
przykład (tabela kategoria):
Cytat
ID | NAME | PARENT
1  | KAT1  | null
2  | PKAT1| 1
3  | PKAT2| 1
4  | KAT2  | null
5  | PKAT3| 4
6  | PKAT4| 4


KAT1
-----PKAT1
-----PKAT2
KAT2
-----PKAT3
-----PKAT4

Rozjaśniło się trochę?
pc5
Cytat(nospor @ 2005-04-20 09:41:27)
W rozwiązaniu co Ci podałem dla danej kategorii może istnieć nawet i milion podkategorii i to nie stanowi problemu.

Każda kategoria ma swój unikalny ID. On nic nie mówi o kategori czy podkategorii.
Dopiero gdy masz ustawiony PARENT, to wiesz, że dana kategoria jest podkategorią kategorii o ID w PARENT.
przykład (tabela kategoria):
Cytat

ID | NAME | PARENT
1  | KAT1  | null
2  | PKAT1| 1
3  | PKAT2| 1
4  | KAT2  | null
5  | PKAT3| 4
6  | PKAT4| 4


KAT1
-----PKAT1
-----PKAT2
KAT2
-----PKAT3
-----PKAT4

Rozjaśniło się trochę?

Dobrze, ale to przecież jest przypisanie tylko do tabeli Kategorie. Cały czas chodzi o to że mam np. wpisy

id nazwa_firmy kategoria_id podkategorie
0 Onet 5 questionmark.gif?
1 Wp 5 questionmark.gif?

itd. itd.

gdzie mam zdefiniowaną tabelę Kategorie a w niej tylko nazwy kategori i ich id, które są dodawane do pól w tabeli 'Wpisy' czyli

id nazwa_kategori
5 Portale
7 Wyszukiwarki
10 Rejestracja
11 Internet
12 e-mail
itd itd...

każdy wpis moze mieć tylko jedną kategorię główną z tabeli 'Kategorie', ale podkategori może mieć więcej. '?questionmark.gif' oznacza własnie moją niewiadomą. Co tam wstawić? najrpościej id podkategori, czyli id kategori z tabeli 'Kategorie', ale problem polega na tym że skonstruować potem zapytanie i edytować podkategorie takiego wpisu może być ciężko.

Teoretycznie chce mieć w tym polu np. dla wpisu o id 0 z tabeli 'Wpisy' (czyli onet) podkategorie 6,12,11 i moze inne, a dla Wp, chce miec juz inne np. 10 11

Przepraszam jeżeli czegoś nie rozumiem i totalnie nie trafiam w sedno sprawy. Być może to jest rozwiązanie, ale jakoś nie wiem jak to wykorzystać. Cały czas jestem przekonany że w tabeli 'Kategorie', przez proponowane rozwiązanie, definiujemy na stałe co jest podkategorią czego itd, a tutaj zupełnie nie o to chodzi, każdy wpis ma swój system gdzie jest kategoria i różne podkategorie. Jest ciężko, ale dzieki za pomoc smile.gif
nospor
Skoro już tak bardzo upierasz się przy swoim rozwiązaniu to dobra winksmiley.jpg

Proponuję je tylko trochę zmienić:
Tabela twoich kategorii pozostaje bez zmian.

Teraz tabela firm FIRMA:
Cytat
ID
NAME


Teraz tabela FIRMA_KATEGORIA, która zawiera informacje jakie kategorie zawiera firma i jakie podkategorie zawiera kategoria:
Cytat
ID_FIRMA - klucz obcy z tabeli FIRMA
ID_KATEGORIA - kategoria glowna, klucz obcy z tabeli KATEGORIA
ID_PODKATEGORIA - pod kategoria kategori z ID_KATEGORIA, klucz obcy z tabeli KATEGORIA


Przykład:
KATEGORIA:
Cytat
5 Portale
7 Wyszukiwarki
10 Rejestracja
11 Internet
12 e-mail

FIRMA:
Cytat
0 ONET
1 WP

FIRMA_KATEGORIA:
Cytat
0 5 7
0 5 10
1 11 12


ONET
------Portale
----------Wyszukiwarki
----------Rejestracja

WP
------Internet
----------e-mail
pc5
Wydaje mi się że znalazlem prostsze rozwiązanie, to proponowane przezemnie wcześniej. Otóż w doatkowej kolumnie podkategorie_id typu char przechowuję string, budowany przez impolde, a w stringu umieszczam id wybranych podkategori, potem sprawdzam czy dana kategoria jest w podkategoriach, robie to wpierw tak ze daje expolode danego stringa i w ten sposob mam tablice z wybranymi id, a potem juz tylko sprawdzam czy dane id jest w tablicy (funkcja in_array troszke zmodyfikowaną). Działa ładnie.

Co do Twojego rozwiązania nospor, widać nie dorosłem jeszcze w edukacji mysqla do zastosowania takiej konstrukcji. Jednak na pewno do tego wrócę i przyda się na pewno. Tak więc na razie stosuję swoje rozwiązanie. Dzięki za pomoc!
Pozdrawiam!
nospor
Twoje rozwiązanie ma poważną wadę.
Przykładowo:
ŻEby znaleźć, czy dana kategoria jest pod kategorią jakiejś innnej, musisz najpierw wczytać podkategorie z bazy, rozbić string na tablicę i dopiero stwierdzić. W moim rozwiązaniu zaŁatwi się to zapytaniem prostym i przyjemnym.

Ale jeśli Twój sposób ci wystarcza, to znaczy że wszytko jest ok. winksmiley.jpg

pozdro
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.