«Kotomarkets» schema
What you'll learn
- hitta rätt tabell bland de fem i «Kotomarket»:
users,products,orders,order_items,events - läsa ett ER-diagram: avgöra en kopplings kardinalitet (1:N, N:M, 1:1) utifrån var den främmande nyckeln ligger
- veckla ut en «många-till-många»-koppling via en mellantabell med två FK — som
order_itemsmedorder_id+product_id - förklara varför en orders innehåll inte kan lagras som en sträng av id direkt i
orders
Idag lägger QUERY fram hela förteckningen på huvudbordet på en gång. Fem lysande plan hänger i luften och roterar långsamt — en karta över den värld som överlevde. Bredvid flimrar konserveringsloggen som bifogats ögonblicksbilden, och en rad i den är understruken: «Överlämnar fem tabeller och spåret av en sjätte. — K.» Du räknar planen. Exakt fem. Var är spåret?
QUERY: Låt dig inte distraheras av spår. Lär dig först dessa fem så väl att du hittar vägen med slutna ögon — resten visar arkivet självt, när det bedömer dig redo.
«Kotomarkets» fem tabeller
Härifrån och framåt arbetar vi med den här databasen — en ögonblicksbild av en nätbutik från 2024. Håll den som en karta över butiken: vem som kom in, vad som ligger i skyltfönstret, vad de köpte och vilka handlingar de utförde före köpet.
| Tabell | Vad den lagrar |
|---|---|
users | köpare: id, namn, stad och registreringsdatum |
products | varor i skyltfönstret: id, namn, kategori, pris och saldo |
orders | ordrar: id, user_id, datum, status och summa |
order_items | orderinnehåll: vilken vara, hur många stycken och till vilket pris |
events | beteendehändelser: visningar, tillägg i varukorgen och köp |
Kopplingarna läses så här: en user → många orders; en order → många order_items; en product → många order_items. Om du går vilse, öppna schemat till höger — det är som butikslokalens planritning.
Vi tittar in i ordertabellen: varje rad har ett user_id — en referens till en köpare. Så länkas en tabell till en annan, och kartan upphör att vara fem separata öar.

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:| 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 |
Hur man läser ett ER-diagram
Kartan som QUERY rullade ut kallar branschen ett ER-diagram (entity–relationship): rektanglar är tabeller, linjerna mellan dem är kopplingar via främmande nycklar. Det viktigaste på en linje är dess kardinalitet: hur många rader på ena sidan som motsvarar hur många på den andra.
- 1:N, en-till-många — den vanligaste kopplingen. En köpare, många ordrar. Den främmande nyckeln ligger alltid på «många»-sidan:
user_idlagras iorders, inte tvärtom. Det är just lässregeln: hittade du FK:n — hittade du N-sidan. - N:M, många-till-många — en order har många varor, och en vara förekommer i många ordrar. En sådan koppling går inte att uttrycka direkt i en relationsdatabas: det finns ingenstans att lägga den främmande nyckeln. Man vecklar ut den via en mellantabell — hos oss är det
order_items. Var och en av dess rader bär ett par referenserorder_id+product_idoch förvandlar en N:M-koppling till två 1:N-kopplingar. Bonus: själva kopplingen får attribut — antalet stycken och priset vid köptillfället. - 1:1, en-till-en — förekommer mer sällan: till exempel flyttas tunga eller privata fält ut i en separat tabell med samma nyckel.
-- N:M-upplösningen i praktiken: par «order — vara» ur order_items
SELECT order_id, product_id, quantity
FROM order_items
LIMIT 6;
Fallgrop: att lagra en orders innehåll direkt i orders — som en sträng '7,12,3' eller en array av identifierare. Sådana data går inte att skydda med en främmande nyckel, räkna ärligt eller foga samman med skyltfönstret utan akrobatik. Ser du en «många-till-många»-koppling — skapa en mellantabell med två främmande nycklar, som order_items.
Interview question
Intervjufråga: hur implementerar man en «många-till-många»-koppling i en relationsdatabas?
Ett starkt svar: via en mellantabell med två främmande nycklar till de tabeller som ska länkas — som order_items med order_id och product_id: den förvandlar N:M till två 1:N-kopplingar. På köpet lagrar man i den attribut för själva kopplingen — antal, priset vid köptillfället. Primärnyckeln för en sådan tabell är antingen sammansatt av de två FK:erna eller ett surrogat-id.