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.

  1. Určení záznamu Návrh rozliší objednávku, položku a produkt jako fakta s vlastním životním cyklem.
  2. Volba sloupců Každý sloupec dostane význam, typ, povinnost hodnoty a případně výchozí hodnotu.
  3. Identita a pravidla Primární klíč identifikuje řádek; constrainty brání neplatným hodnotám.
  4. Vložení řádků Aplikace přidá objednávku a její položky jako samostatné záznamy, často v jedné transakci.
  5. 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é.

Zavolejte mi

Zavolám vám následující pracovní den mezi 9:00 a 17:00.

Můžete mi také zavolat rovnou.

+420 605 181 728

Nechte mi telefonní číslo a pošlete žádost o zpětné zavolání.

Odesláním souhlasíte se zpracováním údajů pro vyřízení žádosti.