Tietokannat ilman sumua

Taulut, rivit ja avaimet

11 min
What you'll learn
  • erottamaan taulut, rivit ja sarakkeet ja selittämään, miksi jokaisella rivillä on oltava primääriavain (yleensä id)
  • löytämään taulujen väliset yhteydet vierasavaimen kautta: orders.user_id → users.id
  • erottamaan surrogaattiavaimen (IDENTITY, ) luonnollisesta (email, ISBN) ja perustelemaan, miksi primääriavain ei saa muuttua
  • lukitsemaan email-kentän kaltaisen kentän ainutkertaisuuden UNIQUE-rajoitteella tekemättä siitä primääriavainta

Luettelo on auki. QUERY levittää työpöydän ylle hologrammin: tuhannet tietueet leijuvat ilmassa tasaisena ruudukkona, ja joidenkin välillä venyy ohuita meripihkanvärisiä säikeitä. Kurotat yhteen – se soi kuin kielisoittimen kieli. Tämä ei ole kasa tiedostoja. Tämä on kangas.

Taulut, rivit, sarakkeet

Relaatiotietokanta muistuttaa siistiä luetteloa: data on jaettu tauluihin, ja jokaisen taulun sisällä on sarakkeita (mitä ominaisuuksia säilytämme) ja rivejä (yksittäisiä tietueita).

Ota ostajien taulu users: jokainen rivi on yksi vanhan Maan ostaja, ja sarakkeet kuvaavat hänen tietonsa id, full_name, email, country, city, signup_date.

Jotta samannimisiä ihmisiä ei sekoiteta, jokaisella rivillä on primääriavain () – ainutkertainen tunniste, yleensä id-sarake. Sen kautta muut taulut voivat viitata tähän riviin vierasavaimella (). Esimerkiksi tilauksessa orders on user_id – niin tilaus muistaa ostajansa. Ne samat meripihkanväriset säikeet hologrammissa ovat juuri näitä avainpohjaisia yhteyksiä.

QUERY: Niin kauan kuin avain on ehjä, säie on ehjä. Puolitoista vuosisataa on kulunut, ja jokainen tilaus muistaa yhä oman ihmisensä.

Aja kysely ja katso, miltä Kotomarketin ostajat näyttävät – tietueet, joita kukaan ei ole avannut vanhan Verkon ajoista:

Holografinen taulu kapseli-riveistä ja sarakkeista; tilaustietueista ihmistietueisiin venyvät meripihkanväriset avainsäikeet
Rivit ovat tietueita, sarakkeet niiden ominaisuuksia, ja säie tilauksesta ostajaan on avainpohjainen yhteys.

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:

Kotomarketin ensimmäiset ostajat taulussa:
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

Primääriavain auttaa löytämään yhden rivin virheettömästi (yleensä id). Vierasavain yhdistää taulut: esimerkiksi orders.user_id → users.id näyttää, kenen tilaus on. Seuraavaksi QUERY levittää eteesi koko vedoksen kartan – kaikki viisi taulua.

usersidfull_namecityordersiduser_idstatususer_id → id
Vierasavain orders.user_id viittaa primääriavaimeen users.id – niin tilaus muistaa ostajansa.

Luonnollinen vai surrogaattiavain

Mistä primääriavain tulee? Teitä on kaksi. Luonnollinen avain on todellinen attribuutti, joka on jo valmiiksi ainutkertainen: ostajan email, kirjan ISBN, valuuttakoodi. Surrogaattiavain on keinotekoinen tunniste, jolla ei ole merkitystä ulkomaailmassa: automaattinumerointi tai . Kotomarketissa käytetään kaikkialla surrogaatteja id – ja se on tyypillinen ratkaisu:

-- Surrogaattiavain: tietokanta antaa itse seuraavan numeron (PostgreSQL)
CREATE TABLE users (
  id        BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
  email     TEXT NOT NULL UNIQUE,  -- natiivi kandidaatti elää vierellä UNIQUE-kenttänä
  full_name TEXT NOT NULL
);

Miksi näin? Primääriavaimen tärkein ominaisuus: se ei saa muuttua. Muiden taulujen vierasavaimet viittaavat primääriavaimeen, ja arvon vaihtaminen vetäisi mukanaan kaikkien säikeiden päivityksen kerralla – taulussa orders, taulussa events, kaikkialla. ”Ikuisia” luonnollisia attribuutteja ei juuri ole: ihmiset vaihtavat sähköpostia ja sukunimiä, puhelinnumerot vaihtavat omistajaa, jopa ISBN otetaan uudelleen käyttöön. Surrogaatti id ei muutu koskaan – juuri siksi, ettei se merkitse mitään.

Vaatimukset mille tahansa primääriavaimelle: ainutkertainen, ei NULL, vakaa. Jätä luonnolliset avaimet pienille, muuttumattomille hakutauluille – esimerkiksi ISO 4217 -valuuttakoodille 'RUB'. Ja luonnollisen kandidaatin kuten email ainutkertaisuuden kiinnität erillisellä UNIQUE-rajoitteella, kuten yllä olevassa esimerkissä: yhteydet säilyvät, data pysyy rehellisenä, eikä ostajaa kielletä vaihtamasta sähköpostiaan.

Ennakkokurkistus: itse syntaksi taulujen ja rajoitteiden luomiseen (CREATE TABLE, PRIMARY KEY, UNIQUE) on luvun 9 aihe. Katso täällä avaimen rakennetta, älä komentoa: että surrogaatti id tuli primääriavaimeksi ja email elää vierellä UNIQUE-kenttänä.

Interview question

Haastattelukysymys: miten surrogaattiavain eroaa luonnollisesta ja kumman valitsisit käyttäjätaululle?

Vahva vastaus: luonnollinen on todellinen ainutkertainen attribuutti (email, ISBN), surrogaatti on keinotekoinen tunniste (IDENTITY-sarake tai ). Käyttäjille – surrogaatti: primääriavain ei saa muuttua, koska siihen viittaavat vierasavaimet, ja sähköpostin ihmiset vaihtavat. Sähköpostin ainutkertaisuus kiinnitetään tällöin erillisellä UNIQUE-rajoitteella. Luonnollinen avain on perusteltu vakaissa hakutauluissa kuten ISO 4217 -valuuttakoodeissa.

Check yourself
Mihin tietokannassa tarvitaan vierasavainta (foreign key)?