Andmebaasid ilma uduta

„Kotomarketi“ skeem

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

TabelMida hoiab
usersostjaid: id, nimi, linn ja registreerimise kuupäev
productsvitriini kaupu: id, nimi, kategooria, hind ja jääk
orderstellimusi: id, user_id, kuupäev, staatus ja summa
order_itemstellimuste koosseisu: milline kaup, mitu tükki ja mis hinnaga
eventskä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.

Viis holograafilist tabeli-tasapinda pöörlevad tähtkujuna, ühendatud niitidega; kõrval on vaevu märgatav kuuenda kontuuri katkendlik jälg
Arhiivi kaart: viis tabelit ja seosed nende vahel. Säilituspäevik lubab veel ka „kuuenda jälge“ — kuid seda pole veel näha.

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.

Tellimused ja nende seos ostjaga user_id kaudu:
Query result
iduser_idstatustotal_amount
118paid5980.00
210paid19750.00
326cancelled9560.00
426paid15530.00
58paid26710.00
637paid42110.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_id hoitakse orders-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 viiteid order_id + product_id ja 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;
usersidnameproductsidpriceordersiduser_ideventsuser_idproduct_idorder_itemsorder_idproduct_iduser_id → idproduct_id → idPKFK (reference)
„Kotomarketi“ ER-diagramm: 1:N seosed users-ist orders-isse ja N:M lahendus orders ja products vahel order_items kaudu.

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.

Check yourself
Kus on skeemis näha, milline kaup sattus millisesse tellimusse?