Autor | Zpráva | ||
---|---|---|---|
Prkny Profil |
#1 · Zasláno: 30. 1. 2012, 12:18:49
Dobrý den, rád bych vyslechl Váš názor na následující téma.
Od klienta dostávám XML soubor s aktualizacemi zboží. Tento soubor neboli jeho data porovnávám se stávající tabulkou v mysql. Pokud je někde změna tak oprav, pokud zboží v XML není zboží smaž, pokud je tam nějaký záznam zboží navíc přidej do mysql. Pro představu se jedná o 50 XML souborů, každý o cca. 300 záznamech, aktualizace jednou dvakrát denně. Rád bych se zeptal na technické řešení s ohledem na zátěž serveru a DB. Číst řádek po řádku z XML a porovnávat s databází ? nebo Možná je rychlejší načíst celé XML do tabulky temp a porovnávat dvě mysql tabulky? nebo jiné řešení ? |
||
Kajman Profil |
#2 · Zasláno: 30. 1. 2012, 12:30:21
Inspirace by se dala najít v nedávném tématu aktualizace xml feedu do shopu - vše smazat a nahrát celý?
|
||
Prkny Profil |
#3 · Zasláno: 30. 1. 2012, 13:29:44
Kajman:
Děkuji, velice zajímavé a chytré řešení. Přesto moje otázka k diskusi trvá dále. Je lepší aktualizovat rovnou při čtení XML nebo aktualizovat a porovnávat dvě tabulky. Postup při čtení XML: 1) Porovnám hash položky, pokud se zmeni postupuji dále 2) Načtu proměnné daného zboží z XML 3) V db vyhledavam dle nazvu (některá XML nemaji jedinečné id) 4) Pokud najdu položku - uložím si jednotlivé proměnné z tabulky 5) Proměnné s XML a proměnné z tabulky porovnám 6) Pokud se liší -> UPDATE Postup při dvou tabulkách 1) Porovnám hash položky, pokud se zmeni postupuji dále 2) Uložím celou položku do tabulky temp 3) Pokud by šlo porovnat dvě tabulky přímo v mysql a zapsat změnu, mohlo by to být mnohem méně náročné Bohužel u tohoto postupu nevím jak porovnat dvě tabulky, a pokud by byl záznam jiný tak UPDATE |
||
Kajman Profil |
#4 · Zasláno: 30. 1. 2012, 14:07:42
Prkny:
„Bohužel u tohoto postupu nevím jak porovnat dvě tabulky, a pokud by byl záznam jiný tak UPDATE“ Snad by to šlo takto nějak... update ostra_tabulka o join nove_udaje n on o.pk1=n.pk1 and o.pk2=n.pk2 set o.hodnota1=n.hodnota1, o.hodnota2=n.hodnota2 -- where aspon jedna hodnota je v nove tabulce jina insert into ostra_tabulka (sloupce,...) select sloupce,... from nove_udaje n left join ostra_tabulka o on o.pk1=n.pk1 and o.pk2=n.pk2 where o.pk1 is null delete o from ostra_tabulka o left join nove_udaje n on o.pk1=n.pk1 and o.pk2=n.pk2 where o.pk1='typxmlfeedu' and n.pk1 is null Pokud nechcete z tabulky ve skutečnosti mazat a jen tam mít příznak, že je položka smazána, tak v první update si nastavíte, že není smazána, a místo delete uděláte update nenalezených na příznak smazanosti. |
||
Prkny Profil |
#5 · Zasláno: 30. 1. 2012, 15:54:19
Kajman:
Předem děkuji za snahu mi pomoci. Pro přehlednost a otestováni jsem si vytvořil dvě tabulky: xml_ostra (id,nazev,cena,popis), xml_temp (id,nazev,cena,popis) 1) update xml_ostra o join xml_temp n on o.nazev=n.nazev set o.cena=n.cena, o.popis=n.popis
update funguje krásně ... 2) insert into xml_ostra (nazev,cena,popis) select nazev,cena,popis from xml_temp n left join xml_ostra o on o.nazev=n.nazev where o.nazev is null 3) delete o from xml_ostra o left join xml_temp n on o.nazev=n.nazev where o.nazev='typxmlfeedu' and n.nazev is null |
||
Kajman Profil |
#6 · Zasláno: 30. 1. 2012, 16:05:45
2) select n.nazev, n.cena ...
3) Osobně bych si ukládal, ke kterému feedu řádek patří. Když nahraji do xml_temp např. jen jeden feed a nechci smazat vše ostatní, tahle podmínka to pohlídá. |
||
Prkny Profil |
#7 · Zasláno: 30. 1. 2012, 16:39:17
Ještě poslední věc ohledně toho nemazání, někde dělám chybu:
Pokud nechcete z tabulky ve skutečnosti mazat a jen tam mít příznak, že je položka smazána, tak v první update si nastavíte, že není smazána, a místo delete uděláte update nenalezených na příznak smazanosti. update xml_ostra o join xml_temp n on o.nazev=n.nazev set n.zobraz = 0 WHERE n.nazev is null |
||
Kajman Profil |
#8 · Zasláno: 31. 1. 2012, 12:23:33
left join
|
||
Prkny Profil |
#9 · Zasláno: 2. 2. 2012, 12:48:33
Kajman:
Ještě jednou bych Vám chtěl poděkovat. Díky. |
||
Časová prodleva: 12 let
|
0