Autor | Zpráva | ||
---|---|---|---|
Anonymní Profil * |
#1 · Zasláno: 24. 8. 2008, 18:08:26
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 |
#2 · Zasláno: 24. 8. 2008, 18:12:40
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 |
#3 · Zasláno: 24. 8. 2008, 18:17:38
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 |
#4 · Zasláno: 24. 8. 2008, 18:27:41
Joker.. ok, díky...
|
||
joe Profil |
#5 · Zasláno: 25. 8. 2008, 03:40:37
„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 |
#6 · Zasláno: 25. 8. 2008, 09:47:05 · Upravil/a: Perry
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 |
#7 · Zasláno: 25. 8. 2008, 17:01:21
„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 |
#8 · Zasláno: 25. 8. 2008, 17:43:00
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 |
#9 · Zasláno: 25. 8. 2008, 18:12:11
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. |
||
Časová prodleva: 16 let
|
0