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
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.
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}
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).
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.
- A = [“karel”, ”franta”, “pepa”]
- B = [”franta”, “pepa”, “karel”]
- C = [“karel”, “pepa”, 1,2]
- D = [“karel”, “pepa”, 1,1,2]
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] }
- 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 ]}.
[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í )
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
Díky super
OdpovědětVymazat