Lekce 2.1

Relační databáze a datový model

K čemu slouží relační databáze, jak se čte datový model a jeho vazby, co je primární a cizí klíč a k čemu je index.

Primární a cizí klíč

Data máme rozdělená do tabulek. Teď potřebujeme dvě věci: poznat každý řádek a propojit tabulky mezi sebou. Na obojí slouží klíče.

Primární klíč

Primární klíč (primary key, zkráceně PK) je sloupec, jehož hodnota jednoznačně určuje řádek. Dva řádky v tabulce ho nesmí mít stejný a nesmí chybět.

Proč by nestačilo jméno zákazníka? Protože v každém větším e-shopu nakupuje víc Janů Nováků. A co e-mail? Ten je sice jedinečný, ale může se změnit, a s ním by se musel změnit i každý odkaz na zákazníka. Proto se jako primární klíč obvykle používá číslo id, které databáze přidělí sama a které nic dalšího neznamená.

Primární klíč si můžeme představit jako rodné číslo. Úřad podle něj člověka najde, i když se ve třídě sejdou dvě Jany Dvořákové. Tady nám ale analogie přestává fungovat: rodné číslo nese datum narození, kdežto dobrý klíč neříká o řádku nic. Kdyby nesl význam, musel by se měnit spolu s ním.

Cizí klíč

Objednávka patří zákazníkovi. Místo opisování jména a e-mailu si do objednávky uložíme jen id zákazníka:

orders
  id | customer_id | created_at
-----+-------------+------------
 101 |           1 | 2026-10-02
 102 |           2 | 2026-10-05
 103 |           1 | 2026-10-09

Sloupec customer_id je cizí klíč (foreign key, FK). Ukazuje na primární klíč jiné tabulky. Z objednávky 103 zjistíme, že ji udělal zákazník 1, a jeho jméno i e-mail najdeme v tabulce customers. Alena je teď zapsaná jen jednou. Když změní e-mail, přepíšeme jeden řádek.

Tabulky budeme v textu i ve cvičeních zapisovat zkráceně, jen s názvy sloupců a klíči:

customers: id (PK), name, email, city
orders: id (PK), customer_id (FK → customers.id), created_at

Klíče nejsou jen domluva mezi lidmi, databáze o nich ví. Při zakládání tabulky se zapíšou přímo do její definice:

sql
CREATE TABLE orders (
  id INTEGER PRIMARY KEY,
  customer_id INTEGER NOT NULL REFERENCES customers (id),
  created_at DATE NOT NULL
);

Jazyk SQL si projdeme v další lekci. Teď nám stačí vidět, že REFERENCES říká, kam cizí klíč ukazuje.

Referenční integrita

Co když se do tabulky dostane tahle objednávka?

 104 |           7 | 2026-10-11

Zákazník s id 7 neexistuje. Objednávka ukazuje do prázdna a nikdo nezjistí, komu ji poslat. Pravidlu, že každý cizí klíč musí ukazovat na existující řádek, se říká referenční integrita. Databáze ji hlídá ve dvou chvílích.

Při vložení je to jednoduché: objednávku pro neexistujícího zákazníka databáze odmítne.

Při smazání se musíme rozhodnout, co se stane s objednávkami zákazníka, kterého mažeme. Možnosti jsou tři a volí se při návrhu tabulky:

  • Odmítnout smazání. Zákazníka s objednávkami smazat nejde. Je to výchozí chování.
  • Smazat i objednávky (ON DELETE CASCADE). Se zákazníkem zmizí všechno, co na něj odkazuje.
  • Vymazat odkaz (ON DELETE SET NULL). Objednávky zůstanou, jen v customer_id bude prázdná hodnota.

Která možnost je správná, záleží na datech. V praxi se u objednávek kaskádovému mazání vyhýbá: jsou to podklady pro účetnictví a firma je musí několik let archivovat, i když zákazník zruší účet. Jak se databáze při mazání zachová, si vyzkoušíme v další lekci.