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 (1 - 3)
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.


--------------------
"Człowiek dążący do swego celu może być skuteczny tylko w przypadku, jeśli każdą minutę swego życia wykorzysta z maksymalną korzyścią dla osiągnięcia zaplanowanego celu. Jeśli stworzył dla siebie system kar i karze sam siebie za każdą zmarnowaną minutę. Człowiekowi w zupełności wystarczą 3-4 godziny snu, cały pozostały czas może być wykorzystany dla osiągnięcia upragnionego celu." -- Wiktor Suworow
Java devBlog
KulturalnyChlebik
Go to the top of the page
+Quote Post
Arek00
post
Post #3





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

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


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?

Ten post edytował Arek00 26.05.2008, 11:18:51
Go to the top of the page
+Quote Post
Sedziwoj
post
Post #4





Grupa: Zarejestrowani
Postów: 793
Pomógł: 32
Dołączył: 23.11.2006
Skąd: Warszawa

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


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.


--------------------
Algorytmy w PHP, czy ktoś o tym słyszał?
Dlaczego tak mało kobiet programuje? ponieważ nie zajmują się głupotami.
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 21.08.2025 - 03:42