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ých | Málo, ale obří (přes miliony řádků) |
| Operace | Čtení i zápis | Skoro jen čtení, agregace |
| Optimalizace | Rychlá odezva | Velký průchod dat |
| Příklady | Postgres, MySQL | BigQuery, 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í
- 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č.
- 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.
- Navrhni tok dat. Nakresli, jak se data z appky dostanou do reportů (OLTP → ETL → warehouse → dashboard).
- 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.
- 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
- 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).
- 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.
- 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).
- 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čí.
- 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).
