Databáze bez mlhy

Tabulky, řádky a klíče

11 min
What you'll learn
  • rozlišovat tabulky, řádky a sloupce a vysvětlit, proč každý řádek potřebuje primární klíč (obvykle id)
  • hledat vazby mezi tabulkami přes cizí klíč: orders.user_id → users.id
  • rozlišovat surogátní klíč (IDENTITY, ) od přirozeného (email, ISBN) a zdůvodnit, proč se primární klíč nesmí měnit
  • zajistit jedinečnost pole jako email omezením UNIQUE, aniž bys ho dělal primárním klíčem

Soupis je otevřený. QUERY rozvine nad pracovním stolem hologram: tisíce záznamů visí ve vzduchu v rovné mřížce a mezi některými se táhnou tenké jantarové nitky. Sáhneš po jedné — zazní jako struna. Tohle není hromada souborů. Tohle je tkanina.

Tabulky, řádky, sloupce

Relační databáze připomíná pečlivý katalog: data jsou rozložena do tabulek a uvnitř každé tabulky jsou sloupce (jaké vlastnosti uchováváme) a řádky (konkrétní záznamy).

Vezmi tabulku zákazníků users: každý řádek je jeden zákazník staré Země a sloupce popisují jeho id, full_name, email, country, city, signup_date.

Aby se nepletli lidé se stejnými jmény, má každý řádek primární klíč () — jedinečný identifikátor, obvykle sloupec id. Skrze něj na tento řádek mohou jiné tabulky odkazovat pomocí cizího klíče (). Například objednávka ordersuser_id — tak si objednávka pamatuje svého zákazníka. Ty jantarové nitky na hologramu jsou právě vazby přes klíče.

QUERY: Dokud drží klíč, drží nitka. Půldruhého století uplynulo, a každá objednávka si pořád pamatuje svého člověka.

Spusť dotaz a podívej se, jak vypadají zákazníci «Kotomarketu» — záznamy, které od dob staré Sítě nikdo neotevřel:

Holografická tabulka z řádků-kapslí a sloupců; od záznamů objednávek k záznamům lidí se táhnou jantarové nitky klíčů
Řádky jsou záznamy, sloupce jejich vlastnosti, a nitka od objednávky k zákazníkovi je vazba přes klíč.

Tables, rows, columns

A relational database is like a tidy catalog: the data is sorted into tables, and inside each table there are columns (what properties we store) and rows (the individual records).

Take the buyers’ table users: each row is one buyer from old Earth, and the columns describe their id, full_name, email, country, city, signup_date.

So that people with the same name don’t get confused, every row has a — a unique identifier, usually the id column. Through it, other tables can reference this row using a . For example, an order in orders has a user_id — that’s how an order remembers its buyer. Those amber threads on the hologram are exactly these key-based links.

QUERY: As long as the key holds, the thread holds. A century and a half on, every order still remembers its person.

Run the query and see what Kotomarket’s buyers look like — records no one has opened since the days of the old Net:

První zákazníci «Kotomarketu» v tabulce:
Query result
idfull_namecitysignup_date
1Артём ВолковСанкт-Петербург2024-10-20
2Екатерина АлексеевЕкатеринбург2025-01-25
3Николай НикитинАлматы2024-09-21
4Екатерина ИвановНовосибирск2024-05-04
5Елена ПетровКазань2025-01-05
6Ирина КузнецовНовосибирск2024-09-12

Primární klíč pomáhá bezchybně najít jeden řádek (obvykle id). Cizí klíč propojuje tabulky: například orders.user_id → users.id ukazuje, čí je to objednávka. Dál před tebou QUERY rozvine celou mapu snímku — pět tabulek celých.

usersidfull_namecityordersiduser_idstatususer_id → id
Cizí klíč orders.user_id odkazuje na primární klíč users.id — tak si objednávka pamatuje svého zákazníka.

Přirozený, nebo surogátní klíč

Odkud se primární klíč bere? Cesty jsou dvě. Přirozený klíč je reálný atribut, který je sám o sobě jedinečný: email zákazníka, ISBN knihy, kód měny. Surogátní klíč je umělý identifikátor bez významu ve vnějším světě: automatické číslování nebo . V «Kotomarketu» se všude používají surogátní id — a je to typové řešení:

-- Surogátní klíč: databáze sama vydává další číslo (PostgreSQL)
CREATE TABLE users (
  id        BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
  email     TEXT NOT NULL UNIQUE,  -- natural candidate lives alongside it as UNIQUE
  full_name TEXT NOT NULL
);

Proč zrovna takhle? Hlavní vlastnost primárního klíče: nesmí se měnit. Na PK odkazují cizí klíče jiných tabulek a změna hodnoty by za sebou táhla aktualizaci všech nitek najednou — v orders, v events, všude. A «věčné» přirozené atributy skoro neexistují: lidé mění email i příjmení, telefony se přidělují jinam, dokonce i ISBN se znovu vydávají. Surogátní id se nemění nikdy — právě proto, že nic neznamená.

Požadavky na jakýkoli primární klíč: jedinečný, ne NULL, stabilní. Přirozené klíče nech malým neměnným číselníkům — třeba kódu měny 'RUB' z ISO 4217. A jedinečnost přirozeného kandidáta jako email zajisti zvlášť omezením UNIQUE, jako v příkladu výše: vazby zůstanou zachované, data zůstanou poctivá a měnit zákazníkovi email se nezakazuje.

Předbíháme: samotná syntaxe vytváření tabulek a omezení (CREATE TABLE, PRIMARY KEY, UNIQUE) je téma Kapitoly 9. Tady sleduj strukturu klíče, ne příkaz: že se surogátní id stalo primárním klíčem a email žije vedle jako UNIQUE.

Interview question

Otázka z pohovoru: čím se liší surogátní klíč od přirozeného a který vybereš pro tabulku uživatelů?

Silná odpověď: přirozený — reálný jedinečný atribut (email, ISBN), surogátní — umělý identifikátor (sloupec IDENTITY nebo ). Pro uživatele — surogátní: primární klíč se nesmí měnit, protože na něj odkazují cizí klíče, a email lidé mění. Jedinečnost emailu se přitom zajistí zvlášť omezením UNIQUE. Přirozený klíč je oprávněný ve stabilních číselnících jako kódy měn ISO 4217.

Check yourself
K čemu je v databázi cizí klíč (foreign key)?