Databaser utan dimridåer

«Kotomarkets» schema

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

TabellVad den lagrar
usersköpare: id, namn, stad och registreringsdatum
productsvaror i skyltfönstret: id, namn, kategori, pris och saldo
ordersordrar: id, user_id, datum, status och summa
order_itemsorderinnehåll: vilken vara, hur många stycken och till vilket pris
eventsbeteendehä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.

Fem holografiska tabellplan roterar som en stjärnbild, sammanbundna med trådar; vid sidan skymtar knappt en streckad kontur av en sjätte
Arkivets karta: fem tabeller och kopplingarna mellan dem. Konserveringsloggen lovar också «spåret av en sjätte» — men det syns inte till än.

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.

Ordrar och deras koppling till köparen via user_id:
Query result
iduser_idstatustotal_amount
118paid5980.00
210paid19750.00
326cancelled9560.00
426paid15530.00
58paid26710.00
637paid42110.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_id lagras i orders, 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 referenser order_id + product_id och 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;
usersidnameproductsidpriceordersiduser_ideventsuser_idproduct_idorder_itemsorder_idproduct_iduser_id → idproduct_id → idPKFK (reference)
«Kotomarkets» ER-diagram: 1:N-kopplingar från users till orders och N:M-upplösningen mellan orders och products via order_items.

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.

Check yourself
Var i schemat ser man vilken vara som hamnade i vilken order?