Adatbázisok ködök nélkül

Milyen adatbázisok léteznek

18 min
What you'll learn
  • megkülönböztetni az adatbázisok öt családját — relációs, kulcs-érték, dokumentum, oszlopos, gráf — a tárolás módja és a tipikus feladataik szerint
  • a lekérdezések jellegéhez illő tárolót választani: alapértelmezésben relációs adatbázist, a Redist/MongoDB-t/ClickHouse-t pedig egy-egy konkrét feladatra, nem „divatból”
  • elmagyarázni az és az közötti különbséget, és hogy a termék miért a PostgreSQL-be ír, miközben az elemzés egy oszlopos replikából olvas
  • felismerni azt a „dokumentumszerű” igényt, amelyet a PostgreSQL jsonb oszlopa egy második adatbázis nélkül is lefed

A jegyzék felé tartva a QUERY lelassít a raktár egyik sötét szekciójánál. Az üveg mögött a régi Föld archívumainak nyilvántartása, azoké, amelyek nem élték túl a Nagy Szakadást: a gyorsítótár-csomópontok hunytak ki elsőként, a dokumentumtárolók szakadt töredékekben érkeztek meg, az elemzési fürtök egész szektorokon át hallgatnak. A „Kotomarket” relációs pillanatképe viszont épségben maradt fenn — minden kapcsolatával együtt.

Nemcsak relációsak

A „Kotomarket”-hez különösen jól jönnek a relációs adatbázisok: a vásárlók, a rendelések és a termékek természetesen rendeződnek kapcsolatokkal összekötött táblákba. Pontosan ezekről szól ez a kurzus. De az iparágban — akár 2024-ben, akár ma — más megközelítésekkel is találkozol:

  • kulcs-érték (Redis) — nagyon gyors „kulcs → érték” formátum, amikor egy egyszerű rekordot kell azonnal előhúzni;
  • dokumentumorientált (MongoDB) — rugalmas -dokumentumokat tárol, amelyek szerkezete rekordról rekordra eltérhet;
  • oszlopos (ClickHouse) — erős az elemzésben, amikor hatalmas adatmennyiségen kell gyorsan mutatókat számolni.

A termékfejlesztéshez használt népszerű -ek többsége relációs marad: PostgreSQL, MySQL, Oracle, MS SQL. Ha itt elsajátítod az SQL-t, nagyon különböző cégeknél is magabiztosan tudsz majd adatokat olvasni.

QUERY: Minden archívumnak megvan a maga dolga: az egyiknek a sebesség, a másiknak a rugalmasság, a harmadiknak az elemzés. Nekünk szerencsénk volt: az jutott nekünk, amelyben minden mindennel össze van kötve.

Kihunyt, különböző formájú régi földi archívumok sötét galériája; a végén épségben világít egy relációs hologram összekapcsolt táblákból
A tárolók sokfélék lehetnek: kulcs-érték, dokumentum, oszlopos. A mi fennmaradt pillanatképünk relációs: táblák és kapcsolatok.

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.

A családok nyilvántartása: polcokra rendezve

Az üveg mögötti nyilvántartás jó alkalom arra, hogy komolyan szétszedjük az adatbázis-családokat: a „milyen adatbázisok léteznek, és mikor melyiket válasszuk” az egyik leggyakoribb interjúkérdés. Sorra vesszük az öt családot, mindegyiket ugyanazon séma szerint: a tárolás módja, erős és gyenge oldalak, termékek, és mikor érdemes választani.

Relációs adatbázisok: szigorú séma és kapcsolatok

A tárolás módja: sorok táblákban, előre deklarált sémával — minden oszlopnak van típusa, a táblák között kulcsok mentén futnak kapcsolatok, és a maga őrzi az integritást: nem létező vásárlótól nem lehet rendelést rögzíteni. A változtatások tranzakciókként, -garanciákkal hajtódnak végre — a „rendelés + a készlet csökkentése” vagy együtt rögzül, vagy egyáltalán nem.

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
A relációs adatbázis alapja egy tábla: sorok-rekordok és saját típusú oszlopok. A kulcsok menti kapcsolatok efölé épülnek, és akár egyetlen tábla is lehet.
usersidnameproductsidtitleordersiduser_idproduct_idFK → PKproducts · banking · ordersPostgreSQL · MySQL
Ha pedig több tábla van — kulcsok kötik őket össze: szigorú séma és kapcsolatok a táblák között.
  • Erős oldalak: kifejező SQL (szűrők, táblák összekapcsolása, aggregátumok), adatbázis-szintű integritás, tranzakciók.
  • Gyenge oldalak: a sémát előre át kell gondolni, és változáskor migrálni; a vízszintes, sok szerverre való skálázás nehezebben megy, mint a -családoknál.
  • Termékek: PostgreSQL, MySQL/MariaDB, Microsoft SQL Server, Oracle, SQLite.
  • Mikor érdemes választani: felhasználók, rendelések, pénz, raktár — mindenhol, ahol az adatok kapcsolódnak, és egy hibás írás megengedhetetlen. Új termékhez ez az alapértelmezett választás.

Kulcs-érték adatbázisok: szótár maximális sebességen

A tárolás módja: egyetlen óriási „kulcs → érték” szótár, legtöbbször a memóriában. Sem táblák, sem kapcsolatok: kulcs alapján beteszed — kulcs alapján kiveszed, ezredmásodperc töredéke alatt.

-- Ez nem SQL, ezek Redis-parancsok
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
Kulcs-érték: azonnali hozzáférés pontos kulcs alapján — és semmilyen lekérdezés „tartalom szerint”.
  • Erős oldalak: sebesség, egyszerűség, könnyű skálázhatóság.
  • Gyenge oldalak: lekérdezés csak pontos kulcs alapján — a „keresd meg az összes moszkvai vásárló munkamenetét” kérdést ennek a formátumnak nem lehet feltenni; az érték belseje az adatbázis számára átláthatatlan.
  • Termékek: Redis, Memcached, Amazon DynamoDB.
  • Mikor érdemes választani: gyorsítótár, munkamenetek, számlálók, sorok, ranglisták — forró adatok a fő adatbázis mellett, nem helyette.

Dokumentumadatbázisok: rugalmas JSON

A tárolás módja: a rekordok -dokumentumok, gyűjteményekbe csoportosítva. A séma nincs előre deklarálva: az okosóránál van „akkumulátor-üzemidő” mező, a kapucnis pulóvernél „mérettáblázat”, és mindkét dokumentum nyugodtan megfér egyazon gyűjteményben. A beágyazott szerkezetek közvetlenül a dokumentumon belül tárolódnak, külön táblák nélkül.

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
A dokumentummodell: különböző mezőkészletű, rugalmas JSON-dokumentumok élnek egyazon gyűjteményben.
  • Erős oldalak: rugalmas szerkezet, a dokumentum egyetlen lekéréssel, egészben olvasható, kényelmes a heterogén attribútumú katalógusokhoz és a gyors prototípusokhoz.
  • Gyenge oldalak: a dokumentumok közötti kapcsolatok az alkalmazás gondja, teljes értékű szinte nincs; fegyelem nélkül a gyűjtemény összeférhetetlen formátumok állatkertjévé válik.
  • Termékek: MongoDB, Couchbase, Firestore.
  • Mikor érdemes választani: tartalom, erősen eltérő mezőjű katalógusok, profilok és beállítások.

A családok határa egyébként elmosódott: a PostgreSQL képes dokumentumokat tárolni egy jsonb típusú oszlopban, és indexeket építeni rájuk — ez gyakran lefedi a „dokumentumszerű” igényt egy második adatbázis nélkül:

-- Példa a pillanatképünkön kívülről: az attrs egy jsonb típusú oszlop
SELECT name, attrs->>'color' AS color
FROM catalog
WHERE attrs @> '{"brand": "Kotomarket"}';

Oszlopos adatbázisok: elemzés milliárdnyi soron

A tárolás módja: az értékek nem soronként, hanem oszloponként fekszenek: minden ár egymás mellett, minden dátum egymás mellett. A „havi átlagos kosárérték” lekérdezés a teljes tábla helyett csak két oszlopot olvas be a lemezről, az egynemű értékek pedig kiválóan tömöríthetők. Innen a sebesség az aggregátumokon.

-- Az oszlopos adatbázis kedvenc műfaja (ClickHouse-dialektus: a toYYYYMM az ő függvénye)
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
Oszlopos tárolás: az aggregátum csak a szükséges oszlopokat olvassa be a lemezről, nem az egész táblát soronként.
  • Erős oldalak: aggregátumok és milliárdnyi sor átfésülése, erős tömörítés.
  • Gyenge oldalak: a pontszerű frissítések és törlések drágák; egyetlen sort egészben kiolvasni lassabb, mint egy soros adatbázisban; a tranzakciós terhelésre egyszerűen nem ezeket tervezték.
  • Termékek: ClickHouse, BigQuery, Snowflake, Amazon Redshift.
  • Mikor érdemes választani: elemzés, riportok, események, naplók, mutatók — rendszerint az „éles” relációs adatbázis mellett.

Itt mindjárt két fogalom is, amelyeket szeretnek az interjúkon: (online processing — sok rövid írási és olvasási művelet, a PostgreSQL világa) és (online analytical processing — nehéz, a teljes előzményt átfogó elemzési olvasások, a ClickHouse világa). A termék az OLTP-adatbázisba ír, az elemzés az OLAP-másolatból olvas.

És az utolsó család — a gráfadatbázisok

Amikor a kapcsolatok fontosabbak maguknál a rekordoknál — „barátok barátai”, szállítási útvonalak, ajánlási láncok —, gráfadatbázisokat választanak (Neo4j, Memgraph). Bennük az adatok csomópontok (ezek a rekordok) és élek (ezek a rekordok közötti kapcsolatok); a tetszőleges mélységű kapcsolatbejárás itt natív művelet. Egy relációs adatbázisban ugyanez a bejárás táblaösszekapcsolások lépcsője, amely a mélységgel egyre nehezebbé válik.

friendAnnBobCaraDanEvenodes are records, edges are links; "friends of friends" = two edges away
Gráf: a kör-csomópontok a rekordok (például emberek), a vonal-élek a köztük lévő kapcsolatok. A „barátok barátai” egyszerűen az éleken való átlépés.

Miniútmutató: hogyan válassz adatbázist a projekthez

  1. A kérdésekből indulj ki, ne az adatokból. Milyen lekérdezéseket fog feltenni a termék: pontszerűeket „kulcs szerint”, kapcsolódókat „ki mit vett”, elemzőket „mennyi volt egy hónap alatt”?
  2. Alapértelmezésben relációs. Kapcsolódó adatok plusz a hiba ára (rendelések, fizetések, készletek) — ez a PostgreSQL. A legbiztonságosabb indulás szinte bármilyen termékhez.
  3. A specializált adatbázisok egy-egy konkrét feladatra valók, nem „tartalékba”. Szorítanak a forró olvasások — tégy mellé egy Redis-gyorsítótárat. Megnőtt az elemzés — replikáld az eseményeket a ClickHouse-ba. Vadul változó mezők — előbb jsonb a PostgreSQL-ben, és csak ha az már nem elég — dokumentumadatbázis.
  4. Számold ki egy második adatbázis árát. Minden új adatszinkronizációt, biztonsági mentéseket, monitorozást és még egy technológiát jelent, amelyet a csapatnak karban kell tartania.

Buktató: „divatból” választani adatbázist. A „Vegyünk MongoDB-t — séma nélkül gyorsabb” azzal végződik, hogy a sémát úgyis megtervezed, csak most az alkalmazás kódjában élnek a szabályai, nem az adatbázis védelme alatt. A fordított buktató is előfordul: ClickHouse-t cipelni olyan mennyiségekhez, amelyeket a PostgreSQL ezredmásodpercek alatt aggregál. Az adatbázist a lekérdezések jellegéhez és a hiba árához választják — nem a hype-hoz.

A ClickHouse oszlopos az elemzéshez: azért szeretik, mert gyorsan számol nagy esemény- és rendeléstáblákon. Saját SQL-dialektusa van; a platformon külön ClickHouse-tréner is található. A mi pillanatképünk viszont relációs: a QUERY ezután megnyitja a jegyzéket, és megmutatja, miből áll össze — táblákból, sorokból és a köztük futó kulcs-fonalakból.

Interview question

Interjúkérdés: milyen adatbázistípusokat ismersz, és hogyan választanál tárolót egy új szolgáltatáshoz?

Erős válasz: relációs (PostgreSQL, MySQL) — szigorú séma, kapcsolatok, -tranzakciók; kulcs-érték (Redis) — gyorsítótár, munkamenetek, számlálók; dokumentum (MongoDB) — rugalmas -dokumentumok; oszlopos (ClickHouse, BigQuery) — elemzés nagy mennyiségeken; gráf (Neo4j) — mély kapcsolatok. A választásban a lekérdezések jellegéből indulok ki: az igazság forrásává a relációs adatbázist teszem, a specializáltakat pedig egy-egy konkrét feladatra (gyorsítótár, elemzés) kapcsolom be, nem helyette.

Kiegészítő kérdés: mi a különbség az és az között?

Erős válasz: az OLTP sok rövid írási és olvasási tranzakció (rendelésleadás), soros -ekkel, mint a PostgreSQL; az OLAP nehéz elemzési olvasások és aggregátumok az előzményen, oszlopos DBMS-ekkel, mint a ClickHouse. Gyakran párban dolgoznak: a termék az OLTP-be ír, az elemzés az OLAP-replikából olvas.

Check yourself
Melyik adatbázistípust választják általában nagy adatmennyiségek elemzéséhez?