Forum Webmastera, HTML, CSS, PHP, MySQL, Hosting, Domeny - Forum dla Webmasterów
[MySQL] Gdzie zapisać kilka wybranych opcji z x dostępnych? - Wersja do druku

+- Forum Webmastera, HTML, CSS, PHP, MySQL, Hosting, Domeny - Forum dla Webmasterów (https://www.webmastertalk.pl)
+-- Dział: Technologie internetowe - tworzenie stron WWW (https://www.webmastertalk.pl/forum-technologie-internetowe-tworzenie-stron-www)
+--- Dział: Programowanie, Bazy danych (https://www.webmastertalk.pl/forum-programowanie-bazy-danych)
+--- Wątek: [MySQL] Gdzie zapisać kilka wybranych opcji z x dostępnych? (/thread-mysql-gdzie-zapisac-kilka-wybranych-opcji-z-x-dostepnych)



[MySQL] Gdzie zapisać kilka wybranych opcji z x dostępnych? - pkwiecien - 27-08-2009

Witam

Stoję właśnie przed pewnym wyborem i proszę Was o radę, które rozwiązanie uważacie za lepsze.

Tworzę stronę, której jednym z elementów jest katalog samochodów. Stworzyłem już bazę danych marek i modeli. Teraz, użytkownicy dodając konkretny samochód mają mieć możliwość zaznaczenia pewnych opcji. Opcje te mają być ustalone przez admina i są "typu binarnego", tzn. albo są, albo nie. Wśród opcji ma być np. klimatyzacja, autamtyczna skrzynia biegów, szyberdach, skórzana tapicarka, wbudowany GPS. Te opcje dodawane są do tabeli pojazdy_opcje, która ma tylko dwa pola: id oraz nazwę opcji.

Nie potrafię się zdecydować między dwoma strategiami zapisywania wybranych opcji. Załóżmy, że z wcześniej wymienionych użytkownik zaznaczył, że ma klimę, skórę i gps. I tak:

Pomysł 1:
W bazie danych dodaję tablicę pojazdy_opcje_wybrane, która ma trzy kolumny: id, id_opcji oraz id_pojazdu. W momencie, kiedy będę potrzebował tych danych (czyli na stronie danego pojazdu) wrzucam szybciutko takie zapytanie:

Kod PHP:
SELECT id_opcji FROM pojazdy_opcje_wybrane WHERE id_pojazdu=$_GET['pojazd'

I dostaję listę wybranych opcji. Jeszcze muszę przerzucając wyniki tego zapytania, dla każdego osobnego znalezionego rekordu wysłać jeszcze zapytanie o nazwę opcji z tablicy pojazdy_opcje.
Problemem tutaj wydaje mi się też wielkość tablicy, bo przy np. 30 opcjach do wyboru i kilkuset pojazdach to ta tablica już będzie spora...

Pomysł 2:
W tablicy pojazdy mamy pole wybrane_opcje, gdzie wrzucamy oddzielane średnikiem identyfikatory opcji. Skomplikowane jest wyciągnięcie tych opcji, bo najpierw muszę wyciągnąć z bazy wartość pola wybrane_opcje, a potem przez explode() i pętle foreach dla każdego identyfikatora opcji wysłać zapytanie do bazy o jego nazwę...


Pomysł 3 (właśnie przyszedł mi do głowySmile):
Tablica pojazdy_opcje ma nie dwa, ale trzy pola. Dodatkowe to pojazdy. W tym polu, które ma typ text dodaję oddzielone średnikiem id pojazdów, dla których wybrano konkretne opcje.
Wywołanie danych na stronie jest w miarę proste: muszę znaleźć w bazie te opcje, dla których w polu pojazdy występuje identyfikator pojazdu, czyli mniej więcej coś takiego:

Kod PHP:
SELECT nazwa_opcji FROM pojazdy_opcje WHERE pojazdy LIKE $_GET['pojazd'

(wiadomo, że tam trzeba jeszcze ten średnik, bo szukająć id=1 znajdę m.in. 101, 23941, 11 itd itd)
To chyba jest najlepsze rozwiązanie... Łatwe do użycia, jednym zapytaniem znajduję wszystkie zaznaczone opcje, no i nie tworzę kolejnych 20 rekordów w bazie dla każdego pojazdu.



Proszę o Wasze opinie a propos tego problemu i z góry dzięki za pomoc Smile

Pozdrawiam
Przemek


RE: [MySQL] Gdzie zapisać kilka wybranych opcji z x dostępnych? - KowR - 27-08-2009

Sam sobie odpowiedziałeś. Big Grin

Dorób do pojazdu (samochodu) rekord odpowiadający za wszystkie opcje, gdzie 0 to BRAK, a 1 "W STANDARDZIE" (np.). Następnie oddzielasz je np. "-".

Przykład: 0-0-0-0-1-0-0 Smile


RE: [MySQL] Gdzie zapisać kilka wybranych opcji z x dostępnych? - pkwiecien - 27-08-2009

(27-08-2009, 14:49)rodi napisał(a): Sam sobie odpowiedziałeś. Big Grin

Hehe, też miałem takie wrażenie, kończąc tego posta Smile

Dzięki za odpowiedź Smile Twoje rozwiązanie jest trochę kłopotliwe... musiałbym pamiętać, które 0 i która jedynka są do której opcji... można do tego użyć tablicy i indeksu tej tablicy, ale chyba wolę tam wrzucać po prostu id poszczególnych opcji...

Pozdrawiam!


RE: [MySQL] Gdzie zapisać kilka wybranych opcji z x dostępnych? - Labsta.com - 27-08-2009

Osobiście dałbym więcej kolumn. Dlaczego? Dlatego, że nie jest zalecane umieszczanie kilku wartości w jednym polu. Dlaczego? Choćby dlatego, że za jakiś czas mogą zmienić się opcje (dojdzie choćby napęd hybrydowy) i będzie klops, a tak dodasz kolumnę i po sprawie.
Oczywiście łączenie tabel jak najbardziej, w jednej pojazd w drugiej nazwy opcji (żeby np.edytować ich nazwy). I wtedy tak jak pisał rodi 0 lub 1, ale w odpowiedniej kolumnie z id opcji w tabeli pojazdu.

Czyli stawiam na opcję 1 Smile


RE: [MySQL] Gdzie zapisać kilka wybranych opcji z x dostępnych? - KowR - 27-08-2009

Hmmm... Labsta.com, to zależy ile tych samochodów ma być w bazie danych. Jeżeli mniej niż 500 to użył bym 1 sposób. Jeżeli więcej zastosował bym moje rozwiązanie. Dlaczego? Z takiego rozwiązania przy "budynkach" korzystają nawet plemiona... Dzięki temu redukujemy wiele rekordów (większość rekordów), a nawet czas "dzielenia" tych danych jest mniejszy niż pobranie wszystkich rekordów z bazy danych.

Ale jak napisałem. To zależy ile ma być samochodów...


RE: [MySQL] Gdzie zapisać kilka wybranych opcji z x dostępnych? - Labsta.com - 27-08-2009

Chodziło mi głównie o rozwój stystemu i to, że mnie uczono, żeby wstawiać 1 wartość w 1 komorkę. Robiłem kiedyś baze noclegów i to podejście potem ułatwiło rozbudowę skryptu. Jeśli chodzi o wydajność to się nie wypowiadam, bo nie jestem spacem Smile, myślę jednak, że jest to sprawa dyskusyjna, w tym konkretnym przypadku.