Data & analytika

OLTP vs OLAP, data warehouse, ETL, batch vs stream.

Doteď jsme databázi brali jako místo, které obsluhuje aplikaci — rychlé malé dotazy „dej mi uživatele 5", „ulož objednávku". Ale data se taky potřebují analyzovat: kolik jsme prodali za měsíc, jak se chovají uživatelé, podklady pro reporty a ML. To je úplně jiná práce a dělá se jinými nástroji. Tahle kapitola vysvětlí ten rozdíl a základ datového světa kolem backendu.


Pár pojmů na úvod

  • OLTP (Online Transaction Processing) = databáze obsluhující aplikaci (rychlé malé operace).
  • OLAP (Online Analytical Processing) = zpracování pro analýzu (velké agregující dotazy).
  • Data warehouse = úložiště optimalizované na analýzu velkého množství dat.
  • ETL / ELT = přesun dat z různých zdrojů (provozní DB, logy, cizí systémy) do warehouse. ETL = Extract → Transform → Load; ELT prohodí pořadí (nahraj syrově, transformuj až ve warehouse).
  • Batch vs stream = zpracování po dávkách vs průběžně, jak data přitékají.

OLTP vs OLAP — dva úplně různé úkoly

Tohle rozlišení je základ. Stejná data, ale dvě naprosto odlišné práce:

OLTP (obsluha aplikace)OLAP (analýza)
Typický dotaz„dej mi objednávku #42"„kolik jsme prodali po měsících za 3 roky"
Velikost dotazůHodně malýchMálo, ale obří (přes miliony řádků)
OperaceČtení i zápisSkoro jen čtení, agregace
OptimalizaceRychlá odezvaVelký průchod dat
PříkladyPostgres, MySQLBigQuery, Snowflake, ClickHouse

⚠️ Nepouštěj těžké analytické dotazy na svoji provozní (OLTP) databázi! Jeden report přes miliony řádků dokáže databázi zahltit tak, že začne brzdit celá aplikace. Analytika patří jinam — do warehouse.

Proč jsou OLAP nástroje na agregace tak rychlé? Sloupcové uložení (columnar). Běžná OLTP databáze ukládá data po řádcích (celý záznam pohromadě — ideální, když potřebuješ celý řádek). OLAP nástroje (BigQuery, Snowflake, ClickHouse) ukládají data po sloupcích. Když počítáš „průměr ceny přes miliardu objednávek", přečteš jen sloupec cena a nic dalšího — místo abys tahal celé řádky. To je hlavní důvod, proč zvládají agregace, na kterých by se řádkově uložená databáze zadusila.


Data warehouse a jak se tam data dostanou (ETL)

Data warehouse je samostatné úložiště navržené přesně na analytiku — zvládne obří agregace nad spoustou dat, ale není stavěné na obsluhu appky. Data se do něj kopírují z provozních databází (a dalších zdrojů) procesem ETL:

  • Extract — vytáhni data ze zdrojů.
  • Transform — pročisti a převeď do tvaru vhodného na analýzu.
  • Load — nahraj do warehouse.

(Někdy se pořadí prohodí na ELT — nahraje se syrově a transformuje až ve warehouse.) Tím se oddělí provoz od analytiky: appka jede na svém OLTP a reporty se počítají vedle, aniž by si navzájem překážely.

Jak se data reálně tahají: ne plným kopírováním pokaždé (drahé), ale inkrementálně — jen to, co přibylo/změnilo se. Často přes CDC (Change Data Capture) ze změnového logu databáze, takže neotravuješ produkci dotazy. A protože job poběží i víckrát (selhání, backfill historie), musí být idempotentní (dvojí běh nezdvojí data).

Senior bere data jako produkt: hlídá data quality (kontroly schématu, čerstvosti, počtů řádků, anomálií — ať se tichá chyba pozná) a lineage (odkud číslo v reportu pochází a co se přepočítá při změně). Reportům se totiž věří a rozhoduje se podle nich.


Batch vs stream processing

Dva způsoby, jak data zpracovávat:

  • Batch (dávkově) — sesbíráš velkou hromadu dat a zpracuješ ji najednou, periodicky (např. každou noc přepočítáš denní statistiky). Jednoduché, efektivní, ale výsledek je se zpožděním.
  • Stream (proudově) — zpracováváš události průběžně, jak přitékají (živé počítadlo, detekce podvodu v reálném čase). Aktuální, ale složitější. Staví na frontách a Kafce.

Pravidlo: když stačí „do druhého dne", dělej batch (levnější a jednodušší). Stream nasaď, jen když opravdu potřebuješ výsledek hned.


Failure modes — jak to v praxi praská

  • Analytika na provozní databázi → jeden report položí celou aplikaci.
  • Žádné oddělení OLTP/OLAP → škálování se rve mezi appkou a reporty.
  • Stream tam, kde stačil batch → zbytečná složitost a náklady.
  • ETL bez hlídání → tichá chyba v transformaci → špatná čísla v reportech, kterým se pak věří.

🛠️ Cvičení

  1. OLTP, nebo OLAP? Zařaď dotazy: „přihlas uživatele", „spočítej průměrnou útratu na zákazníka za rok", „ulož objednávku", „top 10 produktů za kvartál". Kam který patří a proč.
  2. Proč ne na provozní DB. Vysvětli na příkladu, co se stane, když pustíš roční agregaci přes miliony řádků přímo na produkční Postgres.
  3. Navrhni tok dat. Nakresli, jak se data z appky dostanou do reportů (OLTP → ETL → warehouse → dashboard).
  4. Batch, nebo stream? Rozhodni a zdůvodni: noční přehled tržeb, detekce podvodné platby, měsíční faktury, živý počet diváků streamu.
  5. ETL chyba. Vymysli, jak by tichá chyba v kroku „transform" mohla vést ke špatným číslům, a jak bys to odhalil.
Náčrt řešení — rozbal, až si cvičení zkusíš sám
  1. OLTP, nebo OLAP — pointa: „přihlas uživatele" a „ulož objednávku" jsou malé rychlé operace obsluhující appku (OLTP); „průměrná útrata za rok" a „top 10 za kvartál" jsou obří agregace (OLAP). Pozor: rozhoduje, jestli jde o malou operaci nad appkou, nebo agregaci přes spoustu řádků — to určí i nástroj (Postgres vs warehouse).
  2. Proč ne na provozní DB — pointa: roční agregace přes miliony řádků udělá velký průchod dat a zahltí OLTP databázi tak, že začne brzdit celá aplikace. Pozor: report tím připraví reálné uživatele o výkon, proto analytika patří do warehouse, ne na produkční Postgres.
  3. Navrhni tok dat — pointa: data jdou z OLTP databáze přes ETL (extract → transform → load) do warehouse a odtud do reportů/dashboardů; tím se oddělí provoz od analytiky. Pozor: tahej inkrementálně (často přes CDC), ne plným kopírováním, a job měj idempotentní (dvojí běh nezdvojí data).
  4. Batch, nebo stream — pointa: noční přehled tržeb a měsíční faktury stačí dávkově (batch), detekce podvodné platby a živý počet diváků potřebuje výsledek hned (stream). Pozor: stream je dražší a složitější, ber ho jen když „do druhého dne" nestačí.
  5. ETL chyba — pointa: tichá chyba v „transform" (špatný výpočet, vypadlé řádky) vyrobí věrohodně vypadající, ale špatná čísla, kterým se v reportech věří. Pozor: odhalíš to jen monitoringem a kontrolami data quality (počty řádků, schéma, čerstvost, anomálie) — sama o sobě se neprozradí.

🧠 Otázky & odpovědi

Jaký je rozdíl mezi OLTP a OLAP?

OLTP je databáze obsluhující aplikaci — hodně malých rychlých operací (čtení i zápis), např. „dej mi objednávku #42". OLAP je zpracování pro analýzu — málo, ale obřích agregujících dotazů přes miliony řádků, např. „kolik jsme prodali po měsících za 3 roky". Jsou to dva různé úkoly, optimalizované opačně, a dělají se jinými nástroji (Postgres vs BigQuery/Snowflake/ClickHouse).

Proč nepouštět analytické dotazy na provozní databázi?

Protože těžký analytický dotaz přes miliony řádků dokáže provozní (OLTP) databázi zahltit natolik, že začne brzdit celá aplikace — report tím připraví reálné uživatele o výkon. Analytika patří jinam, do data warehouse, kam se data zkopírují, takže provoz a reporty si navzájem nepřekážejí.

Co je ETL a k čemu data warehouse?

Data warehouse je úložiště optimalizované na analytiku (obří agregace), ne na obsluhu appky. Data se do něj kopírují z provozních databází a dalších zdrojů procesem ETL: Extract (vytáhni), Transform (pročisti a převeď do vhodného tvaru), Load (nahraj). Tím se oddělí provoz od analytiky — appka jede na svém OLTP a reporty se počítají vedle.

Kdy zvolit batch a kdy stream processing?

Batch (dávkově, periodicky) zvol, když stačí výsledek se zpožděním — třeba noční přepočet denních statistik. Je jednodušší a levnější. Stream (průběžně, jak data přitékají) zvol, jen když opravdu potřebuješ výsledek hned — živé počítadlo, detekce podvodu v reálném čase. Stream je aktuálnější, ale složitější a dražší, tak ho neber, když batch stačí.

Proč je nebezpečná tichá chyba v ETL?

Protože reportům a dashboardům se věří a rozhodují se podle nich. Když se v kroku „transform" něco potichu pokazí (špatně se spočítá, vypadnou řádky), čísla vypadají věrohodně, ale jsou špatná — a nikdo to nepozná, dokud se podle nich neudělá špatné rozhodnutí. Proto se i datové pipeline musí monitorovat a ověřovat (kontroly počtů, testy).