Databázy bez hmly

Schéma «Kotomarketu»

11 min
What you'll learn
  • nájsť potrebnú tabuľku spomedzi piatich v «Kotomarkete»: users, products, orders, order_items, events
  • čítať : určiť kardinalitu väzby (1:N, N:M, 1:1) podľa toho, kde leží cudzí kľúč
  • rozvinúť väzbu «mnoho k mnohým» cez sprostredkujúcu tabuľku s dvoma FK — ako order_items s order_id + product_id
  • vysvetliť, prečo sa obsah objednávky nedá uchovávať reťazcom id priamo v orders

Dnes QUERY vyloží na hlavný stôl celý súpis naraz. Päť svietiacich plôch visí vo vzduchu a pomaly sa otáča — mapa zachovaného sveta. Vedľa bliká konzervačný žurnál priložený k snímke a jeden riadok v ňom je podčiarknutý: «Odovzdávam päť tabuliek a stopu šiestej. — K.» Prepočítavaš plochy. Presne päť. Kde je stopa?

QUERY: Nerozptyľuj sa stopami. Najprv sa nauč týchto päť tak, aby si našiel cestu so zatvorenými očami — zvyšok ti archív ukáže sám, keď ťa uzná za pripraveného.

Päť tabuliek «Kotomarketu»

Ďalej budeme pracovať s touto databázou — snímkou internetového obchodu z roku 2024. Drž si ju ako mapu obchodu: kto prišiel, čo leží vo výklade, čo si kúpili a aké akcie urobili pred kúpou.

TabuľkaČo uchováva
userszákazníkov: id, meno, mesto a dátum registrácie
productstovary výkladu: id, názov, kategóriu, cenu a zostatok
ordersobjednávky: id, user_id, dátum, stav a sumu
order_itemsobsah objednávok: aký tovar, koľko kusov a za akú cenu
eventsbehaviorálne udalosti: prezretia, pridania do košíka a nákupy

Väzby sa čítajú takto: jeden user → mnoho orders; jeden order → mnoho order_items; jeden product → mnoho order_items. Ak sa stratíš, otvor si schému vpravo — je ako pôdorys predajne.

Nazrime do tabuľky objednávok: v každom riadku je user_id — odkaz na zákazníka. Tak sa jedna tabuľka spája s druhou a mapa prestáva byť piatimi samostatnými ostrovmi.

Päť holografických tabuliek-plôch sa otáča ako súhvezdie, spojených niťami; bokom je sotva badateľná bodkovaná stopa šiesteho obrysu
Mapa archívu: päť tabuliek a väzby medzi nimi. Konzervačný žurnál sľubuje aj «stopu šiestej» — no zatiaľ ju nevidno.

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 ich väzba na zákazníka cez user_id:
Query result
iduser_idstatustotal_amount
118paid5980.00
210paid19750.00
326cancelled9560.00
426paid15530.00
58paid26710.00
637paid42110.00

Ako čítať ER diagram

Mapu, ktorú rozvinul QUERY, sa v odvetví nazýva (entity–relationship): obdĺžniky sú tabuľky, čiary medzi nimi sú väzby cez cudzie kľúče. Najdôležitejšia na čiare je kardinalita: koľko riadkov z jednej strany zodpovedá koľkým z druhej.

  • 1:N, jeden k mnohým — najčastejšia väzba. Jeden zákazník — mnoho objednávok. Cudzí kľúč vždy leží na strane «mnohých»: user_id sa uchováva v orders, a nie naopak. To je práve pravidlo čítania: našiel si FK — našiel si stranu N.
  • N:M, mnoho k mnohým — v jednej objednávke je mnoho tovarov a jeden tovar sa vyskytuje v mnohých objednávkach. Takú väzbu sa v relačnej databáze nedá vyjadriť priamo: cudzí kľúč nemá kam položiť. Rozvinie sa cez sprostredkujúcu tabuľku — u nás je to order_items. Každý jej riadok nesie dvojicu odkazov order_id + product_id a premieňa jednu väzbu N:M na dve väzby 1:N. Bonus: samotná väzba dostane atribúty — počet kusov a cenu v okamihu nákupu.
  • 1:1, jeden k jednému — vyskytuje sa zriedkavejšie: napríklad ťažké alebo súkromné polia sa vyčlenia do samostatnej tabuľky s tým istým kľúčom.
-- Rozuzlenie N:M v akcii: dvojice «objednávka — tovar» 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»: väzby 1:N od users k orders a rozuzlenie N:M medzi orders a products cez order_items.

Pasca: uchovávať obsah objednávky priamo v orders — reťazcom '7,12,3' alebo poľom identifikátorov. Také dáta sa nedajú chrániť cudzím kľúčom, poctivo spočítať ani spojiť s výkladom bez akrobacie. Vidíš väzbu «mnoho k mnohým» — vytvor sprostredkujúcu tabuľku s dvoma cudzími kľúčmi, ako order_items.

Interview question

Otázka z pohovoru: ako v relačnej databáze realizovať väzbu «mnoho k mnohým»?

Silná odpoveď: cez sprostredkujúcu tabuľku s dvoma cudzími kľúčmi na spájané tabuľky — ako order_items s order_id a product_id: premieňa N:M na dve väzby 1:N. Zároveň v nej uchovávajú atribúty samotnej väzby — počet, cenu v okamihu nákupu. Primárny kľúč takej tabuľky je buď zložený z dvoch FK, alebo náhradné id.

Check yourself
Kde v schéme vidno, ktorý tovar sa dostal do ktorej objednávky?