Databáze bez mlhy

Schéma «Kotomarketu»

11 min
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_items s order_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.

TabulkaCo uchovává
userszákazníky: id, jméno, město a datum registrace
productszboží výlohy: id, název, kategorii, cenu a zůstatek
ordersobjednávky: id, user_id, datum, stav a částku
order_itemsobsah objednávek: jaké zboží, kolik kusů a za jakou cenu
eventsbehaviorá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.

Pět holografických tabulek-ploch se otáčí jako souhvězdí, propojené nitkami; stranou je sotva znát čárkovaná stopa šestého obrysu
Mapa archivu: pět tabulek a vazby mezi nimi. Konzervační žurnál slibuje navíc i «stopu šesté» — ale zatím ji není vidět.

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.

TableWhat it holds
usersbuyers: id, name, city, and signup date
productsstorefront items: id, name, category, price, and stock
ordersorders: id, user_id, date, status, and total
order_itemsorder contents: which product, how many, and at what price
eventsbehavioral 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.

Objednávky a jejich vazba na zákazníka přes user_id:
Query result
iduser_idstatustotal_amount
118paid5980.00
210paid19750.00
326cancelled9560.00
426paid15530.00
58paid26710.00
637paid42110.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_id se uchovává v orders, 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_id a 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;
usersidnameproductsidpriceordersiduser_ideventsuser_idproduct_idorder_itemsorder_idproduct_iduser_id → idproduct_id → idPKFK (reference)
ER diagram «Kotomarketu»: vazby 1:N od users k orders a rozvázání N:M mezi orders a products přes order_items.

Č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.

Check yourself
Kde ve schématu je vidět, jaké zboží se dostalo do jaké objednávky?