Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Problem z zaprojektowaniem bazy danych., Zapis wyborów uzytkowniaka do bazy danych mysql.
exseerius
post
Post #1





Grupa: Zarejestrowani
Postów: 55
Pomógł: 0
Dołączył: 31.12.2006

Ostrzeżenie: (0%)
-----


Witam, mam problem, z optymalizacją.

Mam strone, gdzie loguja się uzytkownicy i w swoim profilu maja kilka opcji do wyboru (ok 15).

przykładowo:

ulubiony kolor:
[_] zielony
[_] niebieski
[_] czerwony itp.

do tej pory rozwiazałem problem tak, że w bazie danych mam kolumne kolory i tam zapis w postaci 1.0.0.1.1.1.1.0.1.0...
1 odpowiada włączonej opcji, 0 wyłaczonej

W sumie działa jak powinno, ale musze te dane obrabiać, explodem i jest problem z kolejnością, bo dane muszą zawsze wyswietlać się w kolejnosci jaka pierwotnie została podana w array zadeklarowanym w dokumencie. Druga sprawa to problem z wyszukiwaniem, bo stworzenie zapytania gdzie WHERE wygląda np tak.

WHERE kolor = 0.0.0.0.0.0.1.1.0.0.0.0 OR 1.1.1.1.1.0.0.0.0.0 itp jest trochę na około.

Czy jest mozliwość rozwiązania tego w inny sposób?

Wymysliłem dwa rozwiązania, ale nie wiem czy bedą one optymalne:

#1 dwie tabele, jedna z definicją kolorów

id | kolor
1 | niebieski
2 | zielony

druga wybory
id | user | wybor_1 | wybor_2 | wybor_3
1 | 1 | true | flase | true

php sprawdza opcje wyszukujac kluczy "WHERE wybor_"kolor.id - trochę lepsze rozwiązanie, ale chyba nadal jest to nie to co ma być, bo dopisanie kolejnego koloru dowyboru musze dopisać kolejną kolumne w "wyborach"

#2 drugie rozwiązanie siedzi u mnie tylko w głowie, bo nie wiem jak do końca to rozwiązać.
Mianowicie utworzenie tabeli np. wybory, gdzie jako nazwy kolumn będa opcje możliwe do wyboru (niektóre zawierają polskie znaki, znaki /\-=+).

np.

id | user | niebieski | zielony | czerwony | jasno-żółty
1 | 1 | true | true | false | true

i pytanie co jest lepsze w filtrowaniu danych. Jak wyświetlić na stronie tylko nagłówki kolumn z pominieciem id i user.


Ewentualnie jaki jeszcze inny sposób proponujecie na rozwiązanie tej zagwostki w taki sposób, aby łatwo było napisać pod to wyszukiwarkę.

Ten post edytował exseerius 2.11.2009, 14:01:18
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
Ges
post
Post #2





Grupa: Zarejestrowani
Postów: 61
Pomógł: 9
Dołączył: 22.02.2008

Ostrzeżenie: (0%)
-----


Czemu na upartego robić to po stronie PHP ? Wszystko na około :]

Nie prościej będzie skorzystać z typu SET w SQL ?
http://dev.mysql.com/tech-resources/articl...t-datatype.html
myset SET('zielony','czerwony','niebieski')

Na danych w SET pracujesz jak na flagach:
zielony 00000001
czerwony 00000010
niebieski 00000100

Można robić & i || (np: zielony & niebieski = 5).
Jedyny limit to 64 elementy w tym typie danych, ale z opisu Twojego problemu wynika, że w tym przypadku jest to idealne rozwiązanie.

Nie będę tu przeklejał tutoriala. Pocztaj linka którego dałem powyżej.
Dodam tylko, że jeszcze jedna ważna sprawa to możliwość wyszukiwania pomiędzy wartościami od razu na bazie.
Wyciąganie tego do PHPa i explode strasznie nieekonomiczne, bo wyciągasz z bazy wiersze których możesz nigdy nie użyć
bo po zrobieniu explode może się okazać, że wiersz ten nie spełnia Twoich oczekiwań.

W przypadku proponowanego przeze mnie rozwiązania masz to gotowe:
SELECT * FROM tabela WHERE myset LIKE '%zielony%niebieski%';
SELECT * FROM tabela WHERE myset & 5 = 5;

Myślę, że reszte doczytasz sam. Chciałem tylko naprowadzić Cię na rozwiązanie (IMG:style_emoticons/default/smile.gif)

Aha no i oczywiście najlepiej sobie podefiniować zmienne define('') w PHPie zgodne z SQL do wygodnego korzystania (IMG:style_emoticons/default/smile.gif)

Ten post edytował Ges 15.11.2009, 22:07:20
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 9.10.2025 - 05:03