# 10 • Databáze

## 1. úvod do databází a relační model

**Relační databáze (RDBMS):**

- vychází z relačního modelu, který v roce 1970 definoval **Edgar F. Codd**
- **princip:** data jsou uložena v **tabulkách** (relacích)
- **struktura:** je pevně daná (schéma), musíme předem vědět, jaké sloupce a datové typy budeme mít
- pro komunikaci se používá **SQL**
- PostgreSQL, MySQL, MS SQL Server

## 2. datové modelování

### A. konceptuální model (ER Diagram)

nezajímá nás technické řešení, ale **co** v databázi bude. používáme **ER model** (Entity-Relationship)

- **Entita:** Objekt reálného světa, o kterém uchováváme informace (např. *Student, Auto*)
    - *Entitní typ:* Šablona (např. "Člověk")
    - *Instance entity:* Konkrétní objekt (např. "Franta")
- **atribut:** vlastnost entity (např. *jméno, věk*)
- **relace:** vazba mezi entitami

[Obrázek: Entity Relationship Diagram example](https://encrypted-tbn0.gstatic.com/licensed-image?q=tbn:ANd9GcT5K_TxA-je492lWe8TY4nZ-x-HX-9CRWwBRw3LKnn1Zy05rj_XN51OBOtZCvWbFV_LAJMpN9YP11-2EBQdggCnTqwzKRp_tQ3sU52XZReiOU_TXe0)

### B. logický model

převádíme entity na **tabulky**

- Řešíme primární klíče (PK) a cizí klíče (FK - Foreign Keys)
- musíme vyřešit vazby, které relační model přímo neumí (např. M:N)

### C. fyzický model

implementace pro vybraný systém (např. MySQL)

- definují se přesné **datové typy** (INT, VARCHAR, DATE)
- řeší se indexy, fyzické uložení na disku atd.

---

## 3. typy relací (vazeb)

**1:1:**

- jednomu záznamu odpovídá právě jeden záznam v druhé tabulce.
- *Příklad:* Člověk a jeho rodné číslo.
- V praxi se často slučují do jedné tabulky, pokud to není nutné oddělovat.

**1:N (jedna ku mnoha):**

- nejčastější vazba
- *Příklad:* Třída a Studenti. Jedna třída má mnoho studentů, ale student chodí jen do jedné třídy.
- *Realizace:* Do tabulky "Student" se přidá sloupec s ID třídy (Cizí klíč).

**M:N (mnoho ku mnoha):**

- *Příklad:* Herci a Filmy. Jeden herec hraje ve více filmech, v jednom filmu hraje více herců
- **problém:** relační databáze neumí M:N přímo uložit
- **řešení:** Musí se vytvořit **vazební (asociační) tabulka**. Vznikne tak rozpad na dvě vazby 1:N
    - *Tabulka:* `Hraje_v (ID_Herec, ID_Film)`

### speciální typy vazeb

- **Rekurzivní vazba:** Vztah entity samé k sobě.
    - *Příklad:* Zaměstnanec a jeho nadřízený (oba jsou v tabulce Zaměstnanci).
    - *Příklad:* Rodič-Potomek (pokud jsou oba v tabulce Lidé).
- **IS-A (Generalizace/Specializace):** Dědičnost.
    - Rozšiřování entity o další prvky.
    - *Příklad:* Entita `Vozidlo` (obecná) a podtypy `Auto` a `Motorka`. `Auto` "JE" (IS A) `Vozidlo`.
    - V databázi se to řeší buď jednou velkou tabulkou s prázdnými sloupci (NULL), nebo více tabulkami se společným ID.

---

## 4. integrita dat

Integrita zajišťuje, že data jsou správná, konzistentní a dávají smysl.

1. **Doménová integrita (Integrita sloupce):**
    - hlídá, jaké hodnoty mohou být ve sloupci
    - zajišťují to **datové typy** (do čísla nenapíšeš text) a **omezení** (constraints)
    - *příklad:* věk nesmí být záporný (CHECK)
2. **Referenční integrita (Vazební):**
    - hlídá vztahy mezi tabulkami (pomocí Cizích klíčů)
    - **pravidlo:** Nemůže existovat odkaz na neexistující záznam
    - *Příklad:* Nemůžu smazat Třídu, dokud v ní jsou Studenti
    - **Řešení při mazání:**
        - `RESTRICT`: Zakáže smazání třídy, dokud je plná.
        - `CASCADE`: Smaže třídu a automaticky i všechny její studenty.
        - `SET NULL`: Smaže třídu a studentům nastaví u třídy "nezařazen".
3. **Transakční zpracování (Logická integrita):**
    - (PŘIPRAVOVANÁ -> ODEVZDANÁ)
    - databáze musí zajistit, aby se složitější operace provedla celá, nebo vůbec (ACID)

---

## 5. NoSQL databáze

*Not Only SQL*. Vznikly jako reakce na potřebu ukládat obrovská množství dat (Big Data), která nemají pevnou strukturu nebo se často mění.

- **Hlavní rozdíly oproti SQL:**
    - Nemají pevné schéma (schemaless).
    - Horší podpora složitých vazeb (JOIN), ale jsou velmi rychlé a škálovatelné.
- **Typy NoSQL:**
    1. **Dokumentové:** Ukládají data nejčastěji jako JSON objekty.
        - *Zástupce:* **MongoDB**.
        - Vhodné pro: E-shopy (každý produkt má jiné parametry), CMS.
    2. **Klíč-Hodnota (Key-Value):** Jednoduché úložiště, velmi rychlé.
        - *Zástupce:* **Redis**.
        - Vhodné pro: Cache, session management.
    3. **Grafové:** Ukládají uzly a hrany (vztahy).
        - *Zástupce:* Neo4j.
        - Vhodné pro: Sociální sítě (kdo koho zná).
    4. **Sloupcové:** Cassandra (pro obrovské analytické data).