niedawno tworzyłem generator pliku XML na podstawie danych z bazy w PHP
dla jednej z firm która wyświetla oferty wielu sklepów internetowych (format pliku xml był narzucony przez nich)
Wygląda miej więcej tak:
<offer> <id>PDA-MIO A702</id> <name>Smartphone MIO Digiwalker A702</name> <price>1666</price> <url>link_do_produktu_w_sklepie_internetowym</url> <categoryId>Smartphony/MIO</categoryId> <description><p> Mio A702 to rewolucyjne urządzenie, które mimo niewielkich rozmiarów (57.5x110 mm, waga 148 g) łączy w sobie funkcje kilku urządzeń. </p> </description> <image>link_do_obrazka_na_serwerze_sklepu_internetowego</image> <attributes> <attribute> <name>Kod_producenta</name> <value>PDA-MIO A702</value> </attribute> <attribute> <name>Producent</name> <value>MIO</value> </attribute> </attributes> </offer>
obecnie stworzyłem generator pliku XML na podstawie danych z bazy w PHP dla nas, a bardziej dla sklepów,
firm które chcą umieszczać nasze oferty u siebie w sklepach internetowych (format pliku xml narzucam ja)
Wygląda miej więcej tak:
<produkt> <producent>nazwa_producenta</producent> <kategoria>kategoria_produktu</kategoria> <model>model_produktu</model> <ktm>P170W5DD/T830/160/1,0S1/WF</ktm> <nazwa>nazwa_produktu</nazwa> <cenadetal>2849.00</cenadetal> <cenahurt>2599.00</cenahurt> <opisdodatkowy>Nowy model laptopa został zbudowany o Technologię procesorow.....</opisdodatkowy> <opisroz>Nowy model laptopa został zbudowany o Technologię procesorową IntelŽ Centrin.....</opisroz> <specyfikacja><div class="specyfikacja"><table class="specdetails" width="100%...<specyfikacja> <image>obrazek_zakodowany_base64</image> <dostepnosc>33</dostepnosc> </produkt>
I teraz moje pytania i wątpliwości:
1) Rozmiar plik xml z zakodowanymi obrazkami base64 wzrasta prawie 45 krotnie (21MB) gdy plik xml z linkami do tych obrazków (http://www...i_tak_dalej) jest wielkości 500KB. Jesli wybiore kodowanie obrazków to mam wielki plik xml'owy i problem z zaciąganiem go przez innych z kolei jak wybiorę linki do tych obrazków to mam problem bo każdy kto wejdzie na stronę sklepu będzie łączył sie z moim serwerem i zaciągał te obrazki. Która metodę proponujecie zastosować?
2) Obrazków zakodowane metodą base64 nieraz wyrzucają zakodowany ciąg znaków z niedopuszczalnymi w xmlu znakami (&, <, >) i wtedy XML wyrzuca mi błąd parsowania. Można to jakość obejść? Ja osobiście pomyślałem aby przefiltrować taki zakodowany ciąg znaków i pozamieniać znaki (&, <, >) na (&, <, >)
3) To bardzie bazodanowe pytanie, bazę mam firebird. Staram sie jakoś zoptymalizować zapytanie bo obecnie trwa bardzo długo. Nie wiem czy to wina bazy (a słyszałem bardzo wiele złego o tej bazie jeśli idzie o używaną pamięci), czy może moje zapytanie SQL jest nie optymalne.
O to moje pytanie SQL w jednym wywołaniu:
SELECT A.ktm, A1.wartosc AS liniawww, A4.wartosc AS kategoria, T.nazwa, T1.opispod, T1.opisroz, C.cenanet AS cenadetal, C1.cenanet AS cenahurt, TP.ref, B.ext FROM atrybuty A JOIN atrybuty A1 ON (A1.ktm = A.ktm AND A1.cecha = 'l' AND A1.wersjaref = A.wersjaref) JOIN atrybuty A2 ON (A2.ktm = A.ktm AND A2.cecha = 'r' AND A2.wartosc = '1' AND A2.wersjaref = A.wersjaref) JOIN atrybuty A3 ON ((A3.cecha = A1.cecha) AND (A3.wartosc = A1.wartosc) AND (A3.ktm containing('www_'))) JOIN atrybuty A4 ON (A4.ktm = A3.ktm AND A4.cecha = 'gr') JOIN towary T ON (T.ktm = A.ktm AND T.witryna = '1' AND T.akt = '1') JOIN towary T1 ON (T1.ktm = A3.ktm AND T1.witryna = '1' AND T1.akt = '1') JOIN cennik C ON (C.ktm = A.ktm AND C.cennik = '62' AND C.wersja = '0') JOIN cennik C1 ON (C1.ktm = A.ktm AND C1.cennik = '63' AND C1.wersja = '0') JOIN towpliki TP ON (TP.ktm = A3.ktm AND TP.numer = '1') JOIN s_binary B ON (B.fileref = TP.ref) WHERE A.cecha = 'g' AND ((A.wartosc = 'AR') OR (A.wartosc = 'GPS') OR (A.wartosc = 'ARUM'))
Czas oczekiwania na wynik tego zapytania trwa od 5 do 12 min.

oraz zapytanie SQL w więcej niż dwóch zapytaniach:
SELECT A.ktm, A.wartosc, A1.wartosc AS grupa, A2.wartosc AS nazwa, T.opispod, T.opisroz, TP.ref, B.ext FROM atrybuty A JOIN atrybuty A1 ON (A1.ktm = A.ktm AND A1.cecha = 'gr') JOIN atrybuty A2 ON (A2.ktm = A.ktm AND A2.cecha = 'l') JOIN atrybuty A3 ON (A3.ktm = A.ktm AND A3.cecha = 'podstawowy' AND A3.wartosc = '1') JOIN towary T ON (T.ktm = A.ktm AND T.witryna = '1') JOIN towpliki TP ON (TP.ktm = A.ktm AND TP.numer = '1') JOIN s_binary B ON (B.fileref = TP.ref) WHERE A.cecha = 'g' AND (A.wartosc = 'AR' OR A.wartosc = 'GPS' OR A.wartosc = 'ARUM')
wynik tego zapytania puszczam w pętli foreach
i dla każdego wiersza wywołuje kolejne zapytanie SQL:
SELECT A.ktm, C.cenanet AS cenadetal, C1.cenanet AS cenahurt, T.nazwa FROM atrybuty A JOIN atrybuty A1 ON (A1.ktm = A.ktm AND A1.cecha = 'g' AND A1.wartosc = '".$a_grprod['wartosc']."') JOIN atrybuty A2 ON (A2.ktm = A.ktm AND A2.cecha = 'r' AND A2.wartosc = '1') JOIN towary T ON (T.ktm = A.ktm AND T.witryna = '1') JOIN cennik C ON (C.ktm = A.ktm AND C.cennik = '62' AND C.wersja = '0') JOIN cennik C1 ON (C1.ktm = A.ktm AND C1.cennik = '63' AND C1.wersja = '0') WHERE A.wartosc = '".$a_grprod['nazwa']."' AND A.cecha = 'l'
Czas oczekiwania na wynik tych dwóch powyższych zapytania (z czego drugie zapytanie jest wywołane w pętli jakieś 16 razy) trwa od 1 do 2 min.

Wyniki tych zapytań są identyczne.
I teraz pytanie, dlaczego tak sie dzieje...
Moze zapytania SQL są jakoś przeze mnie mało efektywnie stworzone..
Wielkie dzięki za jaka kolwiek pomoc, sugestie albo uwagi...
Pozdrawiam...