Databaser utan dimridåer

Tabeller, rader och nycklar

11 min
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 email med villkoret UNIQUE, 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:

En holografisk tabell av kapselrader och kolumner; från orderposter till människoposter löper bärnstensfärgade nyckeltrådar
Rader är poster, kolumner är deras egenskaper, och tråden från en order till dess köpare är en koppling via nyckel.

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:

«Kotomarkets» första köpare i tabellen:
Query result
idfull_namecitysignup_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.

usersidfull_namecityordersiduser_idstatususer_id → id
Den främmande nyckeln 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.

Check yourself
Vad behövs en främmande nyckel (foreign key) till i en databas?