16 KiB
🗄️ Databázová architektura
Klasifikace databází
Relační (SQL)
| DB | Licence | Use case | Detail |
|---|---|---|---|
| PostgreSQL | Open source | Univerzální, geospatial, analytika, AI | POSTGRESQL.md |
| MySQL / MariaDB | Open source | Web, LAMP stack, e-commerce | MYSQL.md |
| Microsoft SQL Server | Proprietary | Enterprise .NET, Windows ekosystém | — |
| Oracle DB | Proprietary | Enterprise, finance, mainframe, RAC cluster | ORACLE.md |
| Amazon Aurora | Managed | MySQL/PostgreSQL kompatibilní, cloud-native | — |
NoSQL
| Typ | DB | Use case | Detail |
|---|---|---|---|
| Document | MongoDB, Couchbase | JSON data, flexibilní schema | MONGODB.md |
| Key-Value / Cache | Redis, Memcached, DynamoDB | Cache, session store, real-time | REDIS.md |
| Wide-column | Cassandra, ScyllaDB | Time-series, IoT, velká data | CASSANDRA.md |
| Vector | Pinecone, Qdrant, Milvus, pgvector | Embeddingy, RAG, sémantické vyhledávání | VEKTOROVE-DB.md |
| Graph | Neo4j, Dgraph | Vztahy, doporučení, social grafy | — |
Storage enginy
Společné koncepty napříč databázemi: DATABAZOVE-ENGINY.md
Transaction isolation levels
| Úroveň | Dirty Read | Non-repeatable Read | Phantom Read | Serialization Anomaly |
|---|---|---|---|---|
| Read Uncommitted | Ano (možné) | Ano | Ano | Ano |
| Read Committed | Ne (prevence) | Ano | Ano | Ano |
| Repeatable Read | Ne | Ne | Ne (PostgreSQL: Ne) | Ano |
| Serializable | Ne | Ne | Ne | Ne |
Anomálie:
- Dirty Read — čtení dat z necommitnuté transakce (data mohou být rollbacknuta)
- Non-repeatable Read — stejný dotaz vrátí jiná data (jiná transakce mezitím updatovala řádek)
- Phantom Read — stejný dotaz vrátí nové řádky (jiná transakce insertla data splňující podmínku)
- Serialization Anomaly — výsledek transakcí není ekvivalentní žádnému sériovému pořadí
PostgreSQL vs MySQL rozdíly
- PostgreSQL: Read Uncommitted se chová jako Read Committed. Repeatable Read = Snapshot Isolation (zabraňuje i phantom reads). Serializable = SSI.
- MySQL InnoDB: Repeatable Read používá next-key locking (zabrání phantom reads).
CAP teorém
V distribuovaném systému lze mít pouze 2 ze 3: Consistency, Availability, Partition tolerance.
V praxi: P je vždy vyžadováno, volíme mezi CP (konzistence) a AP (dostupnost).
PACELC rozšíření
PACELC rozšiřuje CAP o chování za normálních podmínek (bez partition):
- Partition → Availability vs Consistency
- Else (bez partition) → Latency vs Consistency
| DB | Partition volba | Else volba |
|---|---|---|
| Cassandra | AP (dostupnost) | LC (nízká latence, eventual consistency) |
| DynamoDB (default) | AP | LC |
| MongoDB | CP (primární) | LC |
| PostgreSQL (single) | CP | CC |
| CockroachDB | CP | CC |
Quorum detail
- R (read quorum) + W (write quorum) > N (replication factor)
- Typické: N=3, R=2, W=2 (toleruje 1 node down)
- Sloppy quorum — při nedostupnosti nodu, data dočasně uložena na jiném nodu
- Hinted handoff — dočasný zápis na jiný node s hintem, při obnově se data přenesou
Replikace
| Typ | Popis | Latence |
|---|---|---|
| Synchronní | Zápis potvrzen až po replikaci na všechny nod | Vysoká, ale konzistentní |
| Asynchronní | Zápis potvrzen ihned, replikace na pozadí | Nízká, možný data loss |
| Semi-synchronní | Potvrzení od majority nodů | Kompromis |
Topologie
- Leader-Follower (Master-Slave) — čtení z replic
- Leader-Leader (Multi-master) — zápis na více nodů
- Quorum-based — R + W > N (Cassandra, DynamoDB)
Sharding
Distribuce dat napříč uzly podle shard klíče.
┌─────────┐
│ Proxy │
│ Router │
└────┬────┘
┌──────────┼──────────┐
┌────▼───┐ ┌───▼────┐ ┌───▼────┐
│Shard A │ │Shard B │ │Shard C │
│ 0-100 │ │101-200 │ │201-300 │
└────────┘ └────────┘ └────────┘
Metody
| Metoda | Popis | Výhoda | Nevýhoda |
|---|---|---|---|
| Hash-based | shard_id = hash(key) % N |
Rovnoměrná distribuce | Ztráta range dotazů |
| Range-based | Data dle rozsahu (A-M, N-Z) | Zachovává řazení | Hot spots |
| Consistent hashing | Hash ring, vnodes | Min. přeuspořádání při změně počtu shardů | Složitější |
Routing
- Proxy-based — aplikace jde na proxy, ta routuje (Vitess, ProxySQL, mongos)
- Client-side — aplikace ví, na který shard jít
- DNS-based — každý shard má vlastní endpoint
Data consistency patterns
| Pattern | Popis | Příklad |
|---|---|---|
| Strong consistency | Po zápisu každý read vidí nejnovější data | Single DB, Raft, Spanner |
| Eventual consistency | Po zápisu se data časem propagují | DNS, DynamoDB (default), Cassandra |
| Read-after-write | Autor svůj zápis vždy vidí (ostatní eventual) | Sociální sítě, komentáře |
| Causal consistency | Kauzálně závislé operace viděny ve správném pořadí | COPS, Orbe, MongoDB (causal clusters) |
| Monotonic reads | Nevidíte starší data po tom, co jste viděli novější | Cassandra (MONOTONIC_READ consistency) |
| Monotonic writes | Zápisy od jednoho clienta v pořadí | Queue-based, single leader |
Migrace dat
Schema migrace
V1__initial_schema.sql
V2__add_users_table.sql
V3__add_email_index.sql
V4__add_orders_table.sql
Zero-downtime migrace
- Expand — přidání nového sloupce/tabulky (aplikace toleruje oba stavy)
- Migrate — backfill dat, update aplikace na nové schema
- Contract — odstranění starého sloupce/tabulky
Nástroje
| Nástroj | Jazyk | Strategie | Zero-downtime | Rollback |
|---|---|---|---|---|
| Flyway | Java (multi-lang CLI) | Versioned SQL | Omezeně (jen additive) | undo (limited, enterprise) |
| Liquibase | Java (multi-lang CLI) | Changesets (XML/YAML/JSON/SQL) | Ano (changeset design) | rollback <count> |
| Alembic | Python | Auto-generation, versioned | Ano (branching) | downgrade |
| Prisma Migrate | TypeScript | Declarative schema → diff | Ano (shadow DB) | migrate diff |
| gh-ost | Go | Triggerless online DDL (MySQL) | Ano (binlog stream) | Ne (progresivní) |
| pgroll | Go | Online schema migrace (PG) | Ano (views, multiple versions) | Ano (okamžitý) |
SQL Antipatterns
Na základě More SQL Antipatterns (Karwin, 2026) — 14 nových antipatternů:
Language antipatterns
| Antipattern | Problém | Řešení |
|---|---|---|
| Fear of JOINs | Manuální párování v aplikaci místo JOIN | Používat JOIN správně |
| Relational Division | Hledání množin v WHERE | Relační dělení (subquery s GROUP BY/HAVING) |
| Pagination via OFFSET | OFFSET je O(n) — čím větší offset, tím pomalejší | Keyset pagination (WHERE id > last_seen) |
| Non-Sargable queries | Funkce na sloupci v WHERE (WHERE YEAR(date) = 2026) |
Přepsat na range podmínku |
Optimization antipatterns
| Antipattern | Problém | Řešení |
|---|---|---|
| Premature denormalization | Denormalizace bez důvodu | Měřit, pak optimalizovat |
| JSON overuse | JSON jako univerzální řešení | Použít JSON jen pro skutečně flexibilní data |
| Cacheless transactions | Spoléhání na query cache (v MySQL 8 odstraněna) | Application-level caching |
Application antipatterns
| Antipattern | Problém | Řešení |
|---|---|---|
| Polling | Pravidelné dotazování na změny | LISTEN/NOTIFY, Kafka, Change Data Capture |
| Transaction encapsulation | Každý model si spravuje vlastní transakci | Unit of Work pattern |
| Fear of deadlocks | Snaha o prevenci všech deadlocků | Mitigace, ne prevence |
| Data hoarding | Ukládání všeho navždy | Data retention politiky, archívace |
Mini-antipatterny
LIMITbezORDER BY— nedeterministické výsledkyNATURAL JOIN— křehký, implicitní join conditionN+1 queries— dotaz v cyklu místo JOIN/batch- Redundantní indexy — duplicitní/překrývající se indexy zbytečně zpomalují zápisy
Designing Data-Intensive Applications (2. vydání)
Kleppmann, Riccomini (2026) — zásadně přepracované vydání.
Novinky oproti 1. vydání
| Oblast | Co je nové |
|---|---|
| Cloud-native | Storage = object store (S3, Blob), nikoliv lokální disk. Separace control/data/compute plane |
| AI workloads | Vektorové indexy, DataFrames jako datový model, batch processing pro training data |
| Local-first software | DuckDB, PGlite, SQLite — databáze běžící na laptopu/edge, sync při připojení |
| Formal methods | Randomizované testování, formální verifikace (důležité pro AI-generovaný kód) |
| Legal & ethics | GDPR, etika prediktivní analytiky, bias, accountability algoritmů |
| Streaming → SQL views | Materialize, incremental view maintenance — streamování jako SQL |
Klíčové principy (nemění se)
Spolehlivost (Reliability), škálovatelnost (Scalability), udržovatelnost (Maintainability) — tři pilíře dobrých datových systémů.
Apache Iceberg Lakehouse
Na základě Architecting an Apache Iceberg Lakehouse (Merced, 2026):
Co je data lakehouse
Architektura kombinující flexibilitu a nízkou cenu data lake (object storage) s výkonem a governance data warehouse. Apache Iceberg je open source table format.
Iceberg metadata architektura
Table metadata (.metadata.json)
└── Snapshot manifest list
└── Manifests (file-level stats)
└── Data files (Parquet/ORC/Avro)
Klíčové vlastnosti
| Vlastnost | Popis |
|---|---|
| ACID transakce | Bezpečné concurrent read/write |
| Schema evolution | Přidání/odebrání/přejmenování sloupce bez rewrite |
| Time travel | Dotazování na historické snapshoty |
| Partition evolution | Změna partition strategie bez rewrite dat |
| Hidden partitioning | Automatické partition filtry (uživatel nemusí uvádět) |
| Multi-engine | Spark, Flink, Trino, Dremio, Snowflake nad stejnými daty |
Detailnější přehled Big Data ekosystému (HDFS, Spark, Flink, Trino, Delta Lake, Hudi) viz BIG-DATA.md.
Kdy použít Iceberg
- Multi-tool přístup ke stejným governed datům
- ACID na lake datech
- Streamování + batch v jedné tabulce
- Snížení duplicity (jedna canonical kopie místo ETL do warehouse)
Best practices
- Connection pooling — PgBouncer, RDS Proxy, ProxySQL
- Indexování podle query patternů — nemít zbytečné indexy
- Read replicas pro reporting a analytiku
- Backup & recovery — point-in-time recovery (PITR), pravidelné testy
- Query monitoring — slow query log, pg_stat_statements, performance_schema
- Encryption at rest & in transit
- Migrace v CI/CD — součást pipeline, ne manuálně
- Volba DB podle workloadu — neexistuje jedna univerzální DB (polyglot persistence)
Srovnání licenčních modelů databází
| DB | Licence | Cena (self-hosted) | Cena (managed cloud) | Vendor lock-in | Poznámka |
|---|---|---|---|---|---|
| PostgreSQL | PostgreSQL license (MIT-like) | $0 | ~$0.10-1.00/hod (RDS, CloudSQL, Aurora) | Nízký | Plně open source, žádná omezení |
| MySQL | GPL v2 / Commercial (Oracle) | $0 (GPL) / ~$2 000/server/rok (commercial) | ~$0.10-1.00/hod (RDS, PlanetScale) | Střední (Oracle vlastní) | GPL = nutnost uvolnit aplikaci? (závisí na distribuci) |
| MariaDB | GPL v2 / Business Source | $0 (GPL) | ~$0.10-1.00/hod (SkySQL) | Nízký | Plně kompatibilní fork MySQL, žádný Oracle vliv |
| Oracle SE2 | Proprietary (per core) | ~$17 500/core + 22 % support/rok | ~$1-5/hod (RDS, OCI) | Vysoký | Core factor 0.5 (EPYC/Xeon), max 16 threads |
| Oracle EE | Proprietary (per core + options) | ~$47 500/core + options + 22 % support | ~$2-30/hod (OCI, RDS) | Vysoký | Options zdvojnásobují cenu (RAC, partitioning, compression) |
| SQL Server Standard | Proprietary (per core + CAL) | ~$1 000/core + $200/CAL | ~$0.20-1.00/hod (Azure SQL) | Střední | Windows Server license nutná navíc |
| SQL Server Enterprise | Proprietary (per core + CAL) | ~$7 000/core + $200/CAL | ~$1-5/hod (Azure SQL) | Střední | AlwaysOn, partitioning, in-memory OLTP |
| MongoDB | SSPL (Community) / Commercial (Enterprise) | $0 (Community) / ~$10k/server/rok (Enterprise) | ~$0.10-5.00/hod (Atlas) | Střední | SSPL omezuje managed cloud služby |
| Redis | RSALv2 + SSPL (7.4+) / BSD (Valkey) | $0 (Valkey) | ~$0.10-1.00/hod (ElastiCache, Memorystore → Valkey) | Nízký (Valkey) | Redis 7.4+ změna licence → fork Valkey |
| Cassandra | Apache 2.0 | $0 | ~$0.10-1.00/hod (Keyspaces, Amazon Managed) | Nízký | Plně open source, žádná omezení |
| ScyllaDB | Apache 2.0 (OSS) / Enterprise | $0 (OSS) / Enterprise subscription | ~$0.50-3.00/hod (ScyllaDB Cloud) | Nízký (OSS) | Enterprise: monitoring, security, support |
| CockroachDB | BSL (Business Source License) / Enterprise | $0 (core) / Enterprise subscription | ~$0.50-3.00/hod (CockroachDB Cloud) | Střední | BSL: po 3 letech se mění na MIT. Enterprise: multi-region, backup |
Klíčová doporučení:
- Nejnižší TCO: PostgreSQL (žádná licence, nejširší cloud podpora)
- Nejvyšší vendor lock-in: Oracle (PL/SQL, proprietary options, drahá migrace)
- License risk: Redis (změna licence) → používejte Valkey pro nové projekty
- Cloud-native licensing: MongoDB Atlas, CockroachDB Cloud, ScyllaDB Cloud — pay-per-use, žádná správa licencí
Zdroje
Odkazy, knihy a standardy: sources/databases/sources.md
Doporučená literatura
| Kniha | Autoři | ISBN | Klíčový přínos |
|---|---|---|---|
| Database Internals | Alex Petrov | 978-1492040346 | Hloubkový výklad storage engine (B-Tree, LSM-Tree, WAL, MVCC), distribuované systémy |
| Designing Data-Intensive Applications (2nd ed.) | Kleppmann, Riccomini | — | Cloud-native, AI, local-first, formal methods |
| High Performance MySQL (4th ed.) | Schwartz, Zaitsev, Tkachenko | 978-1492075292 | MySQL architektura, schema/index optimalizace |
| Expert Oracle Architecture (3rd ed.) | Kyte, Kuhn | 978-1484249602 | Oracle architektura, RAC, Data Guard, tuning |
| AI-Ready PostgreSQL 18 | Kumar, Linster | — | PostgreSQL jako unified platform pro AI |
| More SQL Antipatterns | Bill Karwin (2026) | — | 14 antipatternů, keyset pagination |
| Vector Databases | Borwankar (2026) | — | Embeddings, vektorové indexy, RAG |
| Architecting an Apache Iceberg Lakehouse | Merced (2026) | — | Lakehouse architektura, Iceberg metadata |
Poslední revize: 2026-06-03