Tietokannat ilman sumua

Kotomarketin skeema

11 min
What you'll learn
  • löytämään oikean taulun Kotomarketin viidestä: users, products, orders, order_items, events
  • lukemaan ER-kaaviota: määrittämään yhteyden kardinaliteetin (1:N, N:M, 1:1) sen perusteella, missä vierasavain sijaitsee
  • avaamaan ”monesta moneen” -yhteyden välitaulun kautta, jossa on kaksi FK:ta – kuten order_items, jossa on order_id + product_id
  • selittämään, miksi tilauksen sisältöä ei voi säilyttää id-merkkijonona suoraan taulussa orders

Tänään QUERY tuo pääpöydälle koko luettelon kerralla. Viisi hohtavaa tasoa leijuu ilmassa ja pyörii hitaasti – kartta säilyneestä maailmasta. Vieressä välkkyy vedokseen liitetty säilytysloki, ja yksi rivi siinä on alleviivattu: ”Luovutan viisi taulua ja kuudennen jäljen. – K.” Lasket tasot. Tasan viisi. Missä jälki?

QUERY: Älä eksy jälkien perään. Opettele ensin nämä viisi niin, että löydät tien silmät kiinni – loput arkisto näyttää itse, kun katsoo sinun olevan valmis.

Kotomarketin viisi taulua

Jatkossa työskentelemme tämän tietokannan parissa – verkkokaupan vedoksen vuodelta 2024. Pidä sitä kuin kaupan karttana: kuka tuli, mitä on hyllyllä, mitä ostettiin ja mitä tehtiin ennen ostoa.

TauluMitä säilyttää
usersostajat: id, nimi, kaupunki ja rekisteröitymispäivä
productshyllyn tuotteet: id, nimi, kategoria, hinta ja saldo
orderstilaukset: id, user_id, päivämäärä, tila ja summa
order_itemstilausten sisältö: mikä tuote, montako kappaletta ja mihin hintaan
eventskäyttäytymistapahtumat: katselut, ostoskoriin lisäykset ja ostot

Yhteydet luetaan näin: yksi user → monta orders; yksi order → monta order_items; yksi product → monta order_items. Jos eksyt, avaa skeema oikealta – se on kuin myymälän pohjapiirros.

Kurkistetaan tilaustauluun: jokaisella rivillä on user_id – viittaus ostajaan. Niin yksi taulu liittyy toiseen, eikä kartta ole enää viisi erillistä saarta.

Viisi holografista taulutasoa pyörii tähdistönä, yhteyksien säikein liitettyinä; sivussa erottuu juuri ja juuri katkoviivainen jälki kuudennesta ääriviivasta
Arkiston kartta: viisi taulua ja niiden väliset yhteydet. Säilytysloki lupaa lisäksi ”kuudennen jäljen” – mutta toistaiseksi sitä ei näy.

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.

Tilaukset ja niiden yhteys ostajaan user_id:n kautta:
Query result
iduser_idstatustotal_amount
118paid5980.00
210paid19750.00
326cancelled9560.00
426paid15530.00
58paid26710.00
637paid42110.00

Miten ER-kaaviota luetaan

Karttaa, jonka QUERY levitti, kutsutaan alalla ER-kaavioksi (entity–relationship): suorakulmiot ovat tauluja, niiden väliset viivat vierasavainyhteyksiä. Tärkeintä viivassa on kardinaliteetti: montako riviä toisella puolella vastaa montaa riviä toisella.

  • 1:N, yhdestä moneen – yleisin yhteys. Yksi ostaja – monta tilausta. Vierasavain on aina ”monien” puolella: user_id säilytetään taulussa orders, ei toisin päin. Tämä on lukusääntö: löysit FK:n – löysit N-puolen.
  • N:M, monesta moneen – yhdessä tilauksessa on monta tuotetta, ja yksi tuote esiintyy monessa tilauksessa. Tällaista yhteyttä ei voi ilmaista suoraan relaatiotietokannassa: vierasavaimelle ei ole paikkaa. Se avataan välitaulun kautta – meillä se on order_items. Jokainen sen rivi kantaa viittausparia order_id + product_id ja muuttaa yhden N:M-yhteyden kahdeksi 1:N-yhteydeksi. Bonus: itse yhteys saa attribuutteja – kappalemäärän ja oston hetken hinnan.
  • 1:1, yhdestä yhteen – tavataan harvemmin: esimerkiksi raskaat tai yksityiset kentät siirretään omaan tauluun samalla avaimella.
-- N:M-purku käytännössä: ”tilaus–tuote”-parit taulusta 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)
Kotomarketin ER-kaavio: 1:N-yhteydet taulusta users tauluun orders ja N:M-purku orders- ja products-taulujen välillä taulun order_items kautta.

Sudenkuoppa: säilyttää tilauksen sisältöä suoraan taulussa orders – merkkijonona '7,12,3' tai tunnisteiden taulukkona. Tällaista dataa ei voi suojata vierasavaimella, laskea rehellisesti eikä yhdistää hyllyyn ilman akrobatiaa. Kun näet ”monesta moneen” -yhteyden – luo välitaulu, jossa on kaksi vierasavainta, kuten order_items.

Interview question

Haastattelukysymys: miten relaatiotietokannassa toteutetaan ”monesta moneen” -yhteys?

Vahva vastaus: välitaulun kautta, jossa on kaksi vierasavainta yhdistettäviin tauluihin – kuten order_items, jossa on order_id ja product_id: se muuttaa N:M:n kahdeksi 1:N-yhteydeksi. Samalla siihen säilytetään itse yhteyden attribuutit – kappalemäärä, oston hetken hinta. Tällaisen taulun primääriavain on joko yhdistelmä kahdesta FK:sta tai surrogaatti id.

Check yourself
Mistä skeemasta näkee, mikä tuote päätyi mihinkin tilaukseen?