Zadejte hledaný výraz...

Sledování změn databáze vůči xml souboru – hodně položek

Václav Mach
verified
rating uzivatele
(13 hodnocení)
28. 4. 2011 17:50:59
Zdravím.
Řeším problém s prestashopem ve kterém je cca 50 000 položek. K dispozici je jednou denně aktualizovaný 100MB xml soubor, bohužel s celým sortimentem a bez označení změn. Potřebuji zjistit co se změnilo (new, deleted, změna ceny nebo dostupnosti) v xml souboru a rád bych to dělal jinak než posláním 50000 dotazů na databázi (a to ještě hodně zjednodušuji). Zatím se kloním k tomu udělat jednorázově ze zboží v databázi array ve které by byly klíči nějaké hashe sestavené z kodu zboží, ceny, dostupnosti. Z xml souboru vytvářet po jednom klíče stejným algoritmem a testovat zda existují v array.
Možná ale existuje pro podobnou situaci nějaké standardní řešení které neznám?
Podotýkám že reset tabulek a znovu načtení celého sortimentu je nereálné z více důvodů.
28. 4. 2011 17:50:59
https://webtrh.cz/diskuse/sledovani-zmen-databaze-vuci-xml-souboru-hodne-polozek#reply632227
tm
verified
rating uzivatele
(5 hodnocení)
8. 5. 2011 12:07:10
Ahoj,
rád bych zde uveřejnil trochu z mých zkušeností a postřehů co se týče programování importů :)
Prvně - pole nedoporučuji. Při takovém množství položek ti to může díky paměťovým nárokům sejmout skript (samozřejmě záleží, co bys do pole ukládal). Mám zkušenosti s importem do databáze, kde bylo cca půl milionu položek a do pole jsem načítal několik údajů - nároky na paměť dosahovaly bez problému i 1 GB. Při menším počtu položek jsou samozřejmě nároky na paměť nižší, je ale třeba do budoucna počítat s tím, že se sortiment zboží mění a za půl roku můžeš importovat dvojnásobný počet položek nebo z databáze načítat dvojnásobný položek.
Importy doporučuji řešit ve spolupráci s dočasnými tabulkami a sql dotazem LOAD DATA LOCAL INFILE .... Celý import je pak neskutečně rychlý s minimálními nároky na paměť a s minimálním počtem SQL dotazů - pro každý sloupec v db, o kterém chci vědět, zda v něm došlo ke změně, odpovídá právě jeden SQL dotaz.
Jaký je tedy postup importu?
  • Rozparsuji, zkontroluji, případně upravím a nakonec uložím data z XML feedu do souborů, které budu načítat dotazem LOAD DATA LOCAL INFILE ... - jedná se prakticky o CSV soubor.
  • Vytvořím dočasné tabulky, do kterých budu nahrávat data z těchto souborů.
  • Provedu import dat ze souborů do dočasných tabulek. Import je možné uskutečnit i v případě, že databáze (MySQL) běží na jiném stroji, než na kterém běží importní skript. Např. takto:
  • Teď mám na databázovém stroji původní data a data z XML feedu. Nyní už je velmi jednoduché data zaktualizovat. např. takto:
    Informace o aktualizovaných položkách lze ukládat do jiné dočasné tabulky, kterou na konci importu vyexportuješ.
    Tímto způsobem mohu kontrolovat, které údaje jsem u kterých položek aktualizoval, kdy jsem je aktualizoval a kolik jsem jich aktualizoval. Díky tomu, že jeden produkt != jeden SQL dotaz, je aktualizace mnohonásobně rychlejší. Tímto způsobem lze do databáze data nahrnout v řádech několika desítek vteřin, případně v řádech minut.
    V případě hlubšího zájmu, na internetu najdeš spoustu užitečného materiálu k importům do MySQL databáze, doporučuji např. http://chrisjohnson.blogsite.org/php-and-mysql-data-import-performance/
  • 8. 5. 2011 12:07:10
    https://webtrh.cz/diskuse/sledovani-zmen-databaze-vuci-xml-souboru-hodne-polozek#reply632226
    Václav Mach
    verified
    rating uzivatele
    (13 hodnocení)
    10. 5. 2011 00:31:54
    Děkuji za opravdu zajímavou odpověď. Shodou okolností se na to chystám zítra. Navržený postup vypadá velmi rozumně. Sice jsem si spočítal že pole by nemělo jít přes 5MB, ale pokud nenarazím na nějaký zádrhel/návaznost v updatech tak jsou tabulky očividně lepší.
    10. 5. 2011 00:31:54
    https://webtrh.cz/diskuse/sledovani-zmen-databaze-vuci-xml-souboru-hodne-polozek#reply632225
    Pro odpověď se přihlašte.
    Přihlásit