Strávíte před programováním aplikace dlouhé hodiny návrhem databáze, nebo začnete psát program a databázi navrhujete za běhu? Správným návrhem databáze můžete ušetřit čas a problémy.
Pokud programujete aplikaci, která potřebuje využívat databázi, je návrh databáze stejně důležitý jako samotný návrh struktury programu. Samozřejmě tím nemyslím databáze o velikosti několika řádek, i když zde správný návrh databáze taky ušetří nějakou tu práci, ale o rozsáhlých databázích, obsahujících několik milionů záznamů.
Je nutné si uvědomit, že po zaplnění velké databáze, je každý zásah do její struktury, či ještě hůře, zásah do dat v uložených tabulkách, velmi nepříjemný a určitě ne jednoduchý.
Obvykle, než začnu programovat, vezmu si do ruky tužku a papír a kreslím si. Kreslím si tabulky, vazby mezi tabulkami, zvažuji jak budou probíhat dotazy, jak budou jednotlivé tabulky mezi sebou nutně komunikovat, vypisuji si dotazy, vypisuji si složitější dotazy, které budou nutně muset probíhat a snažím se tyto dotazy co možná nejvíce optimalizovat, stejně jako data v tabulce. Optimalizace dotazů na databázi je stejně důležitá jako správný návrh tabulky.
Při návrhu je nutné rozmýšlet jak strukturu tabulek, tak datové typy v tabulkách. Běžně předem známe přibližné hodnoty, které budou v jednotlivých sloupcích tabulek uloženy a tím pádem můžete jejich velikosti přizpůsobit.
Když ukládáme do sloupce jeden znak, je zbytečné volit typ VARCHAR o velikosti 255 znaků, když nám databáze nabízí například CHAR o velikosti 1 znaku.
Po návrhu tabulek a celé struktury databáze je vhodné si vytvořit například na lokálním počítači ukázkovou databázi, včetně naplnění obsahu tabulek. Čím více dat do tabulek naplníte, tím lépe. Sám programátor si musí uvědomit, jak obsáhlé tabulky v praxi a při běžném používání budou.
Na takto vytvořené databázi můžete jednoduše vyzkoušet vytvořené dotazy z prvního kroku přípravy a můžete sledovat časy jejich vykonávání.
Já například používám jednu databázi, která v současné době obsahuje miliony záznamů o velikosti cca 20 Gb, díky správné optimalizaci a dobrému návrhu databáze je program schopný veškeré potřebné informace ze všech různých tabulek dostat během několika setin sekundy.
Samozřejmě nejdou všechny dotazy řešit jednoduše, a ve velkých aplikacích a rozsáhlých databázích se musí obvykle vyskytovat i složitější dotazy, které zaberou více času, než obvyklé dotazy.
Pokud takového dotazy moje aplikace obsahuje, snažím se o jejich spouštění co možná nejméně, aby zbytečně celou databázi nezatěžovali.
Většinou není třeba tyto dotazy spouštět neustále dokola, ale stačí jenom několikrát za den, a jejich výsledky je možné "kešovat".
Tím pádem není problém dotazy spouštět v předem určené době, kdy není databáze tolik vytížená – ideálně v noci.
Některé databáze obsahují samy o sobě nástroje pro optimalizace tabulek.
Například databáze MySQL obsahuje nástroj OPTIMIZE TABLE, který umožní defragmentaci dat v tabulce.
Fragmentace dat je nevýhodou úložišť s proměnnou délkou řádek, a tento příkaz dokáže takto vytvořené tabulky optimalizovat a ušetřit tak například i místo, které tabulka zabírá.
mysql> optimize table bpd.an; +--------+----------+----------+--------------------------------+ | Table | Op | Msg_type | Msg_text | +--------+----------+----------+--------------------------------+ | bpd.an | optimize | status | Table is already up to date | +--------+----------+----------+--------------------------------+ 1 row in set (0.00 sec)
Příkaz analyze table se stará jak jinak než o analýzu tabulky, nebo tabulek.
Analýzu tabulek je dobré spouštět periodicky v zadaných intervalech, protože databáze výsledek tohoto příkazu využívá.
mysql> ANALYZE TABLE bpd.an; +--------+---------+----------+-------------------------------+ | Table | Op | Msg_type | Msg_text | +--------+---------+----------+-------------------------------+ | bpd.an | analyze | status | Table is already up to date | +--------+---------+----------+-------------------------------+ 1 row in set (0.00 sec)
Každá databáze obsahuje spoustu nástrojů pro optimalizaci dat, nebo získání informací o stavu dat, v tabulkách. Všechny tyto nástroje jsou popsány v dokumentacích databází a určitě je vhodné je používat.
Není vhodné podceňovat návrh, i třeba jednoduché databáze, která se časem může rozrůst.