návrh databáze - tabulky vs tabulka

návrh databáze - tabulky vs tabulka
« kdy: 05. 01. 2012, 12:42:59 »
Ahoj,

začínám dělat aplikaci a řeším problém s návrhem mysql databáze. snažím se přemýšlet trochu dopředu a tak myslím na budoucí výkon a zátěže

aplikace bude mít registrované uživatele

jde mi o to, jestli je lepší, v rámci výkonu a budoucí možné zátěže, udělat pro jednotlivé uživatele vlastní tabulky s jejich daty nebo všechno řešit na základě pár tabulek a z nich tahat data pro jednotlivé uživatele

díky za pomoc a sorry za trochu divný předmět tématu, nic lepšího mě nenapadlo:)


tap

Re:návrh databáze - tabulky vs tabulka
« Odpověď #1 kdy: 05. 01. 2012, 13:06:51 »
Vykonovy prinos (ked vobec nejaky bude, je dost mozne ze to bude horsie) samostatnych tabuliek pre uzivatelov, zdaleka nevyvazi problemy ktore si nimi vyrobis.

branchman2

Re:návrh databáze - tabulky vs tabulka
« Odpověď #2 kdy: 05. 01. 2012, 13:15:54 »
Cau, ked nechces robit spojenia, vyber z kategorii a nechces casto prechadzat celu tabulku od zaciatku po koniec, tak je vacsinou najlepsie dat vsetky udaje do jednej tabulky.
Teda tabulka uzivatel moze mat stlpce uid, meno, dalsie_mena, priezvisko, titul_pred, titul_v, titul_za, heslo, nick, vyska, obvod pasu, ...
Keby si tam chcel spravit este kolonku, v ktorej by mohla byt viac ako jedna hodnota, tak je krajsie rozdelit to do viac tabuliek.
Ak podla tej hodnoty nebudes chciet nikdy vyhladavat a bude sa to citat naozaj casto, tak sa casto oplati to denormalizovat a ulozit kludne viac hodnot do jednej bunky (co je sice hnus, ale byva to rychlejsie).

Re:návrh databáze - tabulky vs tabulka
« Odpověď #3 kdy: 05. 01. 2012, 13:28:13 »
Ahoj,

začínám dělat aplikaci a řeším problém s návrhem mysql databáze. snažím se přemýšlet trochu dopředu a tak myslím na budoucí výkon a zátěže

aplikace bude mít registrované uživatele

jde mi o to, jestli je lepší, v rámci výkonu a budoucí možné zátěže, udělat pro jednotlivé uživatele vlastní tabulky s jejich daty nebo všechno řešit na základě pár tabulek a z nich tahat data pro jednotlivé uživatele

díky za pomoc a sorry za trochu divný předmět tématu, nic lepšího mě nenapadlo:)

Nejlepší řešení bude to DB schéma navrhnout podle normálních forem (první až třetí stačí) a dle dotazů a výsledků příkazu explain potom navrhnout indexy. Takto navržené schéma bude daleko flexibilnější z hlediska dotazů a mnohonásobně rychlejší, než "intuitivní" návrh z hlavy.

Navíc v tom tvém návrhu by pro tisíc uživatelů muselo být vytvořeno tisíc tabulek. Tísíc otevřených souborů, tisíc položek v table cache. Už je to jasné? To nebude rychlé nikdy.

Kit

Re:návrh databáze - tabulky vs tabulka
« Odpověď #4 kdy: 05. 01. 2012, 16:11:12 »
jde mi o to, jestli je lepší, v rámci výkonu a budoucí možné zátěže, udělat pro jednotlivé uživatele vlastní tabulky s jejich daty nebo všechno řešit na základě pár tabulek a z nich tahat data pro jednotlivé uživatele

Databáze SQL byly navrženy tak, aby byly efektivní právě pro případ, kdy máme několik tabulek společných pro všechny uživatele. Vytvořit v nich milióny či miliardy uživatelů (záznamů) v jedné tabulce není žádný výkonnostní problém. Naopak při vytváření už desítek tisíc tabulek se výkonnostní problémy začínají projevovat.

Dělat každému uživateli vlastní tabulky by bylo neefektivní a pomalé. De facto by se funkce, které jsou databázích optimalizovány, přesunuly na souborový systém. Také správa by byla komplikovaná a nebylo by možné jednoduchým způsobem aplikovat hromadné změny pro všechny uživatele.

Všechno však nemusí být černobílé. Existuje velmi malé procento případů, ve kterých by mohlo být výhodné opačné nebo spíš NoSQL řešení. Ovšem podle povahy dotazu soudím, že to tvůj případ není.


Logik

  • *****
  • 1 031
    • Zobrazit profil
    • E-mail
Re:návrh databáze - tabulky vs tabulka
« Odpověď #5 kdy: 05. 01. 2012, 21:16:05 »
Kit: to platí pro db, které mají každou tabulku ve svém souboru. Rozumná db (a i ty méně rozumné, jako např mysql s innodb) používají tablespace a tam je to jedno. Naopak rodělování do více tabulek (partitioning) je opravdu metoda na zvýšení výkonu.
-
Dal bych ale určitě všechny uživatele do jedné tabulky (popř. více tabulek dle NF), protože se s tím daleko lépe dělá. Pokud se ptáte na takovoudle věc, zřejmě nebudujete enterprise aplikaci s miliardami záznamů, kde by opravdu bylo třeba ladit výkon - a z hlediska čistoty návrhu a snadnosti programování je partitioning opruz.



Kit

Re:návrh databáze - tabulky vs tabulka
« Odpověď #6 kdy: 05. 01. 2012, 21:42:56 »
Kit: to platí pro db, které mají každou tabulku ve svém souboru. Rozumná db (a i ty méně rozumné, jako např mysql s innodb) používají tablespace a tam je to jedno. Naopak rodělování do více tabulek (partitioning) je opravdu metoda na zvýšení výkonu.
Souhlasím, rozumná DB by to měla dělat jak píšeš a mělo by to být jedno. Stále však nevíme, jakého rozsahu mají být tabulky tazatele. Ani nevíme, proč si vybral právě MySQL. Navíc předpokládám, že chce použít MyISAM jako většina uživatelů.

Také jsem kdysi nad něčím podobným uvažoval u diskuzního fóra - každé vlákno v jiné databázi. Zavčas jsem si to rozmyslel. Vypsání seznamu vláken (nejčastější operace) by bylo velmi náročné na prostředky.

Re:návrh databáze - tabulky vs tabulka
« Odpověď #7 kdy: 14. 01. 2012, 14:08:28 »
ok, díky všem za rady a postřehy. rozhodl jsem se pro řešení společných tabulek + pořádně poladit indexy na tabulkách