Schéma «Kotomarketu»
What you'll learn
- najít potřebnou tabulku mezi pěti v «Kotomarketu»:
users,products,orders,order_items,events - číst : určit kardinalitu vazby (1:N, N:M, 1:1) podle toho, kde leží cizí klíč
- rozvinout vazbu «mnoho k mnoha» přes mezitabulku se dvěma FK — jako
order_itemssorder_id+product_id - vysvětlit, proč obsah objednávky nelze uchovávat řetězcem id přímo v
orders
Dnes QUERY vyvede na hlavní stůl celý soupis najednou. Pět svítících ploch visí ve vzduchu a pomalu se otáčí — mapa přeživšího světa. Vedle bliká konzervační žurnál přiložený ke snímku a jeden řádek v něm je podtržený: «Předávám pět tabulek a stopu šesté. — K.» Přepočítáš plochy. Přesně pět. Kde je ta stopa?
QUERY: Nenech se rozptylovat stopami. Nejdřív se nauč těchhle pět tak, abys našel cestu se zavřenýma očima — zbytek ti archiv ukáže sám, až tě uzná za připraveného.
Pět tabulek «Kotomarketu»
Dál budeme pracovat s touhle databází — snímkem internetového obchodu za rok 2024. Drž ji jako mapu obchodu: kdo přišel, co leží ve výloze, co se koupilo a jaké akce předcházely nákupu.
| Tabulka | Co uchovává |
|---|---|
users | zákazníky: id, jméno, město a datum registrace |
products | zboží výlohy: id, název, kategorii, cenu a zůstatek |
orders | objednávky: id, user_id, datum, stav a částku |
order_items | obsah objednávek: jaké zboží, kolik kusů a za jakou cenu |
events | behaviorální události: prohlížení, přidání do košíku a nákupy |
Vazby se čtou takto: jeden user → mnoho orders; jeden order → mnoho order_items; jeden product → mnoho order_items. Když se ztratíš, otevři schéma vpravo — je jako plán prodejny.
Nahlédneme do tabulky objednávek: v každém řádku je user_id — odkaz na zákazníka. Tak se jedna tabulka propojuje s druhou a mapa přestává být pěti samostatnými ostrovy.

Kotomarket’s five tables
From here on we’ll be working with this database — a of an online shop from 2024. Hold it like a map of the store: who walked in, what’s on the shelves, what they bought, and what they did before buying.
| Table | What it holds |
|---|---|
users | buyers: id, name, city, and signup date |
products | storefront items: id, name, category, price, and stock |
orders | orders: id, user_id, date, status, and total |
order_items | order contents: which product, how many, and at what price |
events | behavioral events: views, add-to-carts, and purchases |
The links read like this: one user → many orders; one order → many order_items; one product → many order_items. If you get lost, open the schema on the right — it’s like the floor plan of the shop.
Let’s peek into the orders table: every row has a user_id — a reference to a buyer. That’s how one table links to another, and the map stops being five separate islands.
user_id:| id | user_id | status | total_amount |
|---|---|---|---|
| 1 | 18 | paid | 5980.00 |
| 2 | 10 | paid | 19750.00 |
| 3 | 26 | cancelled | 9560.00 |
| 4 | 26 | paid | 15530.00 |
| 5 | 8 | paid | 26710.00 |
| 6 | 37 | paid | 42110.00 |
Jak číst ER diagram
Mapu, kterou QUERY rozvinul, se v branži nazývá (entity–relationship): obdélníky jsou tabulky, čáry mezi nimi jsou vazby přes cizí klíče. Nejdůležitější na čáře je kardinalita: kolik řádků na jedné straně odpovídá kolika na druhé.
- 1:N, jeden k mnoha — nejčastější vazba. Jeden zákazník — mnoho objednávek. Cizí klíč leží vždy na straně «mnoha»:
user_idse uchovává vorders, a ne naopak. To je právě pravidlo čtení: našel jsi FK — našel jsi stranu N. - N:M, mnoho k mnoha — v jedné objednávce je mnoho zboží a jedno zboží se vyskytuje v mnoha objednávkách. Takovou vazbu nelze v relační databázi vyjádřit přímo: cizí klíč není kam dát. Rozvine se přes mezitabulku — u nás je to
order_items. Každý její řádek nese dvojici odkazůorder_id+product_ida promění jednu vazbu N:M ve dvě vazby 1:N. Bonus: u samotné vazby se objeví atributy — počet kusů a cena v okamžiku nákupu. - 1:1, jeden k jednomu — vyskytuje se vzácněji: například těžká nebo soukromá pole se vyčlení do zvláštní tabulky se stejným klíčem.
-- Rozvázání N:M v akci: dvojice «objednávka — zboží» z order_items
SELECT order_id, product_id, quantity
FROM order_items
LIMIT 6;
Časté chyby: uchovávat obsah objednávky přímo v orders — řetězcem '7,12,3' nebo polem identifikátorů. Taková data nelze ochránit cizím klíčem, poctivě spočítat ani spojit s výlohou bez akrobacie. Vidíš vazbu «mnoho k mnoha» — vytvoř mezitabulku se dvěma cizími klíči, jako order_items.
Interview question
Otázka z pohovoru: jak v relační databázi realizovat vazbu «mnoho k mnoha»?
Silná odpověď: přes mezitabulku se dvěma cizími klíči na propojované tabulky — jako order_items s order_id a product_id: promění N:M ve dvě vazby 1:N. Zároveň se v ní uchovávají atributy samotné vazby — počet, cena v okamžiku nákupu. Primární klíč takové tabulky je buď složený ze dvou FK, nebo surogátní id.