Typy databází NoSQL: dokumentové, klíč–hodnota a grafové modely

Typy NoSQL databází: Dokumentové, klíč-hodnota a grafové modely

Proč NoSQL a jaké typy dnes dominují

NoSQL označuje rodinu databázových systémů navržených pro horizontální škálování, vysokou dostupnost a flexibilní schéma. Zatímco relační databáze (SQL) kladou důraz na pevná schémata a silnou konzistenci, NoSQL nabízí alternativní datové modely a kompromisy (CAP) vhodné pro moderní distribuované aplikace. Tento článek se zaměřuje na tři nejrozšířenější kategorie: dokumentové, klíč–hodnota a grafové databáze.

Teorie CAP a typické profily konzistence

  • CAP: V prostředí, kde může dojít k rozdělení sítě, nelze současně maximalizovat konzistenci (C) i dostupnost (A). Systémy volí mezi CP (upřednostňují konzistenci) a AP (upřednostňují dostupnost) podle oblasti použití.
  • Konzistence: silná (linearizovatelná), eventualní, kauzální; některé systémy umožňují zvolit úroveň čtení/zápisu pro každou operaci.
  • ACID vs. BASE: NoSQL často nabízí lokální ACID (na úrovni dokumentu/klíče/partice) a BASE (eventual consistency) napříč clusterem. Mnohé platformy již podporují také vícedokumentové transakce s určitými omezeními.

Modelování dat v NoSQL: obecné principy

  • Denormalizace a agregáty: Data se často modelují kolem agregátů (např. objednávka se všemi položkami), aby se minimalizovaly operace napříč entitami.
  • Přístupové vzory > schéma: Návrh tabulek/kolekcí/klíčů vychází z dotazů a SLA (latence, propustnost), nikoli z ER diagramu.
  • Particionování: Volba distribučního klíče je zásadní pro rovnoměrné rozložení zátěže a minimalizaci přetížených uzlů.

Dokumentové databáze: definice a charakteristiky

Dokumentové systémy ukládají data jako samostatné dokumenty (JSON, BSON a podobné formáty) s flexibilním schématem. Dokument obvykle představuje agregát s vnořenými strukturami.

  • Datový model: hierarchický (objekty, pole, vnořené struktury), s možností používat v jedné kolekci různá schémata.
  • Dotazy: pokročilé dotazovací jazyky (filtry, projekce, agregace, pipelines); geolokační a textové vyhledávání, sekundární indexy.
  • Transakce: operace nad jedním dokumentem jsou obvykle atomické; moderní systémy často podporují vícedokumentové transakce v rámci jedné partice/šardu.
  • Škálování: horizontální (sharding) podle klíče (např. userId, tenantId); replikace s automatickým přepnutím při výpadku.
  • Případy použití: systémy pro správu obsahu, katalogy, e-commerce košíky a objednávky, protokoly událostí s pokročilým dotazováním, mobilní a IoT backendy.

Příklad dokumentu a indexace

{ "orderId": "A-10293", "customer": {"id": "C-77", "name": "Novák"}, "items": [ {"sku": "P-1", "qty": 2, "price": 199.0}, {"sku": "P-9", "qty": 1, "price": 499.0} ], "status": "shipped", "createdAt": "2025-10-01T10:22:15Z" } 
  • Indexy: složené (např. status, createdAt), TTL indexy pro data s omezenou životností, textové/geolokační indexy.
  • Agregace: pipeline (match → group → sort → project) pro analytiku nad provozními daty.

Typická volba technologií pro dokumentové databáze

  • Silné stránky: flexibilní schéma, pokročilé dotazování a indexace, dobrý kompromis mezi OLTP a jednodušší analýzou.
  • Limity: nákladnější spojování dokumentů, nutnost pečlivě zvolit shard klíč, omezení velikosti dokumentů a atomických operací.

Databáze klíč–hodnota: definice a charakteristiky

Databáze klíč–hodnota ukládají nestrukturované nebo binární hodnoty, k nimž se přistupuje prostřednictvím jedinečného klíče. Důraz kladou na extrémně nízkou latenci a jednoduchost operací.

  • Datový model: asociativní pole (mapa) distribuované napříč uzly; hodnota může být binární blob nebo strukturovaný objekt serializovaný aplikací.
  • Dotazy: typicky pouze operace podle klíče (GET/PUT/DELETE), případně vyhledávání podle prefixu či v intervalu u některých systémů.
  • Datové struktury: uložené v paměti (s perzistencí do protokolu/snímku) nebo na disku s LSM-tree; některé systémy podporují struktury jako hash, list, set a sorted set.
  • Škálování: horizontální pomocí konzistentního hashování; velmi vysoká propustnost (miliony požadavků za sekundu) při nízké latenci.
  • Případy použití: cache, úložiště relací, omezování rychlosti požadavků, fronty, žebříčky, příznaky funkcí, rychlé vyhledávání pro mikroslužby.

Příklad schématu klíčů a vzorů

user:123:profile -> JSON profil user:123:sessions -> set tokenů order:2025-10:seq -> čítač (INCR) rate:ip:1.2.3.4 -> sliding window token bucket 
  • Vzory: cache write-through/write-behind, cache-aside, distributed locks (s vědomím jejich omezení), počítadla, pub/sub.
  • Limity: složitější dotazy vyžadují sekundární indexaci (externí) nebo jiný systém; správa TTL a vytěsňování položek je klíčová pro předvídatelné chování.

Grafové databáze: definice a charakteristiky

Grafové databáze reprezentují data jako uzly (vrcholy) a hrany s vlastnostmi. Optimalizují procházení vztahů a dotazy, u nichž jsou struktura a hloubka propojení zásadní.

  • Model: property graph (uzly/hrany s vlastnostmi klíč–hodnota) nebo RDF (trojice subjekt–predikát–objekt).
  • Dotazovací jazyky: Gremlin, Cypher, GQL (sjednocující standard), SPARQL (pro RDF).
  • Indexy: indexy vlastností uzlů/hran; klíčová je reprezentace pomocí seznamu sousedů pro rychlé přechody mezi vrcholy.
  • Škálování: složité; dělení grafu na shardy je obtížné (edge-cut vs. vertex-cut). U rozsáhlých grafů se volí dotazy zohledňující rozdělení na oddíly (partition-aware) a replikace podgrafů.
  • Případy použití: doporučování (přátelé přátel), znalostní grafy, odhalování podvodů (spoluúčast), síťové/IT topologie, kmenová data se silnými vzájemnými vztahy.

Příklad dotazu v grafové databázi (Cypher)

MATCH (u:User {id: "U-1"})-[:BOUGHT]->(:Product)<-[:BOUGHT]-(peer:User) MATCH (peer)-[:BOUGHT]->(rec:Product) WHERE NOT (u)-[:BOUGHT]->(rec) RETURN rec, count(*) AS score ORDER BY score DESC LIMIT 10; 
  • Výhoda: přirozený zápis vícestupňových vztahů a vzorů.
  • Limity: náročnější horizontální škálování a složitější agregace než u sloupcových analytických systémů.

Srovnávací tabulka: dokumentové vs. klíč–hodnota vs. grafové

Aspekt Dokumentové Klíč–hodnota Grafové
Primární model Dokumenty JSON/BSON Mapa klíč → hodnota Uzly a hrany
Typické dotazy Filtry, agregace, sekundární indexy Vyhledávání podle klíče, TTL, počítadla Procházení vzorů a cest
Škálování Sharding podle klíče Konzistentní hashování, masivní počet požadavků za sekundu Obtížné, dotazy zohledňující rozdělení na oddíly
Konzistence Často konfigurovatelná (silná/eventualní) Silná na úrovni klíče, eventualní na úrovni clusteru Různá; často důraz na lokální ACID
Případy použití Obsah, e-shop, mobilní backend Cache, relace, metriky v reálném čase Doporučování, podvody, znalostní grafy

Konzistence a transakce napříč typy

  • Dokumentové: atomické operace na úrovni dokumentu; vícedokumentové transakce často s omezeními (např. v rámci kolekce/šardu).
  • Klíč–hodnota: linearizovatelnost na úrovni klíče; transakce napříč klíči obvykle nejsou podporovány nebo jsou nákladné.
  • Grafové: ACID v rámci jedné instance/repliky; v distribuovaném grafu je obtížné zachovat globální serializaci.

Indexace, optimalizace dotazů a výkon

  • Dokumentové: B-stromy, hash, text, geo; dotazy pokryté indexem, agregace nad statistikami uloženými po sloupcích (u některých systémů).
  • Klíč–hodnota: primárním indexem je klíč; sekundární indexy zajišťuje aplikace nebo doprovodné služby.
  • Grafové: indexy pro výchozí uzly; následný výkon závisí na hustotě hran a selektivitě vzoru.

Škálování a dostupnost: replikace a sharding

  • Replikace: architektura leader–followers s automatickým přepnutím při výpadku, případně více leaderů pro geograficky distribuované nasazení; grafové databáze někdy replikují podgrafy pro rychlé lokální čtení.
  • Sharding: u dokumentových databází a databází klíč–hodnota je přirozený; u grafových je náročný (minimalizace rozdělení hran, využití detekce komunit pro dělení na oddíly).

Bezpečnost a správa

  • Autentizace/autorizace: RBAC, šifrování při přenosu (TLS) i v klidu (TDE), audit přístupů.
  • Víceklientský provoz: oddělení klientů pomocí schémat/namespace, limity prostředků, kvóty, omezení rychlosti požadavků.
  • Životní cyklus dat: TTL/archivace, retenční zásady pro protokoly/události.

Návrhové vzory pro každou kategorii

  • Dokumentové: one-to-few embed, one-to-many reference (přes cizí klíče), bucket pattern pro časové řady, subset pattern pro často používaná pole.
  • Klíč–hodnota: složené klíče (prefix + ID), klíče rozdělené do časových intervalů, idempotentní zápisy pro opakované pokusy, distribuovaná počítadla s dělením na shardy.
  • Grafové: modelování typů uzlů a hran (štítky), směrování hran, vlastnosti s indexy, denormalizace odvozených vztahů pro časté dotazy.

Antivzory a časté chyby

  • Dokumentové: přerostlé dokumenty (megadokumenty), přetížený shard klíč (např. monotónní časové razítko), bezhlavé používání transakcí napříč shardy.
  • Klíč–hodnota: používání databáze klíč–hodnota pro ad hoc dotazy (bez indexů), nekontrolované TTL a vytěsňování položek, spoléhání na distribuované zámky bez pochopení způsobů selhání.
  • Grafové: dotazy s velkým rozsahem expanze bez omezení hloubky či selektivity, náhodné dělení grafu bez ohledu na strukturu komunit.

Volba technologie podle případu použití

  • Rychlé vyhledávání a cache → databáze klíč–hodnota (uložená v paměti s perzistencí).
  • Provozní data s pokročilým dotazováním → dokumentová databáze.
  • Komplexní vztahy a cesty → grafová databáze.
  • Hybridní přístup: kombinace technologií (polyglot persistence): např. Kafka + databáze klíč–hodnota pro rychle dostupné stavy, dokumentová databáze pro agregáty, grafová databáze pro doporučování.

Provozní aspekty: monitoring, zálohování, migrace

  • Monitoring: latence p50/p95/p99, propustnost, velikost a fragmentace indexů, zpoždění replikace, GC/heap u systémů JVM.
  • Zálohování/obnova: snímky na úrovni úložiště, obnova k určitému okamžiku (pokud je podporována), testy obnovy (cvičení pro zotavení po havárii).
  • Migrace schémat: v dokumentových databázích přístup schema-on-read, postupná migrace dokumentů při přístupu; u grafových databází postupná migrace částí grafu.

Závěr: jak přistupovat k návrhu řešení NoSQL

Úspěch nasazení NoSQL závisí na správném sladění datového modelu s přístupovými vzory, promyšleném particionování a volbě profilu konzistence. Dokumentové databáze vynikají při práci s agregáty a pokročilými dotazy, databáze klíč–hodnota poskytují extrémní výkon při jednoduchých operacích a grafové databáze umožňují přirozené modelování vztahů a rychlé dotazy nad nimi. V praxi se často uplatňuje polyglot persistence, kdy každá technologie řeší tu část problému, pro kterou je navržena. Důraz na observabilitu, správu indexů a testování škálování je klíčem k dlouhodobě udržitelnému provozu.