Autor Zpráva
Tazzy
Profil *
Zdravím všechny vespolek,

mám takový prozaický dotaz. Lámu si hlavu nad otázkou, zda je lepší v některých případech použít jednu tabulku s velkým počtem sloupců, nebo takovou tabulku rozdělit na více menších. Uvedu příklad, který (snad) mluví za vše:

Dejme tomu, že budu mít tabulku s uživateli. V ní budou uloženy jak důležité údaje (ID, login, heslo, .....), tak údaje doplňkové (osobní text, oblíbené jídlo, barva spodního prádla, ...) a teď je otázka, jestli mít jednu monstrózní tabulku, nebo dvě menší. Zajímalo by mě, jestli pak případné vyhledávání a vůbec operace s "menší tabulkou s důležitými údaji" bude efektivnější a doplňkové informace se budou joinovat jen v případě potřeby. S tabulkou uživatelů se bude pracovat v podstatě nepřetržitě, ale zobrazovat doplňující údaje již bude třeba méně často. Také bych dodal, že pro každého uživatele by byl právě jeden řádek v tabulce s doplňujícími údaji, tedy počet uživatelů a počet záznamů s doplňujícími údaji by byl roven. Taky dodávám, že doplňujících údajů může být poměrně mnoho...

Je to jen teoretický příklad, nijak se neopírá o skutočnost, ale zajímalo by mě, co je lepší? Díky za každý postřeh
t4nn3r
Profil *
no pokud ty doplňkové údaje bedete používat občas, je podle mě rozhodně lepší udělat tu tabulku se základními údaji a pak vytvořit relační pro zbytek - 3 soupce IDUZIVATELE, PROMENNA,HODNOTA no a pak tam vkladat 3,oblibene jidlo, guláš.
tiso
Profil
Záleží od situácie:
- podľa čoho vyberáš záznamy (where sekcia, pre zrýchlenie treba použíť indexy)
- aké údaje vyberáš
- koľko tých údajov (= stĺpcov) bude
- koľko % v stĺpci je zaplnených. Je zbytočné mať celý stĺpec a tam 2% užitočných údajov
- ako často chceš pridávať nové typy údajov

V tomto modelovom príklade si neuvažoval tretiu možnosť:
1. základná tabuľka s užívateľmi users(id, login, password, ...)
2. tabuľka s názvami doplnkových údajov user_info_keys(id, name)
3. tabuľka s hodnotami doplnkových údajov k jednotlivým užívateľom user_info_values(user_id, key_id, value)
Nevýhoda tohto riešenia je ukladanie len jedného dátového typu.

Tvoje modelové riešenia by sa dali použiť iba na nemenné počty údajov (=stĺpcov):
-veľkú tabuľku by som použil výnimočne, a iba ak väčšina údajov bude vždy vyplnená a aj vyžadovaná.
-dve tabuľky rozdelené podľa povinných/nepovinných položiek, ak by sa na väčšinu dotazov použila iba prvá tabuľka a len v zlomku prípadov druhá.
ninja
Profil
Jakou databázi a případně typ tabulek budete používat?
Tazzy
Profil *
t4nn3r:
Díky, ale tohle nebyla otázka jak spojovat tabulky...

tiso:
S tabulkou uživatelů - tedy důležité, či povinné údaje by se prováděly klasické operace jako přihlašování, výpisy (celkové, online, ajánevímco), přiřazování jmen k publikovaným informacím... A tak podobně. Indexy jsou samozřejmostí, ale znovu připomínám, že tohle je čistě teoretická záležitost, nejde o nic konkrétního a tedy i počet sloupců je irelevantní - dejme tomu, že sloupců může být klidně i 50+. Co se týče zaplnění, tak povinné údaje (důležité) budou vyplněny 100%, zbytek už je na samotných uživatelích, takže dejme tomu 40% - 60% (střízlivým odhadem). Pokud myslíš rozšiřování tabulky, pak by to asi nebylo nijak časté. Dejme tomu, že by se tabulka upravovala maximálně 1 až 2 ročně.

Třetí možnost mi do toho moc nezapadá právě kvůli omezenosti na jeden datový typ, kterých v totmo případě bude asi víc: může tam být například datum narození, osobní text, podpis do fóra, ... pak cizí klíče z jiných tabulek, ... Uvažujme, že lze využít celé spektrum datových typů, minimálně budou zcela jistě využito datum, text a čísla (konkrétní datové typy teď neřešme).

Myslím, že by nebyl problém použít tento model i v případě, že by jednou za čas ke změně údajů došlo. Upravit pár dotazů není až zas tak velký problém a taková změna by zcela jistě změny vyžadovala i na jiných úrovních, než jen v DB.

ninja:
Zapomněl jsem napsat, omlouvám se. Řeším php a MySQL. Typ tabulek bych asi nechal klasické MyISAM.

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