„Kotomarketi“ skeem
What you'll learn
- leidma vajaliku tabeli „Kotomarketi“ viie hulgast:
users,products,orders,order_items,events - lugema ER-diagrammi: määrama seose kardinaalsuse (1:N, N:M, 1:1) selle järgi, kus asub välisvõti
- avama „mitu mitmega“ seose vahetabeli kaudu kahe FK-ga — nagu
order_itemsorder_id+product_id-ga - selgitama, miks tellimuse koosseisu ei saa hoida id-de stringina otse
orders-is
Täna toob QUERY põhilauale kogu inventuuri korraga. Viis helendavat tasapinda ripuvad õhus ja pöörlevad aeglaselt — ellujäänud maailma kaart. Kõrval virvendab tõmmisele lisatud säilituspäevik ja üks rida selles on alla joonitud: „Annan üle viis tabelit ja kuuenda jälje. — K.“ Loendad tasapinnad üle. Täpselt viis. Kus on jälg?
QUERY: Ära lase end jälgedest segada. Esmalt õpi need viis selgeks nii, et leiad tee silmad kinni — ülejäänu näitab arhiiv ise, kui peab sind valmis olevaks.
„Kotomarketi“ viis tabelit
Edaspidi hakkame töötama selle andmebaasiga — internetipoe tõmmisega 2024. aasta seisuga. Hoia seda nagu poe kaarti: kes tuli, mis on vitriinil, mida osteti ja milliseid tegevusi enne ostu tehti.
| Tabel | Mida hoiab |
|---|---|
users | ostjaid: id, nimi, linn ja registreerimise kuupäev |
products | vitriini kaupu: id, nimi, kategooria, hind ja jääk |
orders | tellimusi: id, user_id, kuupäev, staatus ja summa |
order_items | tellimuste koosseisu: milline kaup, mitu tükki ja mis hinnaga |
events | käitumuslikke sündmusi: vaatamised, korvi lisamised ja ostud |
Seoseid loetakse nii: üks user → palju orders-it; üks order → palju order_items-it; üks product → palju order_items-it. Kui ära eksid, ava paremal skeem — see on nagu kaubandussaali plaan.
Heidame pilgu tellimuste tabelisse: igal real on user_id — viide ostjale. Nii seotakse üks tabel teisega ja kaart pole enam viis eraldi saart.

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 kaudu:| 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 |
Kuidas lugeda ER-diagrammi
Kaarti, mille QUERY lahti rullis, nimetatakse tööstuses ER-diagrammiks (entity–relationship): ristkülikud on tabelid, jooned nende vahel on seosed välisvõtmete kaudu. Kõige tähtsam joonel on kardinaalsus: mitu rida ühelt poolt vastab mitmele teiselt poolt.
- 1:N, üks-mitmele — kõige sagedasem seos. Üks ostja — palju tellimusi. Välisvõti asub alati „mitme“ poolel:
user_idhoitakseorders-is, mitte vastupidi. See ongi lugemise reegel: leidsid FK — leidsid N-poole. - N:M, mitu-mitmele — ühes tellimuses on palju kaupu ja üks kaup esineb paljudes tellimustes. Otse sellist seost relatsioonilises andmebaasis väljendada ei saa: välisvõtit pole kuhugi panna. See avatakse vahetabeli kaudu — meil on selleks
order_items. Iga selle rida kannab paari viiteidorder_id+product_idja muudab ühe N:M-seose kaheks 1:N-seoseks. Boonus: seosel endal tekivad atribuudid — tükkide arv ja hind ostuhetkel. - 1:1, üks-ühele — esineb harvemini: näiteks viiakse rasked või privaatsed väljad eraldi tabelisse sama võtmega.
-- N:M lahendus tegevuses: paarid „tellimus — kaup“ tabelist order_items
SELECT order_id, product_id, quantity
FROM order_items
LIMIT 6;
Reha: hoida tellimuse koosseisu otse orders-is — stringina '7,12,3' või identifikaatorite massiivina. Selliseid andmeid ei saa kaitsta välisvõtmega, ausalt kokku lugeda ega vitriiniga ühendada ilma akrobaatikata. Näed „mitu mitmega“ seost — loo vahetabel kahe välisvõtmega, nagu order_items.
Interview question
Küsimus vestlusel: kuidas realiseerida relatsioonilises andmebaasis „mitu mitmega“ seos?
Tugev vastus: vahetabeli kaudu kahe välisvõtmega seotavatele tabelitele — nagu order_items order_id ja product_id-ga: see muudab N:M kaheks 1:N-seoseks. Ühtlasi hoitakse seal seose enda atribuute — kogust, hinda ostuhetkel. Sellise tabeli primaarvõti on kas liitvõti kahest FK-st või surrogaatne id.