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