Autor | Zpráva | ||
---|---|---|---|
it47 Profil |
#1 · Zasláno: 31. 5. 2018, 17:25:35
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 |
#2 · Zasláno: 31. 5. 2018, 17:36:27
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 |
#3 · Zasláno: 31. 5. 2018, 18:17:48
A je tam vůbec nutná ta kontrola? Není jednodušší všechno smazat a uložit aktuální stav pokaždé?
|
||
it47 Profil |
#4 · Zasláno: 1. 6. 2018, 00:24:04
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 |
#6 · Zasláno: 1. 6. 2018, 06:14:57
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 |
#7 · Zasláno: 1. 6. 2018, 14:48:27
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 |
#8 · Zasláno: 1. 6. 2018, 14:54:28
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 |
#9 · Zasláno: 1. 6. 2018, 14:56:07
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 |
#11 · Zasláno: 1. 6. 2018, 15:20:14
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 |
#12 · Zasláno: 1. 6. 2018, 15:22:48
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 |
#13 · Zasláno: 1. 6. 2018, 17:46:21
juriad, Keeehi:
dakujem pani za super vysvetlenie, velmi ste mi pomohli, mate to u mna. ;-)) Ste borci. Dakujem pekne. it47 |
||
Časová prodleva: 6 let
|
0