Databázy bez hmly

Aké druhy databáz existujú

18 min
What you'll learn
  • rozlíšiť päť rodín databáz — relačné, kľúč-hodnota, dokumentové, stĺpcové, grafové — podľa spôsobu ukladania a typických úloh
  • vyberať úložisko podľa povahy dotazov: relačná databáza ako predvolená voľba, Redis/MongoDB/ClickHouse — na konkrétnu úlohu, a nie «podľa módy»
  • vysvetliť rozdiel medzi a a prečo produkt zapisuje do PostgreSQL, kým analytika číta zo stĺpcovej repliky
  • nájsť «dokumentovú» potrebu, ktorú v PostgreSQL pokryje stĺpec jsonb bez druhej databázy

Cestou k súpisu QUERY pribrzdí pri tmavej sekcii úložiska. Za sklom — register archívov starej Zeme, ktoré neprežili Veľký zlom: cache-uzly zhasli prvé, dokumentové úložiská došli v roztrhaných útržkoch, analytické klastre mlčia celými sektormi. No relačná snímka «Kotomarketu» prežila celá — so všetkými väzbami.

Nielen relačné

Pre «Kotomarket» sa nám obzvlášť hodia relačné databázy: zákazníci, objednávky a tovary prirodzene zapadnú do tabuliek s väzbami. Práve im je venovaný kurz. No v odvetví — či už v roku 2024, alebo dnes — sa stretneš aj s inými prístupmi:

  • kľúč-hodnota (Redis) — veľmi rýchly formát «kľúč → hodnota», keď treba okamžite vytiahnuť jednoduchý záznam;
  • dokumentovo orientované (MongoDB) — uchovávajú flexibilné dokumenty, kde sa štruktúra môže záznam od záznamu líšiť;
  • stĺpcové (ClickHouse) — silné v analytike, keď treba rýchlo počítať ukazovatele nad obrovskými objemami dát.

Väčšina populárnych pre produktový vývoj zostáva relačná: PostgreSQL, MySQL, Oracle, MS SQL. Keď si tu osvojíš SQL, dokážeš sebavedomo čítať dáta vo veľmi rôznych firmách.

QUERY: Každému archívu jeho práca: jednému rýchlosť, druhému flexibilita, tretiemu analytika. My dvaja sme mali šťastie: dostali sme ten, v ktorom je všetko prepojené so všetkým.

Tmavá galéria zhasnutých archívov starej Zeme rozličných tvarov; na jej konci sa celá rozžiari relačná holograma z prepojených tabuliek
Úložiská bývajú rôzne: kľúč-hodnota, dokumenty, stĺpce. Naša zachovaná snímka je relačná: tabuľky a väzby.

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.

Register rodín: rozobrané do detailov

Register za sklom je dôvod rozobrať rodiny databáz naozaj poriadne: «aké druhy databáz existujú a kedy ktorú zvoliť» je jedna z najčastejších otázok na pohovoroch. Prejdeme päť rodín za sebou a každú podľa rovnakej schémy: spôsob ukladania, silné a slabé stránky, produkty a kedy ju zvoliť.

Relačné databázy: prísna schéma a väzby

Spôsob ukladania: riadky v tabuľkách s vopred deklarovanou schémou — každý stĺpec má typ, medzi tabuľkami platia väzby cez kľúče a sama stráži integritu: objednávku od neexistujúceho zákazníka zapísať nepôjde. Zmeny sa vykonávajú transakciami so zárukami — «objednávka + odpis zo skladu» sa buď zapíšu spolu, alebo vôbec.

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
Relačná databáza je vo svojej podstate tabuľka: riadky-záznamy a stĺpce s vlastným typom. Väzby cez kľúče sa pridávajú navrch a tabuľka môže byť aj jediná.
usersidnameproductsidtitleordersiduser_idproduct_idFK → PKproducts · banking · ordersPostgreSQL · MySQL
A keď je tabuliek viac — prepoja sa kľúčmi: prísna schéma a väzby medzi tabuľkami.
  • Silné stránky: výrazný jazyk SQL (filtre, spájanie tabuliek, agregáty), integrita na úrovni databázy, transakcie.
  • Slabé: schému treba premyslieť vopred a pri zmenách migrovať; horizontálne škálovanie na mnoho serverov je ťažšie než pri rodinách .
  • Produkty: PostgreSQL, MySQL/MariaDB, Microsoft SQL Server, Oracle, SQLite.
  • Kedy zvoliť: používatelia, objednávky, peniaze, sklad — všade, kde sú dáta prepojené a chyba zápisu je neprípustná. Pre nový produkt je to predvolená voľba.

Databázy kľúč-hodnota: slovník na maximálnej rýchlosti

Spôsob ukladania: jeden obrovský slovník «kľúč → hodnota», najčastejšie v operačnej pamäti. Žiadne tabuľky, žiadne väzby: vložil podľa kľúča — vytiahol podľa kľúča za zlomok milisekundy.

-- Toto nie je SQL, sú to príkazy Redisu
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
Kľúč-hodnota: okamžitý prístup podľa presného kľúča — a žiadne dotazy «podľa obsahu».
  • Silné stránky: rýchlosť, jednoduchosť, ľahké škálovanie.
  • Slabé: dotazy len podľa presného kľúča — otázku «nájdi všetky relácie zákazníkov z Moskvy» tomuto formátu nepoložíš; vnútro hodnoty je pre databázu nepriehľadné.
  • Produkty: Redis, Memcached, Amazon DynamoDB.
  • Kedy zvoliť: cache, relácie, počítadlá, fronty, rebríčky — horúce dáta vedľa hlavnej databázy, nie namiesto nej.

Dokumentové databázy: flexibilný JSON

Spôsob ukladania: záznamy sú dokumenty zoskupené do kolekcií. Schéma sa nedeklaruje vopred: smart hodinky majú pole «výdrž batérie», mikina «tabuľku veľkostí» a oba dokumenty pokojne ležia v jednej kolekcii. Vnorené štruktúry sa uchovávajú priamo vnútri dokumentu, bez samostatných tabuliek.

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
Dokumentový model: flexibilné JSON dokumenty s rôznou sadou polí žijú v jednej kolekcii.
  • Silné stránky: flexibilná štruktúra, dokument sa prečíta celý jediným prístupom, hodí sa pre katalógy s rôznorodými atribútmi a rýchle prototypy.
  • Slabé: väzby medzi dokumentmi sú starosťou aplikácie, plnohodnotný takmer nie je; bez disciplíny sa z kolekcie stane zverinec nekompatibilných formátov.
  • Produkty: MongoDB, Couchbase, Firestore.
  • Kedy zvoliť: obsah, katalógy so silno odlišnými poľami, profily a nastavenia.

Hranica medzi rodinami je mimochodom rozmazaná: PostgreSQL vie uchovávať dokumenty v stĺpci typu jsonb a budovať nad nimi indexy — to často pokryje «dokumentovú» potrebu bez druhej databázy:

-- Príklad mimo našej snímky: attrs — stĺpec typu jsonb
SELECT name, attrs->>'color' AS color
FROM catalog
WHERE attrs @> '{"brand": "Kotomarket"}';

Stĺpcové databázy: analytika nad miliardami riadkov

Spôsob ukladania: hodnoty neležia po riadkoch, ale po stĺpcoch: všetky ceny vedľa seba, všetky dátumy vedľa seba. Dotaz «priemerný účet po mesiacoch» číta z disku len dva stĺpce namiesto celej tabuľky a rovnaké hodnoty sa skvele komprimujú. Odtiaľ pochádza rýchlosť pri agregátoch.

-- Obľúbený žáner stĺpcovej databázy (dialekt ClickHouse: toYYYYMM je jeho funkcia)
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
Stĺpcové ukladanie: agregát číta z disku len potrebné stĺpce, nie celú tabuľku po riadkoch.
  • Silné stránky: agregáty a skenovanie miliárd riadkov, silná kompresia.
  • Slabé: bodové aktualizácie a mazania sú drahé; prečítať jeden riadok celý je pomalšie než v riadkovej databáze; transakčná záťaž — na takú záťaž nie sú určené.
  • Produkty: ClickHouse, BigQuery, Snowflake, Amazon Redshift.
  • Kedy zvoliť: analytika, reporty, udalosti, logy, metriky — zvyčajne vedľa «bojovej» relačnej databázy.

A hneď tu pár pojmov, ktoré majú na pohovoroch radi: (online processing — veľa krátkych operácií zápisu a čítania, svet PostgreSQL) a (online analytical processing — ťažké analytické čítania naprieč celou históriou, svet ClickHouse). Produkt zapisuje do OLTP databázy, analytika číta OLAP kópiu.

A posledná rodina — grafové databázy

Keď sú väzby dôležitejšie než samotné záznamy — «priatelia priateľov», doručovacie trasy, reťazce odporúčaní — siahne sa po grafových databázach (Neo4j, Memgraph). Dáta v nich sú uzly (to sú záznamy) a hrany (to sú väzby medzi záznamami); prechod väzbami ľubovoľnej hĺbky je rodná operácia. V relačnej databáze je taký prechod schodisko zo spájania tabuliek, ktoré s hĺbkou ťažkne.

friendAnnBobCaraDanEvenodes are records, edges are links; "friends of friends" = two edges away
Graf: krúžky-uzly sú záznamy (napríklad ľudia), čiary-hrany sú väzby medzi nimi. «Priatelia priateľov» je len prechod po hranách.

Mini-návod: ako vybrať databázu pre projekt

  1. Začni otázkami, nie dátami. Aké dotazy bude produkt klásť: bodové «podľa kľúča», súvislé «kto čo kúpil», analytické «koľko za mesiac»?
  2. Predvolene — relačná. Prepojené dáta plus cena chyby (objednávky, platby, zostatky) — to je PostgreSQL. Najbezpečnejší štart takmer pre každý produkt.
  3. Špecializované databázy — na konkrétnu úlohu, nie «do zásoby». Tlačia horúce čítania — pridaj cache na Redise. Narástla analytika — replikuj udalosti do ClickHouse. Divoká rozmanitosť polí — najprv jsonb v PostgreSQL a až keď nebude stačiť — dokumentová databáza.
  4. Počítaj cenu druhej databázy. Každá nová znamená synchronizáciu dát, zálohy, monitoring a ďalšiu technológiu, ktorú musí tím udržiavať.

Pasca: vyberať databázu «podľa módy». «Zoberieme MongoDB — bez schémy je to rýchlejšie» sa skončí tak, že schému aj tak navrhneš, len teraz jej pravidlá žijú v kóde aplikácie, a nie pod ochranou databázy. Opačná pasca sa tiež vyskytuje: ťahať ClickHouse na objemy, ktoré PostgreSQL zagreguje za milisekundy. Databáza sa vyberá podľa povahy dotazov a ceny chyby — nie podľa hype.

ClickHouse je stĺpcová pre analytiku: ľudia ju majú radi pre rýchle výpočty nad veľkými tabuľkami udalostí a objednávok. Má vlastný dialekt SQL; na platforme je samostatný tréner na ClickHouse. Naša snímka je však relačná: ďalej QUERY otvára súpis a ukazuje, z čoho je poskladaná — tabuľky, riadky a nite-kľúče medzi nimi.

Interview question

Otázka z pohovoru: aké typy databáz poznáš a ako by si vybral úložisko pre novú službu?

Silná odpoveď: relačné (PostgreSQL, MySQL) — prísna schéma, väzby, transakcie; kľúč-hodnota (Redis) — cache, relácie, počítadlá; dokumentové (MongoDB) — flexibilné dokumenty; stĺpcové (ClickHouse, BigQuery) — analytika nad veľkými objemami; grafové (Neo4j) — hlboké väzby. Pri výbere idem od povahy dotazov: zdrojom pravdy robím relačnú databázu a špecializované pripájam na konkrétnu úlohu (cache, analytika), nie namiesto nej.

Doplňujúca otázka: čím sa líši od ?

Silná odpoveď: OLTP — veľa krátkych transakcií zápisu a čítania (vytváranie objednávok), riadkové ako PostgreSQL; OLAP — ťažké analytické čítania a agregáty nad históriou, stĺpcové DBMS ako ClickHouse. Často pracujú v páre: produkt zapisuje do OLTP, analytika číta OLAP repliku.

Check yourself
Aký typ databázy sa zvyčajne vyberá pre analytiku veľkých objemov dát?