Autor Zpráva
Anonymní
Profil *
Kolik by podle vás mělo být v rámci jedné stránky selectů z databáze ?

Mám momentálně 4 tabulky a v jedné jsou jména, v druhé komentáře, ve třetí obrázky apod. a každá má ID a podle těch ID to různě propojuju (např. vyberu komentář, podle ID toho, kdo to uložil vyberu jméno uživatele a třeba jeho datum registrace a ze třetí podle ID komentáře vyberu případné nahrané obrázky)... Jak by to šlo udělat "efektivněji" (nehce se mi totiž napevno dávat k autorovi komentáře jeho jméno, protože třeba můžu změnit uživateli jméno a pak to budu měnit všude možně, nebo naopak když přejmenuju topic, tak zas nebudou pasovat ty obrázky... takhle mi to přijde takové "flexibilní" a rychle upravitelné... jenom se bojí, že to moc vytěžuje DB (nebo jak mám vytížení otestovat ?)
Joker
Profil
Anonymní
Kolik by podle vás mělo být v rámci jedné stránky selectů z databáze?
Tolik, kolik je potřeba :-)

Pokud to jde udělat jedním, tak jeden, pokud je nutných deset, tak deset, pokud je nutných padesát, tak padesát.
Joker
Profil
Jinak ještě k tomu problému, pokud si ukládám uživatele, určitě je správně komentáře svázat s uživateli přes ID.
V tom popsaném případě by se dobře uplatnilo spojování tabulek (JOIN)
Perry
Profil
Joker.. ok, díky...
joe
Profil
jenom se bojí, že to moc vytěžuje DB
Tak v tvém případě se vůbec bát nemusíš. Protože jsem v tomhle směru už daleko chytřejší než dřív taky díky diskusi jpw, tak už vim co si můžu asi tak dovolit.

nebo jak mám vytížení otestovat ?
Jednoduše, vytvoř si na localhostu stejné tabulky, vlož do nich několik desítek tisíc řádků a pak se podívej na čas, jak dlouho trvají jednotlivé dotazy.

Taky musíš mít správně vytvořené indexy na sloupcích, pomocí kterých určuješ výběr za WHERE v dotazu.
Perry
Profil
Indexy mám vytvořené na všech sloupcích, na které volám WHERE.... dotazy trvají maximálně kolem 0,005, většina se vejde do 0,001
joe
Profil
dotazy trvají maximálně kolem 0,005, většina se vejde do 0,001
Tak co řešíš? ;-) Pravděpodobně to ani stejně líp udělat nepůjde, když máš jen jeden join, maximálně dva. Otázka je jestli máš ještě správné typy sloupců. A čísla nemáš jako varchar apod..
Perry
Profil
joe... ne, čísla jsou opravdu int :) Ale JOIN nepoužívám, protože mám jednu fci. a tu pořád volám, když potřebuju přiřadit číslo jméno uživatele (využívám to třeba i při prohlížení profilů, kdy má jeho ID v adrese apod.) Takže když výpis zedituju na jednom místě, mění se opět všude :) Snažil jsem se to co nejvíc oddělit od designu a psát to k rychlé editaci a přehlednosti (což nevím, jetsli úplně vyšlo :D)
AlešD
Profil
Perry
Možná pomůže následující postup, který s úspěchem používám:
v každé tabulce mám pole ID (integer) (autoinkrement bez opakování) - primární klíč tabulky, další data podle potřeby - nápověda viz. 3. normální forma

pokud chcu přiřadit nějaké řádky z jiné tabulky vytvořím v ní cizí klíč - integer (i mě syntaxe jméno_tabulkyID) + index na něj. Zapisuji do něj hodnoty ID z nadřazené tabulky

Spojení je potom:
WHERE tabulka.ID = spojená_tabulka.tabulkaID - vybere shodná pole s obou tabulek
Pokud je tabulek víc, určím v podmínce uspořádané dvojice operátorem AND

Podobně LEFT JOIN a RIGHT JOIN ale podle směru vybere všechny pole jedné tabulky a z druhé jenom odpovídající.


Úplně ideální je definice těchto relací v uložených procedurách databáze, nicméně v MySQL (na rozdíl od PostgreSQL a MSSQL a určitě mnoha dalších) mi to moc spolehlivě nefungovalo.

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