Jak na návrh databáze, která zvládne i náročnou aplikaci
Špatný návrh databáze je technický dluh, který vás zaručeně zpomalí. Zjistěte, proč je normalizace klíčová pro výkon a jak se vyhnout chybám, které ohrožují stabilitu aplikace. Postavte základ, který bez problémů unese miliony záznamů a budoucí růst.
18. 6. 2025 • 8 min
Databáze je u většiny aplikací to první, co vznikne – a často i to, co se nejmíň řeší. Přitom na ní všechno stojí. To, že databáze „nějak funguje“, ještě neznamená, že je navržená dobře. Skutečná prověrka přichází až ve chvíli, kdy systém začne růst a data počet záznamů v databázi roste do miliónů.
V tomhle článku se podíváme na to, co dělá databázový návrh kvalitním – z pohledu dlouhodobé udržitelnosti, výkonu i čitelnosti. Ukážeme si, proč se relační databáze a SQL stále drží na špici. Projdeme principy normalizace a vysvětlíme si, kdy dává smysl udělat výjimku.
Obsah článku
Jak poznat dobrý návrh databáze?
Návrh databáze se řídí několika klíčovými principy. Prvním je, že duplicitní (redundantní) data jsou problém – zabírají zbytečně místo a zvyšují riziko nekonzistence. Pokud se například e-mail uživatele ukládá na více místech, dříve nebo později dojde k situaci, kdy se jednotlivé verze liší.
Druhým principem je, že správnost a úplnost dat jsou naprosto zásadní. Aplikace, která pracuje s nepřesnými daty, bude vracet chybná čísla, nefunkční logiku a její chování bude nepředvídatelné. Každé rozhodnutí nebo výstup založený na nekonzistentních datech může vést k chybám, které se těžko dohledávají.
eliminuje zbytečnou redundanci, která by mohla vést k nekonzistenci a chybám,
respektuje vztahy mezi entitami (např. uživatel ↔ objednávka) a zpřístupňuje data bez zbytečných komplikací,
zajišťuje integritu dat pomocí klíčů, omezení a pravidel, místo spoléhání na aplikační logiku,
počítá s tím, že aplikace poroste – přibudou nové funkce, více dat, nové požadavky.
Relační nebo nerelační?
Rozhodnutí mezi SQL a NoSQL databází není o trendech (i když dřív bylo NoSQL velmi populární a můžeme mluvit o trendu), ale o konkrétním použití.
Relační databáze (např. PostgreSQL, MySQL) jsou ideální, pokud potřebujete:
silná integrita dat (např. účetnictví, e-shopy, ERP),
komplexní vazby (uživatelé, oprávnění, historie změn),
auditovatelnost, transakce a konzistenci.
Nerelační databáze (např. MongoDB, Redis, DynamoDB) jsou naopak flexibilnější. Dávají smysl tam, kde:
nestrukturovaná nebo často měnící se data,
velké objemy jednoduchých záznamů (logy, telemetry),
systémy, kde je prioritou rychlost čtení/zápisu a horizontální škálování.
V praxi často funguje hybridní model – klíčová data běží na SQL, doplňková část (např. cache, realtime logy) na NoSQL.
Proč má normalizace smysl
Cílem normalizace je navrhnout databázi tak, aby:
neobsahovala redundantní data,
byla konzistentní,
umožňovala snadné změny bez vedlejších efektů.
Normalizace probíhá ve více krocích – tzv. normálních formách. Nejčastěji se v praxi používá 1NF až 3NF.
První normální forma (1NF)
Základní požadavek: každý sloupec obsahuje jen jednu hodnotu a každý řádek je jednoznačně identifikovatelný (např. pomocí primárního klíče).
Denormalizace znamená ukládat některá data duplicitně, aby se zrychlilo čtení nebo zjednodušily dotazy (např. reporty).
Příklad:
Do tabulky orders můžete přidat customer_email, pokud ho často potřebujeme při exportu.
Do products můžete přidat category_name, pokud často filtrujeme podle názvu kategorie.
Je ale důležité mít jasno:
Denormalizace je vědomý kompromis.
Vyžaduje dodatečnou logiku, která zajistí, že se data synchronizují.
Hodí se hlavně tam, kde je čtení výrazně častější než zápis.
Nejčastější chyby při návrhu databáze
Absence normalizace – Duplicitní data, nejednoznačnosti, zbytečně velké tabulky.
Přílišná (nebo žádná) denormalizace – Příliš složité JOINy vs. zbytečné kopírování dat. Je potřeba najít rovnováhu podle konkrétního use-casu.
Špatně zvolené datové typy – Např. použití TEXT místo VARCHAR, INT tam, kde stačí TINYINT
Chybějící (nebo špatně nastavené) primární a cizí klíče
Nekonzistentní pojmenování tabulek a sloupců – Např. user_id vs. userid vs. id_user
Návrh bez ohledu na výkon – Např. nedomyšlené indexy, n+1 dotazy, pomalé dotazy přes LIKE
Zanášení business logiky do databáze – Triggery, stored procedury a složité pohledy často zvyšují složitost
Nesprávné navrhování vazeb n:n – Chybí spojovací tabulky nebo mají víc dat, než by měly (např. pivot tabulka obsahuje i logiku, co tam nepatří).
Chybějící auditní a stavové sloupce – Není možnost sledovat změny (created_at, updated_at, deleted_at),
Nemá smysl návrh databáze podceňovat
Studie provedené na velkých datasetech (např. IMDb) ukázaly, že dobře normalizovaný návrh:
snižuje datovou velikost o 10 – 15 %,
zrychluje klíčové dotazy i několikanásobně,
má nižší spotřebu paměti a nižší zatížení CPU.
Navíc přináší nižší náklady na údržbu – nové funkce se přidávají rychleji, kód je přehlednější a méně náchylný k chybám.
Jak postupovat při návrhu databáze
Definujte účel databáze a hlavní scénáře použití – Než začnete navrhovat schéma, ujasněte si, k čemu bude databáze sloužit. Jaká data bude ukládat? K čemu bude sloužit (čtení, zápis, filtrování)?
Určete základní entity (objekty systému) – Zaměřte se na klíčové prvky aplikace – například uživatel, objednávka, produkt, článek. Každá z těchto entit se zpravidla stane samostatnou tabulkou.
Navrhněte vztahy mezi entitami – 1:1, 1:N, N:M (pivot), případně dědičnost (např. různé typy uživatelů).
Zvolte vhodné datové typy – Určete přesné typy (VARCHAR, INT, BOOLEAN, DATE, DECIMAL atd.) a nastavte rozumné limity (NOT NULL, UNIQUE, výchozí hodnoty apod.).
Zajistěte datovou integritu pomocí klíčů
Navrhněte strategii pro mazání dat a jejich historii – Rozhodněte, zda budete data mazat „hard-delete“ nebo „soft-delete“. Potřebujete uchovávat historii změn, auditní stopy, verze záznamů?
Identifikujte klíčové dotazy a připravte indexy – Zaměřte se na to, jak budou data nejčastěji čtena – podle toho navrhněte vhodné indexy.
Tip z praxe: Pomocí seederů a factory tříd si vygenerujte statisíce záznamů a simulujte reálné dotazy. Snadno tak odhalíte slabá místa, nevhodné indexy, nebo n+1 problémy co nejdříve.
Závěr
Dobře navržená databáze není ta, která jen aktuálně funguje. Je to ta, která je od začátku připravená na růst – počítá s větším množstvím dat, s rozšiřováním funkcí i s tím, že systém nebude spravovat jeden člověk, ale celý tým.
Není to o zbytečné složitosti, ale opromyšleném základu, který unese i další vývoj. Správné schéma se nemusí měnit při každé nové funkci – protože s ní už od začátku počítá.
A právě taková databáze dává projektu klidný prostor růst bez technického dluhu.
Ondřej Musil
Jsem vývojář, který se zaměřuje na projekty, kde standardní řešení nestačí. Od roku 2018 pomáhám digitálním agenturám a firmám s technicky náročnými výzvami – od návrhu robustní architektury až po optimalizaci a další rozvoj WordPress a Laravel aplikací.
Jak škálovat Laravel aplikace v roce 2025: architektura, databáze, výkon, CI/CD, monitoring i bezpečnost. Kompletní návod, jak postavit aplikaci, která zvládne růst od stovek po desítky tisíc uživatelů.
Je váš WordPress web časovaná bomba? Problém není v jádru, ale v pluginech. Právě na ně míří přes 90 % všech útoků. Automatizované skripty možná právě teď hledají vaši chybu. Zjistěte, jaká jsou největší rizika a jak ochránit svůj byznys dřív, než bude pozdě.
Proč psát admin rozhraní v Laravelu ručně, když to jde 10x rychleji? Objevte Filament a přestaňte ztrácet čas s formuláři a tabulkami. Zjistěte, jak dodat udržitelný a čistý kód bez technického dluhu a kde jsou naopak jeho limity.
Laravel nebo Symfony? Dva PHP frameworky, které patří k tomu nejlepšímu, co vývojáři používají. Jeden sází na rychlost a jednoduchost, druhý na stabilitu a robustní architekturu. V tomto článku ukazuji jejich rozdíly a vysvětluji, kdy dává smysl zvolit který.
Hledáte spolehlivého vývojáře?
Nemusíme hned začít – stačí se pobavit o tom, co potřebujete. Někdy i krátký rozhovor hodně vyjasní.