Slovník pojmů
Databázová tabulka
Tabulka je jeden objekt databáze, ne celá databáze ani PHP objekt. Dobře zvolená tabulka popisuje jeden druh záznamu a jeho vztahy k ostatním datům.
Stručná definice
Řádky uchovávají záznamy, sloupce jejich význam.
Tabulka má pevně dané sloupce, například ID objednávky, stav, měnu a datum vytvoření. Jeden řádek představuje konkrétní objednávku. Datový typ, výchozí hodnota a constraint určují, co může sloupec obsahovat; primární klíč dává záznamu stabilní identitu.
Tabulka sama neurčuje pořadí řádků. SQL bez ORDER BY nemá garantovaný výstup v pořadí vložení. Tabulka také není spreadsheet: návrh počítá s klíči, vztahy, souběhem a s tím, že data budou číst různé části aplikace.
Jaký problém řeší
Uložení jednoho typu záznamu v čitelné struktuře
Tabulky oddělují objednávku jako celek od jejích opakujících se položek, zákazníka nebo produktu.
- orders pro hlavičky objednávek
- order_items pro libovolný počet položek objednávky
- customers pro údaje zákazníků
- products pro katalog a aktuální vlastnosti produktu
- inventory_movements pro samostatné skladové pohyby
SQL ukázka
PostgreSQL tabulky objednávky a položek
Ukázka používá PostgreSQL typy. order_items je samostatná tabulka, protože objednávka má nula až mnoho položek.
CREATE TABLE orders (
id uuid PRIMARY KEY,
customer_id uuid NOT NULL,
status text NOT NULL,
currency char(3) NOT NULL,
total_amount numeric(12, 2) NOT NULL,
created_at timestamptz NOT NULL DEFAULT now()
);
CREATE TABLE order_items (
id uuid PRIMARY KEY,
order_id uuid NOT NULL REFERENCES orders(id),
product_name text NOT NULL,
quantity integer NOT NULL,
unit_price numeric(12, 2) NOT NULL
);
Jak funguje
Od návrhu objednávky k propojeným záznamům
Textová alternativa: orders drží hlavičku objednávky; order_items drží její položky a odkazuje na orders.
- Určení záznamu Návrh rozliší objednávku, položku a produkt jako fakta s vlastním životním cyklem.
- Volba sloupců Každý sloupec dostane význam, typ, povinnost hodnoty a případně výchozí hodnotu.
- Identita a pravidla Primární klíč identifikuje řádek; constrainty brání neplatným hodnotám.
- Vložení řádků Aplikace přidá objednávku a její položky jako samostatné záznamy, často v jedné transakci.
- Vztahy a dotaz Cizí klíče a JOIN umožní data spojit bez ukládání seznamu produktů do jednoho textu.
Důležité pojmy
Struktura a data mají rozdílnou roli.
Názvy a pravidla tabulky mají popisovat data i pro budoucí importy a reporty.
Řádek a sloupec
Řádek neboli záznam je jedna objednávka. Sloupec neboli atribut drží jeden údaj, například currency nebo created_at.
Datový typ a NULL
Typ omezuje povolené hodnoty. NULL je samostatný stav chybějící nebo neaplikovatelné hodnoty, nikoli nula či prázdný text.
Klíče a constrainty
Primární klíč jednoznačně určí řádek. Cizí klíč propojí tabulky; UNIQUE, NOT NULL a CHECK chrání další pravidla.
Výchozí hodnota
DEFAULT doplní hodnotu, když ji INSERT vynechá. Neznamená automaticky, že volba hodnoty je vždy správná pro business proces.
View
View je uložený pohled na dotaz. Není stejný jako běžná tabulka, do níž se bez dalších podmínek zapisuje.
Vztah k podobným pojmům
Tabulka je část širšího schématu.
Aplikační objekt, databázový view a spreadsheet mohou mít podobný tvar, ale nesou jiné záruky.
- Databáze
- Obsahuje tabulky i další objekty; tabulka není celá databáze.
- Databázové schéma
- Popisuje širší soubor tabulek, typů, vztahů, indexů a pravidel.
- PHP objekt
- Aplikační reprezentace dat; nemusí mapovat řádek nebo tabulku jedna ku jedné.
- Normalizace
- Pomáhá rozhodnout, kdy má opakující se fakt vlastní tabulku místo seznamu v jednom sloupci.
Výhody a omezení
Více tabulek není samo o sobě kvalitní návrh.
Přínosy
- čitelná struktura jednoho druhu záznamu
- typy a pravidla blízko uloženým datům
- dotazování a propojování více souvisejících záznamů
- základ pro integritu, transakce a indexy
Časté chyby
- ukládání více hodnot jako CSV v jednom textovém sloupci
- ukládání stabilních vztahů do JSON jen kvůli rychlému začátku
- nejasné názvy, které nevyjadřují význam údaje
- tabulka bez vhodné identity a propojení
- spoléhání na implicitní pořadí řádků bez ORDER BY
Praktický příklad
Objednávka a její položky mají rozdílnou granularitu.
Tabulka orders drží jednu objednávku: ID, zákazníka, stav, měnu, cenu a čas. Položky patří do order_items, protože jich může být více, jednotlivě se mění, spojují s produktem a agregují. Seznam produktů v textu by tyto operace komplikoval.
Počet tabulek ale nemá růst mechanicky. Jejich hranice musí odpovídat tomu, co je samostatný fakt, jak se data mění a na co se aplikace ptá.
Na co myslet
Struktura má podporovat budoucí práci s daty.
Návrh tabulky se ověřuje na čtení, změny, integrace i historická data.
- pro každý sloupec určit význam, typ a pravidla NULL či DEFAULT
- oddělit opakující se položky do tabulky, když mají vlastní identitu nebo dotazy
- přidat stabilní primární klíč a cizí klíče pro vlastněné interní vztahy
- pro řazení vždy použít ORDER BY
- nepoužívat počet tabulek jako metriku kvality modelu
Časté otázky
Tabulky v praxi
Je řádek totéž co objekt v PHP?
Ne. Objekt je aplikační reprezentace, zatímco řádek je databázový záznam. Může mezi nimi být mapování, ale není nutně jedna ku jedné.
Může tabulka obsahovat stejné řádky?
Bez primárního nebo unikátního constraintu to SQL připouští. Většina businessových tabulek ale potřebuje stabilní identitu.
Proč nedat položky objednávky do JSON?
Proměnlivý doplněk může být vhodný, ale položky se obvykle filtrují, agregují, propojují a chrání vztahy; samostatná tabulka to vyjadřuje lépe.
Určuje tabulka pořadí objednávek?
Ne. Pořadí se pro výstup musí výslovně určit pomocí ORDER BY.
Jak tento princip používám v praxi
Tabulky navrhuji podle skutečných datových faktů.
V e-commerce řešeních pracuji s objednávkami, produkty, sklady a integracemi tak, aby byly změny i vazby čitelné a dohledatelné.