pondělí 27. října 2014

Relace a teorie relačních databází

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