Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [mysql] zaawansowana wyszukiwarka
Forum PHP.pl > Forum > Bazy danych
Arek00
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ć?
chlebik
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.
Arek00
tylko problem w tym że w tym pliku nie ma ID_PARAMETRU i ID_JEDNOSTKI tylko same wartości a produktów jest ponad 10000 i tych parametrów jest ponad 1100. dostaję gotowy plik i nikt mi nie powie czy doszły jakieś nowe parametry czy jednostki. poza tym nie mogę użyć pola typu varchar dla wartości cech bo często są tam opisy o długości większej niż na to pozwala ten typ pola. na chwilę obecną wymyśliłem coś takiego:

Kod
id   |id_produktu |kategoria |nazwa_cechy |wartosc_krotka |wartosc_dluga |jm |


jeśli wartość danej cechy ma poniżej 15 znaków to wrzucam ją do wartosc_krotka (varchar) a jeśli jest dłuższa to do wartosc_dluga (text)

na id_produktu, kategoria, nazwa_cechy, wartosc_krotka założę indeksy i już nie będę przeszukiwał całej tabeli

tylko jak napisać zapytanie o monitory 17 cali z kontrastem 2000 i czasem reakcji matrycy 5?
Sedziwoj
Jeśli chcesz zrobić to dobrze, to nie możesz ot tak wrzucić do bazy, byś musiał trochę przeanalizować. Do tego jak mogą być różne jednostki, to nie wyszukasz po danym polu, no chyba że skonwertujesz.
Do tego każdy produkt powinien mieć jeden wpis w bazie, tzn. chodzi o nazwę itp. cechy które są dla niego unikalne.
Jeśli nie chcesz tego robić dobrze, to niech każda cecha będzie osobną kolumną. A jeżeli różne produkty mają różne cechy to rozdzielenie tych informacji na więcej tabel.
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.