Autor Zpráva
it47
Profil
Ahojte,

potreboval by som seriozne poradit ohladne parsovanie jedalneho menu pre cely tyzden.

1. Prvy krat ked to parsujem, tak je vsetko jasne, kazde jedlo zapisem do DB na samostatny riadok (id, jedlo, cena, datum, id_jedalne, ...)
2. Avsak kazdy den v tyzdni chcem skontrolovat cely tyzden, ci sa nahodou jedalnicek nezmenil.
3. Nechcem to kontrolovat riadok po riadku, ale moja idea je, ze vyparsujem jeden cely den, ulozim do jednej premennej (pripadne pole), potom si vySELECTujem ten isty den v DB a ulozim do premennej (pripadne pole). Porovnam tieto dve premenne, pokial su rovnake, nic neriesim. Pokial nie su rovnake, vymazem VSETKY riadky jedal daneho dna, a INSERTnem vsetky nove jedla daneho dna. T.j. nebudem zbytocne riesit riadok po riadku, v ktorom jedle nastala zmena.
4. Vzhladom k tomu, ze je mala pravdepodobnost, ze sa budu jedla menit pocas tyzdna, pride mi to ako najlepsie riesenie.

Co si o tom myslite? Existuje aj nejake krajsie riesenie? Pripadne efektivnejsie riesenie?

Vopred dakujem velmi pekne za vase cenne rady.

it47
Keeehi
Profil
it47:
Řešíš něco, co není třeba řešit. Máš nějaký reálný důvod, proč bys to neměl kontrolovat záznam po záznamu?
Tomášeek
Profil
A je tam vůbec nutná ta kontrola? Není jednodušší všechno smazat a uložit aktuální stav pokaždé?
it47
Profil
Tomášeek, Keeehi:

No ide o to, ze ked sa bude kontrolovat asi 10 jedalni x 10 jedal x 14 dni, tak to bude strasne vela SQL dopytov.

A mojim riesenim sa usetria dopyty. :)

Ci rozmyslam zle? ;-)) 1400 dopytov nie je vela? zbehne to vsetko pod 1 sekundu?

Vopred velka vdaka za pomoc.
Tomášeek
Profil
it47:
No, pokud vse smazes a ulozis naráz znovu, tak to muže byt jeden insert.

I kdyby jich ale bylo tolik, co píšeš, a dělo se to jednorázově nejdy v noci, je to jedno.

Jako kontrolu zmen me ještě napadlo totéž, ck se děla u souboru. Udělej si hash zdroje (toho, kde jsou jídla) a porovnávej minuly hash se současným. Pokud nesedi, proved update.
Keeehi
Profil
it47:
1400 dotazů není až tak moc. Kdyby jsi to prováděl při každém načtení stránky s jídelníčky, tak by to problém být mohl, ale ty to provádíš samostatně a jen jednou za čas. Navíc ty neprovádíš najednou 1400 dotazů ale jen 100.

Snažíš se opravit/vylepšit něco, co jsi zatím ani nezkusil. Takže nemůžeš vědět, jestli to je reálný problém nebo ne. Říká se tomu premature optimization.
it47
Profil
Keeehi:
Navíc ty neprovádíš najednou 1400 dotazů ale jen 100.

ako to, ze iba 100 dotazov?

Ved napriklad ked chcem vlozit 5 jedal pre 1 den a 1 jedalen, tak musim vykonat 5 SQL dotazov nie? ;-))

Alebo sa da to nejako spojit do jedneho SQL dotazu? ;-))

INSERT INTO meals (id_jedalen nazov, cena, datum )VALUES (1, 'Jedlo 1', '5.3', '2018-06-01');
INSERT INTO meals (id_jedalen nazov, cena, datum )VALUES (1, 'Jedlo 2', '5.3', '2018-06-01');
INSERT INTO meals (id_jedalen nazov, cena, datum )VALUES (1, 'Jedlo 3', '5.3', '2018-06-01');
INSERT INTO meals (id_jedalen nazov, cena, datum )VALUES (1, 'Jedlo 4', '5.3', '2018-06-01');
INSERT INTO meals (id_jedalen nazov, cena, datum )VALUES (1, 'Jedlo 5', '5.3', '2018-06-01');

Vopred dakujem velmi pekne.

it47
juriad
Profil
Ano dá; můžeš tedy takto vkládat celé jídelny najednou.
INSERT INTO meals (id_jedalen, nazov, cena, datum) VALUES 
(1, 'Jedlo 1', '5.3', '2018-06-01'), (1, 'Jedlo 2', '5.3', '2018-06-01'), (1, 'Jedlo 3', '5.3', '2018-06-01'), (1, 'Jedlo 4', '5.3', '2018-06-01'), (1, 'Jedlo 5', '5.3', '2018-06-01');

Omezení je na délku dotazu ( Object moved), ale na to asi nenarazíš, dokud nebudeš mít k obědu Homéra.
Keeehi
Profil
it47:
ako to, ze iba 100 dotazov?
Protože jsem zapomněl, že na tom menu je více dní.
it47
Profil
juriad:
wow, to som nevedel :) dakujem pekne za vybornu radu :)

a da sa to iste robit aj s UPDATE? ;-))

Vopred dakujem velmi pekne.

it47


juriad:
a vlastne este otazka: je tento spojeny doraz do jedneho 5x efektivnejsi, ako ked vykonam 5 samostatnych SQL dotazov? ;-))
Keeehi
Profil
it47:
a da sa to iste robit aj s UPDATE?
Spíš ne. Update sice může upravit více řádků ale na všech musí být provedena stejná operace. Takže se nedá na různé řádky zapsat různé hodnoty.

je tento spojeny doraz do jedneho 5x efektivnejsi
Téměř ano.
juriad
Profil
Ano, je to efektivnější.

1 Poslat dotaz
2 Zparsovat dotaz
3 Připravit plán pro spuštění dotazu
4 Vyhodnocení dotazu
5 Úprava indexů
6 Poslání výsledku zpátky
I kdyby databáze interně vkládala řádky po jednom, tak stejně ušetříš na bodech 1, 2, 3, 6.

Pro update je to složitější a asi se ti to nevyplatí: dev.mysql.com/doc/refman/8.0/en/insert-on-duplicate.html (v podstatě to udělá INSERT, který když se nepovede, tak se místo něj provede UPDATE)
O něco jednodušší je použít REPLACE (stejně jako UPDATE vyžaduje správný unikátní/primární klíč).

Nebo můžeš manuálně napřed provést DELETE všech řádků, které budeš vkládat: DELETE FROM meals WHERE jidelna = 1 AND datum >= '2018-06-01' (smažeme budoucí jídelníček celé jídelny)
it47
Profil
juriad, Keeehi:

dakujem pani za super vysvetlenie, velmi ste mi pomohli, mate to u mna. ;-))

Ste borci.

Dakujem pekne.

it47

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: