Autor Zpráva
JardaB
Profil
Zdravím,

potřebuji navrhnout strukturu tabulky a poradit jak provádět správně update jednotlivých záznamů. Uvedu na hodně zjednodušeném příkladu.

nyní používám tyto dvě tabulky:

rybniky: id, uzivnost..
obsadka: id, uzivnost, vek, prirustek ...

První tabulka obsahuje udaje o vodní ploše a její úživnosti
Do tabulky dvě zapíšu všechny ryby které tam jsou včetně úživnosti z tabulky1 a poté co měsíc provedu update, který modifikuje hromadně záznamy dle vzorce a zapíše přírůstky.

Jelikož bude v tabulce dvě až 50M záznamů, tak ji chci optimalizovat. Především v tabulce dvě je myslím zbytečný údaj uzivnost, protože jej mám k dispozici v hlavní tabulce.
Jenže když jej odeberu, tak nevím jak přesně napsat dotaz pro hromadné udate, kde se využívá ve vzorci prave uzivnost.

Nyní používám podobný dotaz, který počítá že v tabulce dvě je hodnota uzivnost. Jak napsat dotaz, který vezme údaj z tabulky jedna? Tím bych zmenšil velikost výsledné dtb a uživnost bych nemusel uvádět u každé ryby, když je pro dané id vodní plochy stejná.

UPDATE obsadka SET  
delka = delka + (365/vek*uzivnost/12)
WHERE cron < $info[mesic]                                                              
ORDER BY cron ASC LIMIT 10000");
Kajman
Profil
Jestli všechny druhy ryb rostou stejně rychle, tak něco takového...
UPDATE obsadka o
JOIN     rybniky r
ON       o.id_rybnik=r.id
SET      o.delka = o.delka + (365/o.vek*r.uzivnost/12),
         o.cron = now(), # nebo neco takoveho
         o.vek = o.vek + ???
WHERE    o.cron < $info[mesic]
ORDER BY o.cron ASC
LIMIT    10000 

Ale nejsem si jístý, jestli půjde takto kombinace joinu s order by a limitem. Kdyby to takto nešlo, tak bych ještě zkusil join na poddotaz, který z rybníků vyzobne jen těch 10000 a order by s limitem se tedy přesune tam.

UPDATE obsadka o
JOIN
       (
                SELECT   o2.id
                FROM     osadka o2
                WHERE    o2.cron < $info[mesic]
                ORDER BY o2.cron ASC
                LIMIT    10000 ) o3
ON     o.id=o3.id
JOIN   rybniky r
ON     o.id_rybnik=r.id
SET    o.delka = o.delka + (365/o.vek*r.uzivnost/12),
       o.cron = now() # nebo neco takoveho

Ale osobně bych si nechal v tabulce osadka vždy původní délku, původní věk a datum, kdy byly tyto hodnoty platné.

Pak bych si počítal (možná do jiné tabulky) hodnoty do sloupečků vek_aktualni, delka_aktualni dle původních údajů, pokud je to opravdu potřeba mít předpočítané a není to možné počítat přímo v dotaze.
JardaB
Profil
Kajman:

Bohužel každá ryba poroste jinak. K tomu slouží parametr přírustek a ten chci aby byl u každé ryby jiný byť jde o stejný druh. Ale napadlo mne propočítat souvislost úživnost vs přírůstek a uložit ji jako koeficient. Tím bych neměl úživnost ani přírustek, ale jen jeden sloupec koeficient.
Netuším totiž, jak budou vaše složité dotazy svižné oproti mým..
Kajman
Profil
Svižnost si můžete jednoduše vyzkoušet na testovacích datech.

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:

0