Autor Zpráva
Prkny
Profil
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
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
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
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
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
db vypisuje chybu #1052 - Column 'nazev' in field list is ambiguous

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
Co je myšleno pod "typxmlfeedu"
Kajman
Profil
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
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
left join
Prkny
Profil
Kajman:
Ještě jednou bych Vám chtěl poděkovat. Díky.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: