Kotomarketin skeema
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 onorder_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.
| Taulu | Mitä säilyttää |
|---|---|
users | ostajat: id, nimi, kaupunki ja rekisteröitymispäivä |
products | hyllyn tuotteet: id, nimi, kategoria, hinta ja saldo |
orders | tilaukset: id, user_id, päivämäärä, tila ja summa |
order_items | tilausten sisältö: mikä tuote, montako kappaletta ja mihin hintaan |
events | kä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.

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:n kautta:| 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 |
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_idsäilytetään taulussaorders, 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 viittauspariaorder_id+product_idja 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;
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.