Slovník pojmů
Databázový sloupec a datový typ
Cena, měna, čas, e-mail a externí identifikátor nemají stejnou povahu. Datový typ a pravidla ji mají zachovat už při uložení.
Stručná definice
Typ určuje přípustné hodnoty i jejich význam.
Sloupec je jeden pojmenovaný údaj v řádku, například total_amount nebo created_at. Datový typ omezuje množinu hodnot a dává jim sémantiku: integer je celé číslo, numeric přesná desetinná hodnota a timestamptz okamžik v čase. Přesné názvy a rozsahy se podle databáze mohou lišit.
Typ doplňují pravidla, zda hodnotu lze vynechat, jaká má být výchozí hodnota a jaké další omezení platí. NULL znamená chybějící, neznámou nebo neaplikovatelnou hodnotu podle modelu. Není to nula ani prázdný řetězec a SQL s ním pracuje odlišně.
Jaký problém řeší
Správné uložení hodnot dříve, než je začne používat aplikace
Sloupce a typy dávají datům základní integritu, možnost řazení, porovnání a výpočtů.
- přesná cena objednávky a měna
- stav importu a externí identifikátor
- datum vytvoření a okamžik změny
- e-mail, telefon a další textové údaje
- UUID pro identitu a JSONB pro proměnlivý integrační payload
SQL ukázka
PostgreSQL sloupce pro import objednávky
Ukázka ukazuje přesné typy pro hodnoty, které se budou filtrovat, validovat nebo dále zpracovávat.
CREATE TABLE order_imports (
id uuid PRIMARY KEY,
external_order_id text NOT NULL,
total_amount numeric(12, 2) NOT NULL,
currency char(3) NOT NULL,
status text NOT NULL,
customer_email text NOT NULL,
created_at timestamptz NOT NULL DEFAULT now(),
metadata jsonb NOT NULL DEFAULT '{}'::jsonb
);
Jak funguje
Od významu údaje k bezpečné změně
Textová alternativa: nejprve se určí význam hodnoty, potom typ a pravidla, nakonec se ověří migrace i přenos do aplikace.
- Význam Určí se, zda jde o částku, kód, datum, identifikátor nebo proměnlivý doplněk.
- Typ a rozsah Zvolí se vhodný typ a případně přesnost či délka podle významu dat.
- NULL a DEFAULT Rozhodne se, zda hodnota může chybět a co se stane při jejím vynechání v INSERTu.
- Další pravidlo Pokud typ nestačí, doplní se constraint, například nezáporná cena nebo jedinečný externí kód.
- Migrace a aplikace Změna typu se ověří nad existujícími daty i mapováním do PHP a API.
Důležité pojmy
Každý typ má odlišný kompromis.
Ukázky názvů vycházejí z PostgreSQL; jiné databáze mohou používat jiné typy nebo detaily chování.
Čísla
integer je pro celá čísla. numeric nebo decimal s přesností a měřítkem je vhodný pro peněžní částku; běžný floating-point typ neumí přesně reprezentovat mnoho desítkových hodnot.
Text a kódy
text drží obsahový text. Text může být i správný typ pro telefonní číslo nebo kód, protože může obsahovat úvodní nuly, plus či mezery.
Datum a čas
date je kalendářní den. Datum bez časové zóny není totéž co okamžik v čase; PostgreSQL timestamptz pracuje s okamžikem a převodem zón.
UUID, JSON a enum
UUID je identifikátor, nikoli autorizace. JSONB je v PostgreSQL vhodný pro proměnlivá data. Enum může uzavřít stabilní hodnoty, ale změny procesu pak vyžadují migraci.
NULL, NOT NULL a DEFAULT
NOT NULL je constraint. DEFAULT se použije při vynechání hodnoty; není to totéž jako povinná hodnota ani náhrada aplikačního rozhodnutí.
Vztah k podobným pojmům
Sloupec je základ tabulky, ne celý datový model.
Datový typ, constraint a PHP typ mají odlišnou odpovědnost.
- Databázová tabulka
- Seskupuje sloupce do struktury jednoho typu záznamu.
- Databázový constraint
- Doplňuje pravidlo nad typem, například NOT NULL, UNIQUE nebo CHECK.
- Primární klíč
- Používá jeden nebo více sloupců jako hlavní identitu řádku.
- Databázová migrace
- Verzovaně mění typ, výchozí hodnotu nebo omezení nad existujícími daty.
Výhody a omezení
Obecný textový sloupec není univerzální řešení.
Přínosy
- odmítnutí nesmyslných hodnot už při zápisu
- srozumitelnější výpočty, porovnání a řazení
- základ pro constrainty, indexy a migrace
- jasnější kontrakt mezi databází, PHP a API
Časté chyby
- ukládání finančních hodnot jako floating point
- zaměnění NULL s nulou nebo prázdným textem
- datum bez zóny použité jako okamžik v čase
- telefon uložený jako běžné číslo
- všechna data jako text či JSON bez důvodu
- představa, že UUID sám chrání přístup k datům
Praktický příklad
Typy pro import objednávky
Cena je numeric(12, 2), měna char(3), stav text nebo promyšlený enum, čas vytvoření timestamptz a e-mail text. Externí marketplace ID je text: jeho struktura může obsahovat nuly nebo jiné znaky a jedinečnost se vyjadřuje samostatným constraintem.
Proměnlivý payload integrace může patřit do JSONB. Jádro objednávky, například cena, měna, identita a vazby, tím nemá být skryto; potřebuje konkrétní typy a pravidla.
Na co myslet
Typ vychází z významu dat, ne jen z aktuálního formuláře.
Změna typu u velké tabulky může být provozně náročná, proto je vhodné model a migraci ověřit včas.
- pro částky použít přesný decimal nebo menší jednotky dle domény
- zvažovat rozdíl mezi kalendářním datem a okamžikem v čase
- nepřipisovat varchar délce význam úplné business validace
- NULL používat jen pro jasně popsaný stav
- u enumu zohlednit, jak často se business proces mění
Časté otázky
Typy hodnot v praxi
Je NULL prázdný řetězec?
Ne. Jde o jiný stav, který vyjadřuje chybějící nebo neaplikovatelnou hodnotu. Nula a prázdný text jsou konkrétní uložené hodnoty.
Je UUID bezpečnostní ochrana?
Ne. Je to typ identifikátoru. Přístup ke konkrétnímu záznamu musí vždy ověřit serverová autorizace.
Proč neukládat cenu jako float?
Binární floating point neumí přesně reprezentovat mnoho desítkových hodnot. Pro částky je běžnější přesný numeric nebo model v menších jednotkách.
Stačí uložit datum jako text?
Jen výjimečně. Datový typ databázi umožní hodnotu validovat, porovnávat a pracovat s ní správněji.
Jak tento princip používám v praxi
Typy a pravidla volím podle významu dat.
V databázovém návrhu řeším přesné hodnoty, historická data, integrační payloady i změny schématu tak, aby byla data dlouhodobě čitelná.