Vítejte v prvním díle ze série kratkých článků o relačních databázích. Seriál je určen především pro vývojáře používající ORM, kteří nemají hlubší znalosti o relačních databázích.
Je třeba ještě zmínit, že v rámci zjednodušení a zrychlení výkladu se můžou v textu vyskytnout drobné formální nedokonalosti či nepřesnosti. Berte proto, prosím, uvedené teorie s nadhledem:)
Pěkně od začátku
Mějme nějakou běžnou, obyčejnou aplikaci:

Tato aplikace se skládá z několika částí:
- UI - (uživatelské) rozhranní (WEB, GUI, WebServices apod.)
- BL - business logika a datový model (který musí být persistentní)
- ORM - vrstva ORM (framework, např. Hibernate)
- RDB - relační databáze, úložište pro aplikaci
A tato aplikace může řešit například evidenci zaměstnanců. Její zjednodušený datový model vypadá proto takto:

Nyní nastává ta správná otázka. Jak je v obrázku zakreslena relace (z pohledu relační databáze)?
Pokud je odpověď
"relace je přece ta vidlička mezi tabulkama, ten vztah 1 ku N mezi entitami ....", čtěte dále, odpověď není zcela správná.
Proč? provedli jste záměnu dvou relativně podobných (nikoli totožných) pojmů:
- Pojem "relation", jehož význam se chápe jako přirozený "vztah mezi subjekty" a který vnukne představu "vidličky" v modelu.
- Pojem "relation", který se běžně překládá jako relace a který se užívá v matematice v teorii množin.
a právě relační databáze vychází z druhého uvedého pojmu. Než se posuneme k relačním databázím, bude vhodné si drobné základy z teorie množin připomenout.
Teorie množin
Z teorie množin si velmi lehce rozeberem čtyři pojmy:
- množina
- uspořádaná n-tice
- kartézský součin
- relace
Množiny není nutné nějak hluboce rozebírat. Mějme např. tyto možiny:
- A = {“karel”, ”franta”,
“pepa”}
- B = {”franta”,
“pepa”, “karel”}
- C = {“karel”, “pepa”, 1,2}
- D = {“karel”, “pepa”, 1,1,2}
S množinami je možné provádět různé operace (sjednocení, průnik...), možiny jsou navzájem disjunktní, konjuktní atd. atd.
Důležité jsou však dvě vlastnosti obecných množin:
- Nezáleží na pořadí prvků v množině (tedy platí A=B).
- Každý prvek může být v množině max. jednou (tedy platí C=D).
A zde se dostáváme k
uspořádaným n-ticím:
Uspořádaná n-tice vypadá na první pohled jako klasická množina, oproti výše popsané množině má právě tyto speciální vlastnosti:
- Záleží na pořadí prvků v množin.
- Každý prvek se může v n-tici opakovat.
Proto pokud bychom měli tyto uspořádané n-tice (zapisované v hranatých závorkách)
- A = [“karel”, ”franta”,
“pepa”]
- B = [”franta”,
“pepa”, “karel”]
- C = [“karel”, “pepa”, 1,2]
- D = [“karel”, “pepa”, 1,1,2]
tak v porovnání s množinám již
neplatí rovnost A a B, a C a D, což se nám hodí pro vysvětlení dalšího pojmu:
kartézský součin.
Kartézksý součin lze poměrně složitě definovat, pro jedoduchost ho popíšem slovně selským rozumem a příkladem:
Kartézksý součin dvou množin A a B je množina uspořádaných dvojic vytvořená jako "každý prvek z A s každým prvkem B".
Příklad 1 (z wikipedie):
pokud A
= {x, y, z} a B = {1, 2, 3} pak
AxB = { [x,1],[x,2],[x,3],[y,1],[y,2],[y,3],[z,1],[z,2],[z,3] }
Další praktičtější příklad (rovněž z wikipedie), který popisuje hrací karty:
- A =
{ sedma,
osma, devítka, desítka, spodek, svršek,
král, eso}
- B = { srdce,
listy, kule, žaludy }
Výsledek:
A × B = { [sedma, srdce ],
[sedma, listy ],
[sedma, kule ],
[sedma, žaludy ],
[osma, srdce ],
…,
[eso, kule ],
[eso, žaludy ]}.
Jak je vidět, kartézský součin nám v tomto případě definoval celý hrací balíček karet, ve kterém je jedna karta tvořená uspořádanou dvojcí [číslo, barva].
Ted je čas na poslední zajímavý pojem, pojem jež dal relačním databázím jméno -
relace. Definice je velice jednoduchá a zní:
Relace je podmožina kartézského součinu.
Samo o sobě to nezní užitečně, ovšem můžem si ukázat nějaké příklady relace z kartézským součinu vytvořeného v předchozím příkladu:
R1 = { [sedma, srdce ],
[devítka, žaludy ],
[svršek, kule ]}
R2 = { [sedma, srdce ],
[devítka, žaludy ],
[svršek, žaludy ],
[desítka, kule ],
[eso, kule ]}
Takto definované relace nám můžou představovat jakoukoliv část balíčku (například karty hráče, talón či nerozdané karty). Důležité je, že relace je množina, takže s ní můžeme formálně provádět operace jako sjednocení. odečtení, porovnání apod.
Pokud se podíváme na relace R1 a R2 příkladu karetních her, možná nám nápadně pripomínají ještě něco - ano,
tabulky. Pověstné tabulky které jsou srdcem všech relačních databází, tabulkových procesorů a kostičkových papírů. Relace R1 i R2 vypadají jako tabulky, buď dvě různé a nebo se může jednat o jednu a tu samou tabulku v jiném čase.
Nyní je čas se podívat zpátky k úvodní otázce ze začátku kapitoly: Jak je v obrázku zakreslená relace (z pohledu relační databáze)? Odpověď je tedy "tabulkou". Již zmíněné "vydličky", tedy vztahy mezi tabulkami, nejsou v původním slova smyslu relace.
Teorie relačních databází, relační algebra
K plnému využití relačních databází je nutné pochopit, na jakém principu
byly tyto databáze postaveny. V předchozí části jsme si ukázali, z jakého
matematického základu relační databáze čerpají. Nyní se posuneme z matematické teorie do teorie relačních databází.
Základy relačních databází definoval pan Edgar F. Codd kolem roku 1970 ve své práci "
A Relational Model of Data for Large Shared Data Banks". V této práci formalizoval relační model, relace (tabulky) a definoval tzv. relační algebru.
Nemá smysl zacházet příliš do hloubky, je však vhodné uvést operátory relační algebry, které se používají pro práci s relacemi:
- Selection (výběr, selekce)
- Projection (projekce)
- Inner and outer joins (sjednocení)
- Division (rozdíl)
- Cartesian product (kartézský součin)
- Rename (přejmenování )
Vstupem do operátoru jsou relace, výstupem jsou (to je velice důležité) rovněž relace. Díky tomu lze operátory a relace libovolně skládat a řetězit stejně, jako jsme zvyklí u běžných matematických operátoru a vytvořit komplexní výrazy.
Relační algebra je implementována v relační databázi a zapisuje se pomocí SQL takto:
select <projection>
from <relation>,<relation>… (kartézský součin)
where <selection>
inner/outer join <relations>
union <relation>
Jak je vidět, každý sql dotaz se v databázi interpretuje jako sada relačních operátorů nad tabulkami (relacemi), kde výsledkem je
opět relace. SQL dotazy lze tedy
libovolně skládat, používat několikásobně vnořené selekty a vůbec provádět všeljaká kouzla.
Závěr
Ukázali jsme si základy teorie množin a relačních databází, čímž jsme si otevřeli cestu do praxe. V dalších dílech se objeví ukázky, které uvedenou teorii maximálně využijí. Příkady budou psány pro databízi Oracle, ale principiálně fungují stejně téměř ve všech relačníc databázích. Tak si je nenechte ujít:)
David