Bazy danych bez tajemnic

Jakie są rodzaje baz danych

18 min
What you'll learn
  • odróżniać pięć rodzin baz danych — relacyjne, klucz-wartość, dokumentowe, kolumnowe, grafowe — po sposobie przechowywania i typowych zastosowaniach
  • dobierać magazyn do charakteru zapytań: relacyjna baza domyślnie, Redis/MongoDB/ClickHouse — do konkretnych zadań, a nie „bo modne”
  • wyjaśniać różnicę między a i po co aplikacja produktowa zapisuje dane do PostgreSQL, a analityka czyta kolumnową replikę
  • rozpoznawać „dokumentową” potrzebę, którą da się zaspokoić kolumną jsonb w PostgreSQL bez stawiania drugiej bazy

W drodze do inwentarza QUERY przystaje przy ciemnej sekcji magazynu. Za szybą — rejestr archiwów starej Ziemi, które nie przetrwały Wielkiego Zerwania: węzły pamięci podręcznej zgasły jako pierwsze, magazyny dokumentowe ocalały tylko w postrzępionych fragmentach, klastry analityczne milczą całymi sektorami. A relacyjna migawka „Kotomarketu” przetrwała w całości — ze wszystkimi powiązaniami.

Nie tylko relacyjne

Dla „Kotomarketu” szczególnie wygodne są bazy relacyjne: kupujący, zamówienia i towary naturalnie układają się w tabele z powiązaniami. To właśnie im poświęcony jest kurs. Ale w branży — zarówno w 2024 roku, jak i dziś — spotyka się także inne podejścia:

  • klucz-wartość (Redis) — bardzo szybki format „klucz → wartość”, gdy trzeba błyskawicznie pobrać prosty rekord;
  • dokumentowe (MongoDB) — przechowują elastyczne dokumenty , których struktura może różnić się między rekordami;
  • kolumnowe (ClickHouse) — świetne w analityce, gdy trzeba szybko liczyć wskaźniki na ogromnych ilościach danych.

Większość popularnych -ów w aplikacjach produktowych pozostaje relacyjna: PostgreSQL, MySQL, Oracle, MS SQL. Tutaj opanujesz SQL — i będziesz pewnie czytać dane w bardzo różnych firmach.

QUERY: Każde archiwum ma swoją robotę: jedno daje szybkość, drugie elastyczność, trzecie analitykę. My mieliśmy szczęście: trafiło nam się to, w którym wszystko łączy się ze wszystkim.

Ciemna galeria zgasłych archiwów starej Ziemi o różnych kształtach; na jej końcu w całości świeci relacyjny hologram z połączonych tabel
Magazyny bywają różne: klucz-wartość, dokumenty, kolumny. Nasza ocalała migawka jest relacyjna: tabele i powiązania.

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.

Rejestr rodzin: porządek na półkach

Rejestr za szybą to dobry pretekst, żeby na poważnie zająć się rodzinami baz danych. „Jakie są rodzaje baz i kiedy którą wybrać” to jedno z najczęstszych pytań na rozmowach kwalifikacyjnych. Przejdziemy przez pięć rodzin po kolei, a każdą według tego samego schematu: sposób przechowywania, mocne i słabe strony, produkty oraz sytuacje, w których warto po nią sięgnąć.

Bazy relacyjne: ścisły schemat i powiązania

Sposób przechowywania: wiersze w tabelach o z góry zadeklarowanym schemacie — każda kolumna ma typ, między tabelami działają powiązania po kluczach, a sam strzeże spójności: zamówienia od nieistniejącego kupującego nie da się zapisać. Zmiany wykonywane są jako transakcje z gwarancjami — „zamówienie + odpisanie stanu magazynu” zapisują się razem albo wcale.

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
Baza relacyjna opiera się na tabelach: wierszach-rekordach i kolumnach z własnym typem. Powiązania po kluczach mogą łączyć wiele tabel, ale sama tabela też jest pełnoprawnym elementem modelu.
usersidnameproductsidtitleordersiduser_idproduct_idFK → PKproducts · banking · ordersPostgreSQL · MySQL
Gdy tabel jest kilka, łączą się kluczami: ścisły schemat i powiązania między tabelami.
  • Mocne strony: bogaty SQL (filtry, łączenia tabel, agregaty), spójność na poziomie bazy, transakcje.
  • Słabe strony: schemat trzeba przemyśleć z góry i migrować przy zmianach; skalowanie poziome na wiele serwerów jest trudniejsze niż w rodzinach .
  • Produkty: PostgreSQL, MySQL/MariaDB, Microsoft SQL Server, Oracle, SQLite.
  • Kiedy wybrać: użytkownicy, zamówienia, płatności, magazyn — wszędzie tam, gdzie dane są powiązane, a błąd zapisu jest niedopuszczalny. Dla nowego produktu to wybór domyślny.

Bazy klucz-wartość: słownik na maksymalnej prędkości

Sposób przechowywania: jeden gigantyczny słownik „klucz → wartość”, najczęściej trzymany w pamięci operacyjnej. Bez tabel i bez powiązań: zapisujesz coś pod kluczem, odczytujesz po kluczu w ułamku milisekundy.

-- To nie SQL, to polecenia Redis
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
Klucz-wartość: natychmiastowy dostęp po dokładnym kluczu — i żadnych zapytań „po zawartości”.
  • Mocne strony: szybkość, prostota, łatwe skalowanie.
  • Słabe strony: zapytania tylko po dokładnym kluczu — pytania „znajdź wszystkie sesje kupujących z Moskwy” temu formatowi nie zadasz; baza nie widzi wnętrza wartości.
  • Produkty: Redis, Memcached, Amazon DynamoDB.
  • Kiedy wybrać: pamięć podręczna, sesje, liczniki, kolejki, rankingi — gorące dane obok głównej bazy, a nie zamiast niej.

Bazy dokumentowe: elastyczny JSON

Sposób przechowywania: rekordy są dokumentami pogrupowanymi w kolekcje. Schemat nie jest deklarowany z góry: smartwatch ma pole „czas pracy baterii”, bluza — „tabelę rozmiarów”, a oba dokumenty mogą spokojnie leżeć w jednej kolekcji. Struktury zagnieżdżone przechowuje się bezpośrednio w dokumencie, bez osobnych tabel.

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
Model dokumentowy: elastyczne dokumenty JSON o różnym zestawie pól żyją w jednej kolekcji.
  • Mocne strony: elastyczna struktura, możliwość odczytania całego dokumentu jednym odwołaniem, wygoda przy katalogach o różnorodnych atrybutach i przy szybkich prototypach.
  • Słabe strony: powiązania między dokumentami trzeba obsłużyć w aplikacji, pełnoprawnych -ów prawie nie ma; bez dyscypliny kolekcja szybko zamienia się w zbiór niezgodnych formatów.
  • Produkty: MongoDB, Couchbase, Firestore.
  • Kiedy wybrać: treść, katalogi o mocno różniących się polach, profile i ustawienia.

Granica między rodzinami jest zresztą rozmyta: PostgreSQL potrafi przechowywać dokumenty w kolumnie typu jsonb i budować na nich indeksy — często wystarcza to do zaspokojenia „dokumentowej” potrzeby bez drugiej bazy:

-- Przykład spoza naszej migawki: attrs — kolumna typu jsonb
SELECT name, attrs->>'color' AS color
FROM catalog
WHERE attrs @> '{"brand": "Kotomarket"}';

Bazy kolumnowe: analityka po miliardach wierszy

Sposób przechowywania: wartości leżą nie wierszami, lecz kolumnami: wszystkie ceny obok siebie, wszystkie daty obok siebie. Zapytanie „średni rachunek wg miesięcy” czyta z dysku tylko dwie kolumny zamiast całej tabeli, a jednorodne wartości świetnie się kompresują. Stąd szybkość przy agregatach.

-- Ulubiony gatunek bazy kolumnowej (dialekt ClickHouse: toYYYYMM to jego funkcja)
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
Przechowywanie kolumnowe: agregat czyta z dysku tylko potrzebne kolumny, zamiast skanować całą tabelę wiersz po wierszu.
  • Mocne strony: agregaty i skanowanie miliardów wierszy, silna kompresja.
  • Słabe strony: punktowe aktualizacje i usunięcia są kosztowne; odczytanie jednego pełnego wiersza jest wolniejsze niż w bazie wierszowej; do obciążeń transakcyjnych nie są przeznaczone.
  • Produkty: ClickHouse, BigQuery, Snowflake, Amazon Redshift.
  • Kiedy wybrać: analityka, raporty, zdarzenia, logi, metryki — zwykle obok „bojowej” bazy relacyjnej.

Tu pojawiają się dwa terminy, które często padają na rozmowach kwalifikacyjnych: (online processing — dużo krótkich operacji zapisu i odczytu, świat PostgreSQL) oraz (online analytical processing — ciężkie analityczne odczyty po całej historii, świat ClickHouse). Produkt zapisuje dane do bazy OLTP, a analityka czyta kopię OLAP.

I ostatnia rodzina — bazy grafowe

Gdy powiązania są ważniejsze niż same rekordy — „znajomi znajomych”, trasy dostaw, łańcuchy rekomendacji — sięga się po bazy grafowe (Neo4j, Memgraph). Dane w nich to węzły (czyli rekordy) i krawędzie (czyli powiązania między rekordami); przechodzenie po powiązaniach dowolnej głębokości jest tam naturalną operacją. W bazie relacyjnej takie przejście oznacza drabinkę łączeń tabel, która z każdym poziomem robi się coraz cięższa.

friendAnnBobCaraDanEvenodes are records, edges are links; "friends of friends" = two edges away
Graf: kółka-węzły to rekordy (na przykład ludzie), linie-krawędzie to powiązania między nimi. „Znajomi znajomych” to po prostu przejście po krawędziach.

Mini-przewodnik: jak wybrać bazę pod projekt

  1. Zacznij od pytań, a nie od danych. Jakie zapytania będzie zadawał produkt: punktowe „po kluczu”, powiązane „kto co kupił”, analityczne „ile w ciągu miesiąca”?
  2. Domyślnie — relacyjna. Powiązane dane plus wysoka cena błędu (zamówienia, płatności, stany magazynowe) — to PostgreSQL. Najbezpieczniejszy start dla niemal każdego produktu.
  3. Bazy wyspecjalizowane — pod konkretne zadanie, a nie „na zapas”. Masz gorące odczyty — dodaj pamięć podręczną na Redis. Urosła analityka — replikuj zdarzenia do ClickHouse. Pola są bardzo zmienne — najpierw jsonb w PostgreSQL, a dopiero gdy go zabraknie, baza dokumentowa.
  4. Licz koszt drugiej bazy. Każdy nowy to synchronizacja danych, kopie zapasowe, monitoring i kolejna technologia, którą zespół musi utrzymywać.

Pułapka: wybierać bazę „bo modna”. „Weźmy MongoDB — bez schematu będzie szybciej” często kończy się tym, że schemat i tak się projektuje, tylko jego reguły żyją teraz w kodzie aplikacji, a nie pod ochroną bazy. Odwrotna pułapka też się zdarza: wyciągać ClickHouse do wolumenów, które PostgreSQL agreguje w milisekundy. Bazę dobiera się pod charakter zapytań i cenę błędu — nie pod hype.

ClickHouse to kolumnowy do analityki: ceniony za szybkie obliczenia na dużych tabelach zdarzeń i zamówień. Ma własny dialekt SQL; na platformie jest osobny trenażer z ClickHouse. A nasza migawka jest relacyjna: dalej QUERY otwiera inwentarz i pokazuje, z czego się składa — tabele, wiersze i nici-klucze między nimi.

Interview question

Pytanie z rozmowy kwalifikacyjnej: jakie typy baz danych znasz i jak wybierzesz magazyn dla nowej usługi?

Mocna odpowiedź: relacyjne (PostgreSQL, MySQL) — ścisły schemat, powiązania, transakcje ; klucz-wartość (Redis) — pamięć podręczna, sesje, liczniki; dokumentowe (MongoDB) — elastyczne dokumenty ; kolumnowe (ClickHouse, BigQuery) — analityka na dużych wolumenach danych; grafowe (Neo4j) — głębokie powiązania. Wybór zaczynam od charakteru zapytań: źródłem prawdy robię bazę relacyjną, a wyspecjalizowane bazy podłączam do konkretnych zadań (pamięć podręczna, analityka), nie zamiast niej.

Pytanie dodatkowe: czym różni się od ?

Mocna odpowiedź: OLTP — dużo krótkich transakcji zapisu i odczytu (składanie zamówień), wierszowe -y takie jak PostgreSQL; OLAP — ciężkie analityczne odczyty i agregaty po historii, kolumnowe DBMS-y takie jak ClickHouse. Często pracują w parze: produkt zapisuje dane do OLTP, a analityka czyta replikę OLAP.

Check yourself
Jaki typ bazy zwykle wybiera się do analityki dużych ilości danych?