Tabeller, rader och nycklar
What you'll learn
- skilja tabeller, rader och kolumner och förklara varför varje rad behöver en primärnyckel (oftast
id) - hitta kopplingar mellan tabeller via en främmande nyckel:
orders.user_id → users.id - skilja en surrogatnyckel (
IDENTITY, ) från en naturlig (email, ISBN) och motivera varför en primärnyckel inte ska ändras - säkra unikheten hos ett fält som
emailmed villkoretUNIQUE, utan att göra det till primärnyckel
Förteckningen är öppnad. QUERY rullar ut ett hologram ovanför skrivbordet: tusentals poster hänger i luften i ett jämnt rutnät, och mellan en del av dem löper tunna bärnstensfärgade trådar. Du sträcker dig efter en — den klingar som en sträng. Det här är ingen hög med filer. Det är en väv.
Tabeller, rader, kolumner
En relationsdatabas liknar en prydlig katalog: data är sorterade i tabeller, och inuti varje tabell finns kolumner (vilka egenskaper vi lagrar) och rader (de enskilda posterna).
Ta köpartabellen users: varje rad är en köpare från det gamla Jorden, och kolumnerna beskriver dennes id, full_name, email, country, city, signup_date.
För att inte blanda ihop människor med samma namn har varje rad en primärnyckel () — en unik identifierare, oftast kolumnen id. Genom den kan andra tabeller hänvisa till den här raden med hjälp av en främmande nyckel (). Till exempel har en order i orders ett user_id — så minns ordern sin köpare. Just de där bärnstensfärgade trådarna på hologrammet är dessa kopplingar via nycklar.
QUERY: Så länge nyckeln håller, håller tråden. Ett och ett halvt sekel har gått, och varje order minns fortfarande sin människa.
Kör frågan och se hur «Kotomarkets» köpare ser ut — poster som ingen har öppnat sedan det gamla Nätets dagar:

Tables, rows, columns
A relational database is like a tidy catalog: the data is sorted into tables, and inside each table there are columns (what properties we store) and rows (the individual records).
Take the buyers’ table users: each row is one buyer from old Earth, and the columns describe their id, full_name, email, country, city, signup_date.
So that people with the same name don’t get confused, every row has a — a unique identifier, usually the id column. Through it, other tables can reference this row using a . For example, an order in orders has a user_id — that’s how an order remembers its buyer. Those amber threads on the hologram are exactly these key-based links.
QUERY: As long as the key holds, the thread holds. A century and a half on, every order still remembers its person.
Run the query and see what Kotomarket’s buyers look like — records no one has opened since the days of the old Net:
| id | full_name | city | signup_date |
|---|---|---|---|
| 1 | Артём Волков | Санкт-Петербург | 2024-10-20 |
| 2 | Екатерина Алексеев | Екатеринбург | 2025-01-25 |
| 3 | Николай Никитин | Алматы | 2024-09-21 |
| 4 | Екатерина Иванов | Новосибирск | 2024-05-04 |
| 5 | Елена Петров | Казань | 2025-01-05 |
| 6 | Ирина Кузнецов | Новосибирск | 2024-09-12 |
En primärnyckel hjälper dig att felfritt hitta en enda rad (oftast id). En främmande nyckel länkar tabeller: till exempel visar orders.user_id → users.id vems order det är. Härnäst rullar QUERY ut hela kartan över ögonblicksbilden åt dig — alla fem tabellerna.
orders.user_id hänvisar till primärnyckeln users.id — så minns ordern sin köpare.Naturlig eller surrogatnyckel
Var kommer primärnyckeln ifrån? Det finns två vägar. En naturlig nyckel är ett verkligt attribut som redan är unikt: en köpares email, en boks ISBN, en valutakod. En surrogatnyckel är en konstgjord identifierare utan betydelse i yttervärlden: ett automatnummer eller en . I «Kotomarket» används surrogat-id överallt — och det är en lärobokslösning:
-- Surrogatnyckel: databasen delar själv ut nästa nummer (PostgreSQL)
CREATE TABLE users (
id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
email TEXT NOT NULL UNIQUE, -- натуральный кандидат живёт рядом как UNIQUE
full_name TEXT NOT NULL
);
Varför så? Primärnyckelns viktigaste egenskap: den ska inte ändras. Främmande nycklar i andra tabeller pekar på PK:n, och att byta dess värde skulle dra med sig en uppdatering av alla trådar på en gång — i orders, i events, överallt. Och «eviga» naturliga attribut finns knappt: människor byter email och efternamn, telefonnummer flyttas om, även ISBN ges ut på nytt. Ett surrogat-id ändras aldrig — just därför att det inte betyder något.
Krav på vilken primärnyckel som helst: unik, inte NULL, stabil. Spara naturliga nycklar åt små, oföränderliga uppslagstabeller — till exempel valutakoden 'RUB' från ISO 4217. Och unikheten hos en naturlig kandidat som email fäster du med ett separat UNIQUE-villkor, som i exemplet ovan: kopplingarna håller, data förblir ärliga, och köparen är ändå inte förbjuden att byta email.
Vi föregriper lite: själva syntaxen för att skapa tabeller och villkor (CREATE TABLE, PRIMARY KEY, UNIQUE) är ämnet för Kapitel 9. Här ska du titta på nyckelns struktur, inte på kommandot: att ett surrogat-id blev primärnyckel, medan email lever bredvid som UNIQUE.
Interview question
Intervjufråga: vad skiljer en surrogatnyckel från en naturlig och vilken väljer du för en användartabell?
Ett starkt svar: en naturlig nyckel är ett verkligt unikt attribut (email, ISBN), en surrogatnyckel är en konstgjord identifierare (en IDENTITY-kolumn eller en ). För användare — surrogat: en primärnyckel ska inte ändras, eftersom främmande nycklar hänvisar till den, och email byter folk. Unikheten hos email fästs då med ett separat UNIQUE-villkor. En naturlig nyckel är motiverad i stabila uppslagstabeller som ISO 4217-valutakoder.