Baze podataka bez magle

Shema Kotomarketa

11 min
What you'll learn
  • pronaći potrebnu tablicu među pet u Kotomarketu: users, products, orders, order_items, events
  • čitati ER dijagram: odrediti kardinalnost veze (1:N, N:M, 1:1) prema tome gdje leži vanjski ključ
  • razviti vezu „više prema više” kroz međutablicu s dva FK — kao order_items s order_id + product_id
  • objasniti zašto se sastav narudžbe ne može čuvati nizom id-jeva izravno u orders

Danas QUERY iznosi na glavni stol cijeli popis odjednom. Pet svjetlećih ploha lebdi u zraku i polako se okreće — karta preživjelog svijeta. Pokraj treperi dnevnik konzervacije priložen snimci, a jedan je redak u njemu podcrtan: „Predajem pet tablica i trag šeste. — K.” Prebrojiš plohe. Točno pet. Gdje je trag?

QUERY: Ne daj se omesti tragovima. Najprije nauči ovih pet tako dobro da nađeš put zatvorenih očiju — ostalo će arhiv pokazati sam, kad te procijeni spremnim.

Pet tablica Kotomarketa

Nadalje ćemo raditi s ovom bazom — snimkom internetske trgovine iz 2024. Drži je kao kartu trgovine: tko je došao, što leži na izlogu, što su kupili i koje su radnje obavljali prije kupnje.

TablicaŠto čuva
userskupce: id, ime, grad i datum registracije
productsproizvode izloga: id, naziv, kategoriju, cijenu i zalihu
ordersnarudžbe: id, user_id, datum, status i iznos
order_itemssastav narudžbi: koji proizvod, koliko komada i po kojoj cijeni
eventsbihevioralne događaje: preglede, dodavanja u košaricu i kupnje

Veze se čitaju ovako: jedan user → mnogo orders; jedan order → mnogo order_items; jedan product → mnogo order_items. Ako se izgubiš, otvori shemu zdesna — ona je kao tlocrt prodajnog prostora.

Zavirimo u tablicu narudžbi: u svakom retku postoji user_id — referenca na kupca. Tako se jedna tablica povezuje s drugom, i karta prestaje biti pet odvojenih otoka.

Pet holografskih tablica-ploha okreće se kao zviježđe, povezane nitima; sa strane se jedva nazire točkasti trag šestog obrisa
Karta arhiva: pet tablica i veze među njima. Dnevnik konzervacije obećava i „trag šeste” — ali zasad ga nema na vidiku.

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.

Narudžbe i njihova veza s kupcem preko user_id:
Query result
iduser_idstatustotal_amount
118paid5980.00
210paid19750.00
326cancelled9560.00
426paid15530.00
58paid26710.00
637paid42110.00

Kako čitati ER dijagram

Kartu koju je QUERY razvio u industriji zovu ER dijagram (entity–relationship): pravokutnici su tablice, linije među njima su veze po vanjskim ključevima. Najvažnija je na liniji kardinalnost: koliko redaka s jedne strane odgovara kolikima s druge.

  • 1:N, jedan-prema-više — najčešća veza. Jedan kupac — mnogo narudžbi. Vanjski ključ uvijek leži na strani „više”: user_id se čuva u orders, a ne obratno. To je upravo pravilo čitanja: našao FK — našao stranu N.
  • N:M, više-prema-više — u jednoj narudžbi mnogo proizvoda, a jedan se proizvod javlja u mnogo narudžbi. Takvu vezu nije moguće izraziti izravno u relacijskoj bazi: vanjski ključ nema kamo staviti. Razvija se kroz međutablicu — kod nas je to order_items. Svaki njezin redak nosi par referenci order_id + product_id i pretvara jednu vezu N:M u dvije veze 1:N. Bonus: sama veza dobiva atribute — broj komada i cijenu u trenutku kupnje.
  • 1:1, jedan-prema-jedan — javlja se rjeđe: primjerice, teška ili privatna polja izmještaju se u zasebnu tablicu s istim ključem.
-- Razrješenje N:M na djelu: parovi „narudžba — proizvod” iz 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 dijagram Kotomarketa: veze 1:N od users prema orders i razrješenje N:M između orders i products kroz order_items.

Zamka: čuvati sastav narudžbe izravno u orders — nizom '7,12,3' ili poljem identifikatora. Takve podatke ne možeš zaštititi vanjskim ključem, pošteno prebrojiti ni spojiti s izlogom bez akrobacija. Vidiš li vezu „više prema više” — stvori međutablicu s dva vanjska ključa, kao order_items.

Interview question

Pitanje s razgovora za posao: kako se u relacijskoj bazi ostvaruje veza „više prema više”?

Snažan odgovor: kroz međutablicu s dva vanjska ključa na tablice koje se povezuju — kao order_items s order_id i product_id: ona pretvara N:M u dvije veze 1:N. Usput se u njoj čuvaju atributi same veze — količina, cijena u trenutku kupnje. Primarni ključ takve tablice je ili složeni od dvaju FK ili surogatni id.

Check yourself
Gdje se u shemi vidi koji je proizvod dospio u koju narudžbu?