# Relační model dat

**E-R-A vs relační model dat**

- E-R-A model
	- konceptuální
	- modelujeme reálný svět
- Relační model dat
	- interní model
	- nahlížení na data, která jsou uložena na disku

**Matematická definice relace**

- Nechť je daný systém $\{D_{i}, i \in \langle 1, n \rangle\}$ neprázdných množin, tzv. domén.
- Potom podmnožinu kartézského součinu $R \subseteq D_{1} \times D_{2} \times \dots \times D_{n}$ nazveme relací stupně $n$ nad $D_{1}, D_{2}, \dots, D_{n}$.
- Prvky relace $R$ jsou uspořádané n-tice ($d_{1}, d_{2}, \dots, d_{n}$) takové, že $d_{i} \in D_{i}$ pro $i \in \langle_{1}, n\rangle$.

**Pohled na relační model dat**

- relační model dat zobrazuje data tabulkou
- relace je tabulka s $m$ řádky a $n$ sloupci
- každý sloupec je atribut
- v relaci $R$ neexistují dna stejné řádky
- pořadí řádků i sloupců je nevýznamné

**Porovnání přístupů**

| Souborově orientovaný přístup | E-R-A model | Datová struktura | Relační model |
| ----------------------------- | ----------- | ---------------- | ------------- |
| soubor                        | entitní množina            | tabulka                 | relace              |
| záznam                        | entita            | řádek                 | uspořádaná n-tice              |
| položka                              | atribut            | sloupec (název)                 | doména (název)              |
- doménou můžeme chápat i množinu hodnot, kterých prvek z n-tice může nabývat

**Relační klíče**

- superklíč (superkey)
	- atribut nebo množina atributů, který/á jednoznačně identifikuje uspořádanou dvojici n-tice dané relace
- složený klíč (composite key)
	- superklíč s dvěmi či více atributy
- kandidát klíče (candidate key)
	- superklíč, jehož žádná podmnožina neplní funkci superklíče dané relace
- primární klíč (primary key)
	- vybraný kandidát klíče, obsahující co nejmenší množinu atributů
- alternativní klíč (alternate key)
	- kandidát klíče splňující vlastnost primárního klíče, který za primární klíč nebyl vybrán

**Relační (databázové) schéma**

- Relační schéma
	- množina atributů včetně jejich domén relace $R$
		- $R(A_{1}:D_{1}, A_{2}:D_{2}, \dots, A_{n}:D_{n})$
	- obvykle se používá zápis bez domén atributů
		- $R(A_{1}, A_{2}, \dots m A_{n})$
	- atributy primárního klíče jsou v relačním schématu vyznačeny podtržením
- Relační databázové schéma
	- množina relačních schémat, každé s unikátním názvem relace

**Příklady relačních schémat**

- Student(**číslo_studenta**, jméno, příjmení, rok_narození, adresa)
- Známka(**číslo_studenta**, **zkr_předmětu**, známka, datum, pokus)

**Důležité pojmy**

- Databáze
	- též báze dat
	- konečná množina v čase proměnných konečných relací
- Relační schéma databáze
	- skládá se z databáze a integritních omezení


## Integritní omezení

**Definice integritních omezení**

- **integritní omezení:** pravidla pro hodnoty objektů v databázi, které musí být splněny, aby odpovídaly reálnému světu
- příklad: učitel a student se dohodnou na známce 1, ale do systému učitel zapíše
	- trojku - nejedná se o porušení integritních omezení, jen je do databáze zapsán chybný údaj
	- pětku - jedná se o porušení integritních omezení, systém hodnotu nedovolí zapsat

**Realizace integritních omezení**

+ omezující podmínky hodnot a vztahů jsou běžné, a možnosti SQL či jiných nástrojů SŘBD na ně reagují
- **Deklarativní realizace integritních omezení**
	- zadávána v rámci definice dat (např. `CREATE TABLE`)
- **Procedurální realizace integritních omezení:**
	- triggery
	- uložená procedura
	- ošetření programem (aplikací)

**Klasifikace integritních omezení**

- **Entitní integrita** (Entity Integrity Constraints)
	- jednoznačná identifikace entity v tabulce
	- zajišťuje primární klíč
		- jednoznačná hodnota `UNIQUE`
		- musí být vyplněn `NOT NULL`
+ **Doménová integrita** (Domain Integrity Constraints)
	- každá hodnota v databázi musí být z množiny přípustných pro daný atribut
		- typem
		- rozsahem
		- výčtem
		- speciálním odkazem
- **Referenční integrita** (Referential Integrity Constraints)
	- korektnost vztahů mezi entitami
	- vazba mezi nadřízenou a podřízenou tabulkou (1:N) pomocí primárního a cizího klíče

**Příklady referenční integrity**

- **student a jeho známky**
	- existuje-li známka bez studenta, databáze je nekonzistentní
- **čtenář a jeho výpůjčky**
- **předměty zajišťované katedrou**
	- výuka předmětu nemusí být nutně zajištěna katedrou, takže hodnoty atributů cizího klíče mohou být `NULL`

**Udržení referenční integrity**

- **Restriktivní způsob**
	- výchozí nastavení
	- operace vedoucí k narušení integrity nebude provedena
	- typy operací
		- zrušení řádku v nadřízené tabulce, pokud existuje závislý řádek v podřízené
		- vložení řádku do podřízené tabulky, pokud neexistuje řádek v nadřízené
			- patří sem i aktualizace cizího klíče
+ **Kaskádní způsob**
	- velmi mocný (a nebezpečný) nástroj
	- změny se dopraví i do podřzených tabulek, aby byla integrita zachována
	- typy operací
		- závislé řádky k rušenému řádku nadřazené tabulky budou zrušeny
		- změna primárního klíče se provede i u cizích klíčů
- **Nastavení hodnoty `NULL`**
	- lze použít jen v případech volné vazby

## Relační algebra

Základní operace
- selekce (selection)
- projekce (projection)
- kartézský součin (cartesian product)
- sjednocení (union)
- množinový rozdíl (set difference)
- přejmenování (rename)

Odvozené operace
- spojení (join)
- průnik (intersection)
- dělení (division)

Výsledkem každé operace s relacemi je opět relace.

**Projekce**
- operace projekce relace $R$ se schématem $A, R(A)$ na množinu atributů $B$, kde $B \subseteq A$
- vytvoří relaci se schématem $B$ a prvky, které vzniknou z původní relace ostraněním atributů $A \setminus B$
- odstraněny jsou i případné duplicity
- značíme $\Pi_{B}(R)$

**Selekce**
- operace selekce relace $R$ podle podmínky $\phi$
- vytvoří relaci se stejným schématem a ponechá ty prvky z původní relace, které splňují podmínku  $\phi$
- formule $\phi$ je Booleovský výraz s taomickými formulemi ve tvaru $t_{1} \Theta t_{2}$
	- kde $\Theta \in \{<, \leq, = \geq, >, \neq\}$
	- a $t_{i}$ je buď konstanta nebo jméno atributu
- značíme $\sigma_{\phi}(R)$

**Kartézský součin**
- operace kartézský součin dvou relací $R(A)$ a $S(B)$
- vytvoří relaci se schématem zahrnující nejprve všechny atributy schématu $A$ následované všemi prvky schématu $B$ a prvky, které vzniknou spojením každého prvku relace $R$ s každým prvem relace $S$
- schémata $A$ a $B$ by neměla mít společné atributy
- značíme $R \times S = S \times R$

**Sjednocení**
- operace sjednocení
- vytvoří relaci se všemi prvky obou relací $R$ a $S$
- duplicitní prvky jsou odstraněny
- obě relace musí mít kompatibilní schémata
	- stejný počet atributů
	- atributy na stejných pozicích musí mít stejnou doménu
- značíme $R \cup S = S \cup R$

**Množinový rozdíl**
- operace množinový rozdíl dvou relací $R$ a $S$
- vytvoří relaci se všemy prvky $R$, které nejsou v $S$
- **pořadí** relací v zápise **je důležité**
- obě relace musí mít kompatibilní schémata
- značíme $R \setminus S \neq S \setminus R$

**Přejmenování**
- operace přejmenování relace $R(A)$ na relaci $S(B)$
- vytvoří relaci se všemi prvky $R$ které může a nemusí být přejmenována na $S$ a která bude mít přejmenovaný alespoň jeden atribut svého schématu
- značení
	- přejmenování všeho: $\rho_{S(B)}(R)$
	- přejmenování relace: $\rho_{S}(R)$
	- přejmenování atributů: $\rho_{a=x, b=y}(R)$

**Průnik**
- operace průnik $R$ a $S$
- vytvoří relaci zahrnující jen ty prvky, které jsou současně prvky relace $R$ i $S$
- obě relace musí mít kompatibilní schémata
- značíme $R \cap S = S \cap R$

**Spojení**
- operace spojení dvou relací $R(A)$ a $S(B)$
- vytvoří novou relaci
	- se schématem $(A \cup B)$
		- $\Theta$ spojení (theta join)
		- přirození spojení (natural join)
		- vnější spojení (outer join)
	- se schématem $A$
		- polospojení (semijoin)
		- antijoin

**Dělení**
- operace dělení dvou relací $R(A)$ a $S(B)$
- vytvoří relaci se schématem $A \setminus B$, kde $B \subseteq A$ a prvky získané projekcí nad relací $R$, kterým odpovídají všechny prvky relace $S$
- **pořadí** relací v zápise **je důležité**
