Základem každé efektivně navržené databáze je správná volba datových typů. V tomto článku se ponoříme do světa datových typů v PostgreSQL a ukážeme si, jak je rozumně používat.
Volba správného datového typu není jen o tom, aby se data vešla do tabulky. Má přímý vliv na:
Výkon - menší datové typy zabírají méně místa na disku a v paměti, což vede k rychlejšímu čtení a zápisu.
Integritu dat - datové typy vynucují platnost dat, například zabraňují uložení textu do sloupce s čísly.
Funkčnost - některé datové typy mají specifické funkce, které usnadňují práci s daty, jako je například práce s datem a časem.
PostgreSQL nabízí bohatou sadu datových typů, které můžeme rozdělit do několika hlavních kategorií.
Tyto typy slouží k ukládání čísel. Výběr závisí na rozsahu a přesnosti, kterou potřebujete.
SMALLINT: Malá celá čísla, ideální pro hodnoty v rozsahu -32 768 až 32 767. Šetří místo.
INTEGER: Standardní celá čísla v rozsahu -2 147 483 648 až 2 147 483 647. Nejčastěji používaný typ pro celá čísla.
BIGINT: Velká celá čísla, vhodná pro jedinečné identifikátory (ID) nebo velmi velké hodnoty.
NUMERIC(p, s) nebo DECIMAL(p, s): Přesná desetinná čísla, kde p je celkový počet cifer a s je počet cifer za desetinnou čárkou. Skvělé pro finanční data.
REAL a DOUBLE PRECISION: Nepřesná desetinná čísla s plovoucí desetinnou čárkou. Vhodné pro vědecká měření, kde menší nepřesnost nevadí.
Používají se pro ukládání textových dat.
VARCHAR(n): Ukládá text o maximální délce n. Pokud znáte maximální délku, je to dobrá volba.
TEXT: Ukládá text bez omezení délky. Nejflexibilnější, ale VARCHAR může být v některých případech o něco rychlejší. Obvykle se ale rozdíl neprojeví.
CHAR(n): Ukládá text o pevné délce n. Pokud je text kratší, doplní se mezerami. Používá se zřídka.
PostgreSQL má skvělou podporu pro práci s datem a časem, včetně časových zón.
DATE: Ukládá pouze datum (např. '2025-08-30').
TIME: Ukládá pouze čas.
TIMESTAMP: Ukládá datum i čas.
TIMESTAMPTZ: Doporučený typ - Ukládá datum a čas s informací o časové zóně. PostgreSQL automaticky převádí časy do časové zóny nastavené na serveru.
BOOLEAN: Ukládá logickou hodnotu true nebo false. Může také nabývat hodnoty NULL. Je efektivní a jednoduchý na použití.
BYTEA: Pro ukládání binárních dat, jako jsou obrázky nebo soubory.
JSON a JSONB: Ukládání dat ve formátu JSON. JSONB je binární verze, která je rychlejší pro dotazy, protože data indexuje. Pro většinu případů je doporučený typ JSONB.
UUID: Pro ukládání globálně unikátních identifikátorů. Ideální pro distribuované systémy, kde je potřeba generovat unikátní ID.
ARRAY: Umožňuje ukládat pole hodnot stejného typu v jednom sloupci. Používejte s rozvahou, protože to může komplikovat dotazy. V mnoha případech je lepší řešení vytvořit novou tabulku pro relaci 1:N.
TSVECTOR: Speciální typ pro fulltextové vyhledáván
Vždy si předem rozmyslete, jaká data budete ukládat. Nepoužívejte TEXT pro sloupce, kde víte, že maximální délka bude malá.
Pro finanční data používejte NUMERIC. Nikdy nepoužívejte REAL nebo DOUBLE PRECISION, které jsou nepřesné.
Používejte TIMESTAMPTZ pro časové údaje. Vyhnete se tak problémům s časovými zónami při práci s daty z různých míst.
Využijte UUID místo BIGINT pro primární klíče, pokud potřebujete generovat ID mimo databázi (například v aplikaci) nebo v distribuovaném prostředí.
Výběr správných datových typů je základním kamenem dobře navržené databáze. Jakmile porozumíte, jak jednotlivé typy fungují, budete schopni navrhovat databázové schémata, která jsou nejen robustní, ale i výkonná.
© Josef Novotný 2025