![]() |
[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łowy ![]() 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 ![]() Pozdrawiam Przemek RE: [MySQL] Gdzie zapisać kilka wybranych opcji z x dostępnych? - KowR - 27-08-2009 Sam sobie odpowiedziałeś. ![]() 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 ![]() 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ś. Hehe, też miałem takie wrażenie, kończąc tego posta ![]() Dzięki za odpowiedź ![]() 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 ![]() 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 ![]() |