Tietokannat ilman sumua

Millaisia tietokantoja on olemassa

18 min
What you'll learn
  • erottamaan viisi tietokantaperhettä – relaatio-, avain-arvo-, dokumentti-, sarake- ja graafitietokannat – tallennustavan ja tyypillisten tehtävien perusteella
  • valitsemaan varaston kyselyiden luonteen mukaan: relaatiotietokanta oletuksena, Redis/MongoDB/ClickHouse tiettyyn tehtävään, ei ”muodin mukaan”
  • selittämään eron :n ja :n välillä ja sen, miksi tuote kirjoittaa PostgreSQL:ään ja analytiikka lukee sarakemuotoista replikaa
  • tunnistamaan ”dokumenttimaisen” tarpeen, jonka PostgreSQL:n jsonb-sarake kattaa ilman toista tietokantaa

Matkalla luetteloa kohti QUERY hidastaa arkiston pimeän osaston kohdalla. Lasin takana on vanhan Maan arkistojen rekisteri – niiden, jotka eivät selvinneet Suuresta Katkoksesta: välimuistisolmut sammuivat ensimmäisinä, dokumenttivarastot saapuivat repaleisina sirpaleina, analyyttiset klusterit vaikenevat kokonaisten sektoreiden verran. Mutta Kotomarketin relaatiovedos säilyi kokonaisena – kaikkine yhteyksineen.

Ei pelkästään relaatiotietokantoja

Kotomarketille relaatiotietokannat sopivat erityisen hyvin: ostajat, tilaukset ja tuotteet asettuvat luontevasti tauluihin yhteyksineen. Juuri niistä tämä kurssi kertoo. Mutta alalla – niin vuonna 2024 kuin nytkin – tapaa muitakin lähestymistapoja:

  • avain-arvo (Redis) – erittäin nopea muoto ”avain → arvo”, kun yksinkertainen tietue pitää saada hetkessä;
  • dokumenttipohjaiset (MongoDB) – säilyttävät joustavia -dokumentteja, joiden rakenne voi vaihdella tietueesta toiseen;
  • sarakemuotoiset (ClickHouse) – vahvoja analytiikassa, kun mittareita pitää laskea nopeasti valtavista datamääristä.

Suurin osa tuotekehityksen suosituista :istä pysyy relaatiopohjaisina: PostgreSQL, MySQL, Oracle, MS SQL. Kun opit SQL:n täällä, osaat lukea dataa varmasti hyvin erilaisissa yrityksissä.

QUERY: Jokaisella arkistolla on oma työnsä: yksi tarjoaa nopeutta, toinen joustavuutta, kolmas analytiikkaa. Meillä kävi tuuri: meille jäi se, jossa kaikki liittyy kaikkeen.

Pimeä galleria sammuneita vanhan Maan arkistoja eri muodoissa; sen päässä loistaa kokonaisena relaatiohologrammi yhdistetyistä tauluista
Varastoja on monenlaisia: avain-arvo, dokumentit, sarakkeet. Meidän säilynyt vedoksemme on relaatiopohjainen: tauluja ja yhteyksiä.

Not only relational

For Kotomarket, relational databases suit us especially well: buyers, orders, and products fall naturally into tables with links between them. That’s what this course is about. But across the industry — in 2024 just as today — you’ll meet other approaches too:

  • key-value (Redis) — a blazingly fast "key → value" format for when you need to grab a simple record instantly;
  • document-oriented (MongoDB) — stores flexible documents whose structure can differ from record to record;
  • columnar (ClickHouse) — strong at analytics, when you need to crunch metrics over enormous volumes of data fast.

Most of the popular DBMSs for product development stay relational: PostgreSQL, MySQL, Oracle, MS SQL. Master SQL here and you’ll be able to read data confidently at very different companies.

QUERY: Each archive has its own job: one prizes speed, another flexibility, a third analytics. You and I got lucky: we inherited the one where everything is connected to everything.

Perheiden rekisteri: kaikki kohdilleen

Lasin takana oleva rekisteri on hyvä tilaisuus käydä tietokantaperheet läpi tosissaan: ”millaisia tietokantoja on ja milloin mikäkin valitaan” on yksi yleisimmistä haastattelukysymyksistä. Käymme viisi perhettä läpi peräkkäin, ja jokaisesta saman kaavan mukaan: tallennustapa, vahvuudet ja heikkoudet, tuotteet ja milloin valita.

Relaatiotietokannat: tiukka skeema ja yhteydet

Tallennustapa: rivejä tauluissa, joiden skeema on julistettu etukäteen – jokaisella sarakkeella on tyyppi, taulujen välillä on yhteyksiä avainten kautta, ja vartioi eheyttä itse: tilausta olemattomalta ostajalta ei voi kirjata. Muutokset ajetaan transaktioina -takeineen – ”tilaus + saldon vähennys” joko kirjoitetaan yhdessä tai ei lainkaan.

users — a tableidPKintegerfull_nametextcitytextsignup_datedate123Artyom VolkovEkaterina AlekseevNikolay NikitinSaint PetersburgYekaterinburgAlmaty2024-10-202025-01-252024-09-21rows are records · columns are typed properties · there can be just one table
Relaatiotietokanta on pohjimmiltaan taulu: rivit ovat tietueita, sarakkeilla on kullakin oma tyyppinsä. Avainpohjaiset yhteydet tulevat päälle, ja tauluja voi olla vaikka vain yksi.
usersidnameproductsidtitleordersiduser_idproduct_idFK → PKproducts · banking · ordersPostgreSQL · MySQL
Ja kun tauluja on useita – ne liittyvät yhteen avainten kautta: tiukka skeema ja yhteydet taulujen välillä.
  • Vahvuudet: ilmaisuvoimainen SQL (suodattimet, taulujen liitokset, aggregaatit), eheys tietokannan tasolla, transaktiot.
  • Heikkoudet: skeema pitää miettiä etukäteen ja migroida muutosten yhteydessä; vaakasuora skaalaus monelle palvelimelle on vaikeampaa kuin -perheillä.
  • Tuotteet: PostgreSQL, MySQL/MariaDB, Microsoft SQL Server, Oracle, SQLite.
  • Milloin valita: käyttäjät, tilaukset, raha, varasto – kaikkialla, missä data on yhteydessä toisiinsa ja virheellinen kirjoitus on mahdoton. Uudelle tuotteelle tämä on oletusvalinta.

Avain-arvo-tietokannat: sanakirja täydellä vauhdilla

Tallennustapa: yksi jättimäinen sanakirja ”avain → arvo”, useimmiten keskusmuistissa. Ei tauluja, ei yhteyksiä: panit avaimella sisään – haet avaimella ulos sekunnin murto-osassa.

-- Tämä ei ole SQL, nämä ovat Redis-komentoja
SET session:8f3a '{"user_id": 42}'
GET session:8f3a
keyvalueuser:42Anna · Moscowcart:42[milk, cheese]sess:9factive until 18:40lookup by key — instantcache · sessions · carts — Redis
Avain-arvo: välitön pääsy tarkalla avaimella – eikä mitään ”sisällön mukaan” -kyselyitä.
  • Vahvuudet: nopeus, yksinkertaisuus, helppo skaalaus.
  • Heikkoudet: kyselyt vain tarkalla avaimella – kysymystä ”etsi kaikki Moskovan ostajien istunnot” ei tälle muodolle voi esittää; arvon sisältö on tietokannalle läpinäkymätön.
  • Tuotteet: Redis, Memcached, Amazon DynamoDB.
  • Milloin valita: välimuisti, istunnot, laskurit, jonot, tulostaulut – kuumaa dataa päätietokannan vierellä, ei sen sijasta.

Dokumenttitietokannat: joustava JSON

Tallennustapa: tietueet ovat -dokumentteja, jotka on ryhmitelty kokoelmiin. Skeemaa ei julisteta etukäteen: älykellolla on kenttä ”akun kesto”, hupparilla ”kokotaulukko”, ja molemmat dokumentit makaavat rauhassa samassa kokoelmassa. Sisäkkäiset rakenteet säilytetään suoraan dokumentin sisällä, ilman erillisiä tauluja.

document 1document 2{name: "Mouse",price: 390,tags: ["hit"]}{name: "Food",brand: "Kote",specs: {weight: "2 kg"}}fields and nesting differ — schema is flexiblecatalogs · profiles · CMS — MongoDB
Dokumenttimalli: joustavat JSON-dokumentit, joilla on eri kenttäjoukot, asuvat samassa kokoelmassa.
  • Vahvuudet: joustava rakenne, dokumentti luetaan kokonaan yhdellä haulla, kätevä luetteloille, joissa on erilaisia attribuutteja, ja nopeisiin prototyyppeihin.
  • Heikkoudet: dokumenttien väliset yhteydet ovat sovelluksen huolena, täysiveristä JOINia ei juuri ole; ilman kuria kokoelmasta tulee yhteensopimattomien muotojen eläintarha.
  • Tuotteet: MongoDB, Couchbase, Firestore.
  • Milloin valita: sisältö, luettelot, joissa on hyvin erilaisia kenttiä, profiilit ja asetukset.

Perheiden raja on muuten häilyvä: PostgreSQL osaa säilyttää dokumentteja jsonb-tyyppisessä sarakkeessa ja rakentaa niille indeksejä – usein tämä kattaa ”dokumenttimaisen” tarpeen ilman toista tietokantaa:

-- Esimerkki vedoksemme ulkopuolelta: attrs on jsonb-tyyppinen sarake
SELECT name, attrs->>'color' AS color
FROM catalog
WHERE attrs @> '{"brand": "Kotomarket"}';

Sarakemuotoiset tietokannat: analytiikkaa miljardeista riveistä

Tallennustapa: arvot eivät ole riveittäin vaan sarakkeittain: kaikki hinnat vierekkäin, kaikki päivämäärät vierekkäin. Kysely ”keskiostos kuukausittain” lukee levyltä vain kaksi saraketta koko taulun sijaan, ja samantyyppiset arvot pakkautuvat erinomaisesti. Siitä syntyy nopeus aggregaateissa.

-- Sarakemuotoisen tietokannan lempilaji (ClickHouse-murre: toYYYYMM on sen funktio)
SELECT toYYYYMM(created_at) AS month, avg(total_amount) AS avg_check
FROM orders
GROUP BY month;
columnar storage: the table is laid out by columnsuser_ideventpricets39029905901490990AVG(price): only one column is readevent analytics · metrics — ClickHouse
Sarakemuotoinen tallennus: aggregaatti lukee levyltä vain tarvitsemansa sarakkeet, ei koko taulua riveittäin.
  • Vahvuudet: aggregaatit ja miljardien rivien skannaus, voimakas pakkaus.
  • Heikkoudet: täsmälliset päivitykset ja poistot ovat kalliita; yhden rivin lukeminen kokonaan on hitaampaa kuin riviperustaisessa tietokannassa; transaktiokuormaa varten niitä ei ole tarkoitettu.
  • Tuotteet: ClickHouse, BigQuery, Snowflake, Amazon Redshift.
  • Milloin valita: analytiikka, raportit, tapahtumat, lokit, mittarit – yleensä ”tuotannon” relaatiotietokannan vierellä.

Tässä samalla pari termiä, joista haastatteluissa pidetään: (online processing – paljon lyhyitä kirjoitus- ja lukuoperaatioita, PostgreSQL:n maailma) ja (online analytical processing – raskaita analyyttisiä lukuja koko historiasta, ClickHousen maailma). Tuote kirjoittaa OLTP-tietokantaan, analytiikka lukee OLAP-kopiota.

Ja viimeinen perhe – graafitietokannat

Kun yhteydet ovat tärkeämpiä kuin tietueet itse – ”ystävien ystävät”, toimitusreitit, suositusketjut – otetaan käyttöön graafitietokannat (Neo4j, Memgraph). Niissä data on solmuja (ne ovat tietueita) ja kaaria (ne ovat tietueiden välisiä yhteyksiä); minkä tahansa syvyisten yhteyksien läpikäynti on niille luontainen operaatio. Relaatiotietokannassa sama läpikäynti on liitosten tikapuut, jotka raskautuvat syvyyden myötä.

friendAnnBobCaraDanEvenodes are records, edges are links; "friends of friends" = two edges away
Graafi: ympyrä-solmut ovat tietueita (esimerkiksi ihmisiä), viiva-kaaret ovat niiden välisiä yhteyksiä. ”Ystävien ystävät” on vain hyppimistä kaaria pitkin.

Miniopas: miten valita tietokanta projektiin

  1. Aloita kysymyksistä, älä datasta. Mitä kyselyitä tuote esittää: täsmällisiä ”avaimella”, yhdistäviä ”kuka osti mitä”, analyyttisiä ”paljonko kuukaudessa”?
  2. Oletuksena relaatiotietokanta. Yhteydessä oleva data plus virheen hinta (tilaukset, maksut, saldot) – se on PostgreSQL. Turvallisin lähtö lähes mille tahansa tuotteelle.
  3. Erikoistuneet tietokannat tiettyyn tehtävään, ei ”varmuuden vuoksi”. Kuumat luvut painavat – lisää Redis-välimuisti. Analytiikka kasvoi – replikoi tapahtumat ClickHouseen. Villi kenttien vaihtelu – ensin jsonb PostgreSQL:ssä, ja vasta kun se ei riitä – dokumenttitietokanta.
  4. Laske toisen tietokannan hinta. Jokainen uusi tarkoittaa datan synkronointia, varmuuskopioita, valvontaa ja vielä yhden teknologian, jota tiimin pitää ylläpitää.

Sudenkuoppa: valita tietokanta ”muodin mukaan”. ”Otetaan MongoDB – ilman skeemaa on nopeampaa” päättyy siihen, että skeema suunnitellaan kuitenkin, mutta nyt sen säännöt elävät sovelluksen koodissa eivätkä tietokannan suojassa. Käänteinen sudenkuoppa tavataan myös: raahata ClickHouse mukaan määriin, jotka PostgreSQL aggregoi millisekunneissa. Tietokanta valitaan kyselyiden luonteen ja virheen hinnan mukaan – ei hypen perusteella.

ClickHouse on sarakemuotoinen analytiikkaan: sitä rakastetaan nopeista laskelmista suurissa tapahtuma- ja tilaustauluissa. Sillä on oma SQL-murteensa; alustalla on erillinen ClickHouse-harjoittelija. Meidän vedoksemme on kuitenkin relaatiopohjainen: seuraavaksi QUERY avaa luettelon ja näyttää, mistä se koostuu – tauluista, riveistä ja niiden välisistä avainsäikeistä.

Interview question

Haastattelukysymys: mitä tietokantatyyppejä tunnet ja miten valitsisit varaston uudelle palvelulle?

Vahva vastaus: relaatiotietokannat (PostgreSQL, MySQL) – tiukka skeema, yhteydet, -transaktiot; avain-arvo (Redis) – välimuisti, istunnot, laskurit; dokumenttitietokannat (MongoDB) – joustavat -dokumentit; sarakemuotoiset (ClickHouse, BigQuery) – analytiikka suurista määristä; graafitietokannat (Neo4j) – syvät yhteydet. Valinnassa lähden kyselyiden luonteesta: totuuden lähteeksi otan relaatiotietokannan, erikoistuneet kytken tiettyyn tehtävään (välimuisti, analytiikka), en sen sijasta.

Lisäkysymys: miten eroaa :sta?

Vahva vastaus: OLTP on paljon lyhyitä kirjoitus- ja lukutransaktioita (tilausten teko), riviperustaisia :iä kuten PostgreSQL; OLAP on raskaita analyyttisiä lukuja ja aggregaatteja historiasta, sarakemuotoisia DBMS:iä kuten ClickHouse. Ne toimivat usein parina: tuote kirjoittaa OLTP:hen, analytiikka lukee OLAP-replikaa.

Check yourself
Minkä tyyppinen tietokanta valitaan yleensä suurten datamäärien analytiikkaan?