Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [mysql] zaawansowana wyszukiwarka, struktura bazy
Arek00
post
Post #1





Grupa: Zarejestrowani
Postów: 177
Pomógł: 0
Dołączył: 8.11.2005

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


dostaję taki plik xml z opisami produktów:

  1. ...
  2.  
  3. <produkt id="MONASUL170006" nazwa="MONITOR ASUS 17" LCD VB172T" producent="ASU" grupa="MON-L17" gwarancja="F036M">
  4. <technika>
  5. <parametr nazwa="Kod Producenta" opis="VB172T" jm="" typ="varchar" />
  6. <parametr nazwa="Format obrazu" opis="5:4" jm="" typ="varchar" />
  7. <parametr nazwa="Przekątna ekranu" opis="17" jm="cale" typ="float" />
  8. <parametr nazwa="Rozmiar plamki" opis="0.264" jm="mm" typ="varchar" />
  9. <parametr nazwa="Nominalna rozdzielczość" opis="1280 x 1024" jm="" typ="varchar" />
  10. <parametr nazwa="Jasność" opis="300" jm="cd/m2" typ="int" />
  11. <parametr nazwa="Kontrast" opis="2000" jm=":1" typ="int" />
  12. <parametr nazwa="Czas reakcji matrycy" opis="5" jm="ms" typ="float" />
  13. <parametr nazwa="Kąt widzenia w pionie" opis="160" jm="Stopni" typ="varchar" />
  14. <parametr nazwa="Kąt widzenia w poziomie" opis="160" jm="Stopni" typ="varchar" />
  15. <parametr nazwa="Ilość wyświetlanych kolorów" opis="16,7" jm="mln" typ="float" />
  16. <parametr nazwa="Gniazdo D-Sub" opis="1" jm="szt." typ="int" />
  17. <parametr nazwa="Gniazdo DVI" opis="1" jm="szt." typ="int" />
  18. <parametr nazwa="Wejście audio" opis="1" jm="" typ="varchar" />
  19. <parametr nazwa="Czytnik kart" opis="brak" jm="" typ="varchar" />
  20. <parametr nazwa="Głośniki" opis="1Wx2stereo,RMS" jm="" typ="varchar" />
  21. <parametr nazwa="Wbudowany zasilacz" opis="True" jm="" typ="bit" />
  22. <parametr nazwa="Zgodność z normami" opis="Energy StarŽ,TCO03, UL/cUL, CB, CE, FCC, CCC, BSMI, Gost-R, C-Tick, VCCI, PSB, RoHS" jm="" typ="varchar" />
  23. <parametr nazwa="Kolor obudowy" opis="czarny" jm="" typ="varchar" />
  24. <parametr nazwa="Wyposażenie" opis="D-Sub cable, Power cord, Quick start guide, CD user guide, Warranty card" jm="" typ="varchar" />
  25. <parametr nazwa="Pobór mocy Wł./Wył." opis="40/2" jm="W" typ="varchar" />
  26. <parametr nazwa="www" opis="www.asus.pl" jm="www" typ="varchar" />
  27. </technika>
  28. </produkt>
  29.  
  30. ...


w jaki sposób zapisywać to do bazy danych aby móc stworzyć wyszukiwanie według cech czyli np. chciałbym wyszukać wszystkie 17 calowe monitory które posiadają jasność 300cd/m2.

wymyśliłem coś takiego:

Kod
id   |id_produktu   |kategoria|nazwa_cechy     |wartosc    |jm
-----------------------------------------------------------------
1    |MONASUL170006 |MON-L17  |Kod Producenta  |VB172T     |
2    |MONASUL170006 |MON-L17  |Format obrazu   |5:4        |
3    |MONASUL170006 |MON-L17  |Przekątna ekranu|17         |cale
4    |MONASUL170006 |MON-L17  |Rozmiar plamki  |0.264      |mm
5    |MONASUL170006 |MON-L17  |Jasność         |300        |cd/m2


i teraz mogę robić takie zapytanie:
  1. SELECT id_produktu WHERE kategoria='MON-L17' AND nazwa_cechy='Jasność' AND wartosc='300'



czy ktoś ma jakąś lepszą koncepcję jak to zorganizować?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
chlebik
post
Post #2





Grupa: Zarejestrowani
Postów: 113
Pomógł: 5
Dołączył: 12.09.2006
Skąd: Pruszków/Warszawa

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


Przede wszystkim unikalbym zapisywania w bazie w kolumnach jakiegokolwiek tekstu. Domyslam sie, ze przesylany XML ma z gory okreslony format i dane, ktore sie w niego wklada. Zatem nie

  1. 3 |MONASUL170006 |MON-L17 |Przekątna ekranu|17 |cale


ale:

  1. 3 | MONASUL170006 | ID_KATEGORII | ID_PARAMETRU | 17 (jezeli tutaj moga byc tez litery TO VARCHAR() | ID_JEDNOSTKI



I poszczegolne ID pozapisywac w oddzielnych tabelach i joinowac. Dlaczego? W madrych ksiazkach wyczytalem, ze nalezy jak najwiecej rzeczy w zapytaniu wykonywac w modelu relacyjnym, dlatego tez takie zapytanie przedstawione przez Ciebie jest zle, bo musisz przeszukac WSZYSTKIE WIERSZE TABELI. A czy nie lepiej zrobic tak:


  1. SELECT * FROM produkty AS p JOIN kategorie AS k ON p.id_kategorii = k.id AND k.id = [b]WARTOSC_POSZUKIWANA_KATEGORII[/b]
  2. JOIN ........ JOIN ........
  3. JOIN ........



Jesli umiejetnie zrobisz generowanie takiego zapytania to nie potrzeba robic nawet warunkow WHERE, gdyz wszystkie warunki zmiescisz w warunkach zlaczenia, zgodnym ze standardem SQL92. Choc przyznaje, ze to co pisze to teoria, jak to w praktyce wyjdzie to juz pokombinuj.
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: 10.10.2025 - 22:43