Něco jako poznámky k Databázovým systémům
Story všichni znáte.
Moral of the Story: Pořádným zamotáním lze i z něčeho jednoduchého udělat
neproniknutelnou vědu.
Cílem tohoto textu je vnést trochu řádu do přednášek Databázové systémy.
Obsah. Zatím není (a asi nebude) linkovaný.
Úvodní kapitoly
Cíl databázových systémů
Úvodní (bezúčelné) definice
Relační datový model
Povolené datové struktury relačního dm
Operace na n-árních relacích rel. dat. modelu
Navrhování a manipulace s databází
Dotazy do databáze
...tady chybí DRK, NRK, SQL, QBE
Navrhování a modifikace schémat databází
Funkční závislosti
Odvozování jedné funkční závislosti z druhé
Algortimus příslušnosti (Membership Algorithm)
Klíče k tabulkám a databázím
Jak najdeme univerzální klíč
Jak najdeme všechny univerzální klíče
Normální formy databází
"Ekvivalentní informativnost"
Algoritmy vylepšování schémat databází
Syntéza
Dekompozice
...tady nejsou multizávislosti
Cíl databázových systémů
Sdílení množství dat:
- aktuálních (měnících se v čase),
- velkých,
- perzistentních (uchovávají se i mimo dobu běhu programu)
Další požadavky na DB:
- znovuvyužitelnost dat (a z toho prý => nutnost oddělení definice dat od dat)
- nezávislost dat a programů (tj. snad kvůli perzistenci, nebo ne?)
- různé přístupové cesty a přístupové metody k datům (sdílení je pro různé lidi)
- paralelní přístup
- autorizace
- zabezpečení dat proti poškození chybou HW nebo SW (zálohování)
Úvodní (bezúčelné) definice
- Datový model
- je nějaká teorie, soubor pojmů o tom, jak data skladuji.
- Definuje:
- povolené datové struktury
- povolené operace na nich
- integritní omezení (tj. že 34.13. není datum)
- Schéma
- je definice (popis) databáze nebo její části.
- Schéma databáze návrhář odvozuje ze zvoleného datového modelu.
- Trojschématová architektura
- Návrháři databáze ve snaze o oddělení dat a programů postupně přišli na to, že nebudou navrhovat celý systém
naráz, ale že ho rozdělí na tři vrstvy:
- uživatelské schéma - ta část systému, kterou uživatel vidí
- logické schéma - "logický návrh struktury databáze" (a tohle schéma vymýšlení na základě tzv.
konceptuálního schématu, čert ví, co to je. Zpětné inženýrství je název toho procesu, když jde opačně -
na základě logického schématu upravuje to konceptuální)
- fyzické schéma databáze - implementace datových struktur a operací
Relační datový model
Relační datový model je datový model (tj. teorie) "relačních databází" (tj. těch databází, které na tomhle
modelu stojí :-).
Povolené datové struktury relačního dm
Jedině n-ární relace (tj. podmža kart. součinu). Ekvivaletně ji budeme nazývat tabulkou.
Představujte si to tak, že máte mžu J všech potenciálních jmen, mžu P všech potenciálních příjmení a mžu D všech
potenciálních dat narození. Pak snadno porozumíte, co je to relace žáků ve třídě a jejich dat narození. Je to podmža
kart. součinu JxPxD, přičemž každá trojice (j,p,d) je v relaci <=> ex ve třídě žák jp, který se narodil dne d.
Pro účely databází je nejlepší chápat pojem relace sloupečkově. Uvedená relace jsou tři sloupečky, první je
sloupeček jmen, druhá sloupeček příjmení a třetí sloupeček dat narození. Každá řádka popisuje jednoho existujícího
žáka.
Pořadí řádek tabulky neuvažujeme.
Sloupečky nečíslujeme, ale raději pojmenováváme. Těmto jménum se říká atributová jména, atributy a pro
tabulku hrají roli selektorů (pokud to někomu něco řekne).
Doména je mža povolených údajů pro každý sloupeček. Třeba doménou pro pořadové číslo žáka v třídním výkazu
jsou přirozená čísla. Domény jsou většinou jasné, a proto se vynechávají.
Schéma n-ární relace je množina atributových jmen (tj. množina názvů něch sloupečků) a přílušejících domén.
Je samozřejmě konečná.
Formálně S = { [A1, M1], [A2, M2], ..., [Ak, Mk] | Ai jsou atrubuty, Mi jsou domény}
Instance relace, relace nad schématem S je konkrétní tabulka se sloupečky a hodnotami v rozsahu podle
daného schématu.
Formálně je to mža { [A1, m1], [A2, m2], ..., [Ak, mk] | Ai jsou atrubuty, mi jsou individua z příslušné
domény Mi}
Zadání databáze vypadá tak, že dostaneme zadání schémat všech tabulek, které se v databázi vyskytují. (A správně
bychom měli dostat i přehled integritních omezení, ale protože nikdo neví, co to je, tak to nikdy nedostáváme.)
Příklady hledejte ve skriptech nebo na cvičení.
Operace na n-árních relacích rel. dat. modelu
Povolené operace na relacích v relačním datovém modelu se souhrnně nazývají relační algebra. Jsou to
tyto (a možná další) operace. Značení, které uvádím, není určitě obecně používané, ale v té zpřeházené hromadě
příkladů bylo uvedeno takhle.
- sjednocení, rozdíl, průnik
- chápeme je množinově
- kartézský součin
- sice taky chápeme množinově, ale zaslouží vysvětlení:
- Nechť R=(A,B), tj. mějme relaci nad schématem A, B, tj. tabulku se sloupečky s názvy A a B. Nechť S=(C,D). Kart.
součin RxS je pak relace se sloupečky A, B, C a D, v níž jsou všechny čtveřice, které lze získat kombinací všech
řádků R se všemi řádky S.
- projekce
- vybírá některé sloupce relace
- R[X] značí, z relace R mne zajímá jen sloupec X
- R[X, Y] značí, že z relace R chci sloupce X a Y
- R[X->A] značí, že z relace R chci sloupec X, ale chci ho přejmenovat na A
- selekce, restrikce
- vybírá řádky z relace podle nějakého pravidla
- R[X<>const] vybere z relace R ty řádky, jejichž hodnota ve sloupci X je větší, menší, rovna, různá od
konstanty (selekce)
- R[X<>Y] vybere z relace R ty řádky, jejichž hodnota ve sloupci X je větší, menší, rovna či různá od hodnoty
ve sloupci Y (selekce)
- spojení
- spojení ze dvou tabulek udělá jednu tabulku, platí identita:
- R[X<>Y]S = (R x S)[X<>Y]
- Při spojení se občas musí explicitně sloupečky přejmenovávat!
- ... a ještě další!
Materiál jde proti mně.. Ještě toho hodně zbývá a nemůžu se dostat k vysvětlování toho, co vážně nechápu. Teď
udělám skok, ale nechám si tu názvy kapitol.
Navrhování a manipulace s databází
Manipulace s databází slouží k:
- zodpovídání dotazů
- aktualizaci hodnot
- příp. k změně schématu databáze
Nejprve se budeme zabývat dotazy a pak navrhováním a vylepšování databázových schémat.
Dotazy do databáze
Dotaz je funkce! Je definovaná na množině přípustných instancí databáze a jako obor hodnot má
množinu jistých instancí relací (odpovídajících na dotaz).
Zápis dotazu je konkrétní písemné vyjádření dotazu v některém z dotazovacích jazyků (n-ticový relační
kalku, doménový relační kalkul, SQL, QBE a určitě další).
Popíšeme si zde některé užívané formalismy.
n-ticový relační kalkul
Doménový relační kalkul
SQL
QBE
Tabulka srovnávající syntaxi různých dotazovacích jazyků
Navrhování a modifikace schémat databází
U složitějších databází si můžeme pěkně zavařit, když databázi špatně navrhneme, nebo když nám ji špatně navrhne
někdo jiný. K tomu zavaření se váží dva nedefinovatelné termíny: aktualizační anomálie (v tabulkách máme údaje
dvakrát, nebo naopak není, co do sloupečků napsat) a míšení informací, kterým si tyhle problémy uděláme.
Nejdříve si zavedeme nějaké pojmy, pak shrneme, o co nám při úpravách databázových schémat jde a nakonec popíšeme
dva významné algoritmy pro úpravu databázových schémat.
Funkční závislosti
- Funkční závislost (nějakých atributů na jiných)
- znamená, že jakmile udáme hodnotu ve výchozích atributech, je tím jednoznačně určen řádek tabulky a tedy i
hodnota v těch cílových sloupečcích.
- Rodné_číslo->{Jméno, Příjmení} značí, že jméno a příjmení člověka je jednoznačně určeno (funkčně závisí) jeho
rodným číslem.
- R->JP je zkrácený zápis, při zápisu fčních závislostí píšeme místo sjednocení rovnou prvky za sebe
Na začátku nám někdo zadá množinu F funkčních závislostí (nebo ji sami na základě znalosti reálného světa známe).
Např. F={RČ->Příjmení; Jméno, Příjmení->RČ;...}. Hned ze začátku se hodí si množinu závislostí hezky upravit.
- Uzávěr F+ množiny závislostí F
- je množina všech závislostí, které z F logicky vyplývají (spojováním pravidel za sebe).
- My se vlastně chceme držet zadaného uzávěru závislostí a konkrétní seznam semínek F si můžeme upravovat tak, aby
byl co nejkratší a nejjednodušší.
- Uzávěr množiny atributů X v množině závislostí F
- je množina všech závislostí, které z X logicky vyplývají při použití všech možných pravidel z F.
- Elementární funkční závislost
- ja taková fční závislost, která má na pravé straně jediný atribut.
- Pokrytí množiny závislostí F
- je množina G, jestliže platí F+ = G+.
- Kanonické pokrytí
- je pokrytí popsané elementráními závislostmi.
- Redundantní závislost v nějaké mže závislostí F
- je závislost odvoditelná z ostatních závislostí v F
- Formálně: Závislost X->Y je v F redundantní, jestliže uzávěr levé strany X v F\{X->Y}, tj. F bez toho
redundantního pravidla, již obsahuje pravou stranu Y.
- Neredundatní pokrytí
- je pokrytí bez redundatních závislostí.
- Atribut A je redundatní v levé straně X některé závislosti,
- jestliže (X\A)+ = X+.
- Redukovaná závislost
- je taková, které nemá na levé straně žádný redundantní atribut.
- Minimální pokrytí
- je kanonické neredundantní pokrytí prořené pouze redukovanými závislostmi.
Odvozování jedné funkční závislosti z druhé
Funkční závislosti je možné ze sebe navzájem odvozovat. (Tak také provádíme ty kýžené úpravy množiny F). K
odvozování jedné závislosti z druhé se užívají následující odvozovací pravidla, která mají podobu implikací.
Správně bychom si měli u každého uvědomit jeho korektnost (tj. že nevyvodí závislost silnější, než byla v zadání) a
uvažovat o síle pravidel (o kolik informace přijdeme, když pravidlo použijeme).
Pravidla mají často několik rozdílných způsobů zápisu, ne všechny jsou stejně silné. Připomínám úmluvu, že místo
sjednocení mžin píšeme jména mžin hned za sebe.
Přehled odvozovacích pravidel: (implikace píšu "pozpátku", předpoklady následují za slůvkem pro)
- reflexivita
- to co už znáš, to taky umíš odvodit
- Y->X, pro množinu atributů X, která je částí mži Y
- X->prázdná mža
- X->X
- augmentace, rozšíření
- k danému pravidlu přifař ještě reflexivitu
- W->Z, pro X->Y, Z částí Y, X částí W
- XW->YZ, pro X->Y, Z částí W
- XZ->YZ, pro X->Y
- aditivita, union, kompozice
- slepení dvou pravidel do jednoho
- X->YZ, pro X->Y, X->Z
- XW->YZ, pro X->Y, W->Z
- tranzitivita
- X->Z, pro X->Y, Y->Z
- pseudotranzitivita
- XW->Z, pro X->Y, YW->Z
- dekompozice, projektivita
- něco z toho, co umím odvodit, mohu zapomenout; 3 ekvivaletní znění:
- X->Y, pro X->YZ
- X->W, pro X->Y, W částí Y
- X->Y, X->Z, pro X->YZ
- akumulace
- X->YZc, pro X->YZ, Z->cW
- c může být jediný atribut a ne množina
- Podle přednášejícího můžu klidně za C vzít i množinu, a uvažovat opakované použití pravidla pro všechny její
prvky.
Příklady odvozování jednoho pravidla z druhého můžete najít na str. cca 20 poznámek k přednášce.
Někteří databázoví teoretici usilují o vytvoření úplného a korektního systému pravidel. Tj. chtějí zvolit
takový (co nejmenší) soubor pravidel, aby pomocí něj bylo možné odvodit všechny závislosti a abychom žádnou neplatnou
nepřidali. (Je to snaha podobná té, která ve výrokové logice prosadila jediné pravidlo, Modus ponens.) Příklady
různých "axiomatických systémů" (nejde sice o axiomy, ale budiž) jsou na straně cca 20 poznámek k přednášce.
Algortimus příslušnosti (Membership Algorithm)
- Vstup:
- mža F funkčních závislostí
- nějaká závislost X->c, c je nespíš jeden atribut (ale snadno se to upraví pro mžu)
- Výstup:
- odpověď, je-li závislost X->c prvkem uzávěru F
Algoritmus příslušnosti je navržený praktickými informatiky. Nemusíme generovat F uzávěr, abychom zjistili, jestli
do něj X->c patří.
Myšlenka algoritmu je založena na ekvivalenci (X->c) je v F+ <=> c je v uzávěru X v F. Obě strany
ekvivalence jsou vidět.
Konstruujme tedy X+ vzhledem k F, iterativně:
- X+ := X, pro začátek
- dokud X+ roste, opakuj:
Přes všechna pravidla, je-li levá strana pravidla částí X+, přidej pravou stranu pravidla k X+
- pokud C je prvkem výsledného X+, odpověd kladně, jinak záporně
Klíče k tabulkám a databázím
Pro výklad normálních forem a algoritmů na vylepšení databází se bude hodit pojem klíče.
- Klíč schématu relace R
- je nejmenší množina atributů ze schématu R, na níž celá R funkčně závisí
- Jakmile tedy máme hodnoty pro klíčové atributy, máme jednoznačné určen libovolný řádek tabulky.
- Nadklíč schématu relace R
- je libovolná nadmnožina nějakého klíče.
- Když zkrátka ke klíči ještě přidáme nějaký další sloupeček.
- Atribut se nazývá klíčový
- je-li obsažen v libovolném klíči. (Jinak se nazývá neklíčový.)
- Čili, když (třeba spolu s něčím dalším) zpřístupňuje řádky tabulky.
- (Snaha je, aby uživatel nevyplňoval žádné klíčové atributy.)
- Univerzální schéma databáze
- je (myšlená) tabulka, která obsahuje úplně všechny sloupečky všech tabulek v databázi.
- Co je v ní za data na jednotlivých řádcích si neumím představit (třeba jak vyplnit položku Rodné_číslo u druhu
zeleniny...).
- Univerzální klíč
- je klíč univerzálního schématu databáze.
- Tzn. to jsou ty atributy z kterýchkoli tabulek databáze, že pomocí nich přesně najdeme kteroukoli položku
databáze.
Jak najdeme univerzální klíč
Ten se musí uhodnout.
Máme relaci nad schématem S (třeba ABDEF) a množinu funkčních závislostí F (třeba AB->C, DE->AB...).
Zvládnutelný postup nalezení jednoho univerzálního klíče je:
- Začni s celým F.
- Dokud uzávěr F+ generuje celé S, zahazuj pravidla z F.
- Poslední množina závislostí F, která ještě generovala celé S, představuje jeden z univerzálních klíčů - jako
univerzální klíč vezmi všechny atributy na levých stranách závislostí.
Ještě by mohlo jít:
- Vezmi jako základ Z nějaký atribut/dvojici atributů/trojici... z S.
- Udělej Z+ vzhledem k F.
- Pokud už jsi dostal celé S, je Z univerzální klíč.
Také je jasné, že jeden z univerzálních klíčů je rovnou celé S.
Jak najdeme všechny univerzální klíče
Máme relaci nad schématem S (třeba ABCDEF) a množinu funkčních závislostí F (třeba AB->C, DE->AB...).
Univerzální klíče bychom mohli snadno najít tímto postupem:
- Pro každou podmnožinu A schématu S
- Udělej uzávěr A+ vzhledem k F
- Pokud ten uzávěr A+ je roven S, je A univerzální klíč.
Popsaný algoritmus je očividně exponenciální složitosti. Lepší je postup Lucchesiho a Osborna. Funguje iterativně
- předloží se mu jeden univerzální klíč a on postaví jiný. A tak pořád dál, dokud množina univerzálních klíčů poroste
(nebo alg. neprojde všechna pravidla, snad!).
- Vezmi nějaký univerzální klíč K. Třeba AC.
- Procházej pravidla v F a hledej takové, které má neprázdný průnik pravé strany s klíčem K. (To se dělá proto, že
ten průnik budeme pak zahazovat.) Našli jsme BD->C.
- Levou stranu tohoto pravidla přidej ke klíči K. Dostáváme ACBD.
- Pravou stranu tohoto pravidla z klíče naopak odstraň. Dostáváme ABD.
- Takto upravená množina je jistě nadklíč, ověřme, že nelze zmenšit.
- Postupně zkoušíme z mži vyřadit jednotlivé atributy. Ověřujeme, že (BD)+!=S, (AD)+!=S, (AB)+!=S.
- Až už žádný atribut vyřadit nepůjde, je tato množina nalezeným univerzálním dalším klíčem.
Výhoda tohoto algoritmu je v tom, že se neprocházejí všechny podmožiny dané množiny. Jaká je ale jeho složitost,
to si fakt netroufnu odhadovat.
Ještě je tu problém s nejasně formulovanou ukončovací podmínkou!!!
Normální formy databází
Databáze je v nějaké normální formě, když splňuje nějaké podmínky. Dělá se to proto, že ty podmínky ověřují, že
databáze není rozbordelená nebo jinak neupravená. Jen co normální formy zavedeme ukážeme si, jak k vyšší normálním
formám dospět.
- První normální forma (1NF)
- vyžaduje, aby všem atributovým jménům byly jako domény přiřazeny jednoduché datové typy.
- Tedy vlastně nic extra. 1NF asi nelze nesplnit.
- Druhá normální forma (2NF)
- zakazuje míšení různých údajů v jedné tabulce.
- Formálně se to řekne: Žádný neklíčový atribut (něco, co se vždy v tab. vyhledává) není funkčně závislý jen na
části libovolného klíče.
- Nesmím být tedy schopen najít nějaký údaj v tabulce podle informace, která je menší než klíč. (Jinak bych tabulku
měl rozdělit na dvě.)
- Třetí normální forma (3NF)
- zakazuje tranzitivní funkční závislosti.
- Formálně: neexistuje klíč Klíč schématu R, podmnožina P schématu R a neklíčový atribut X, který není v P obsažen,
aby Klič->P->X, ale přitom neplatilo P->Klíč ani x->Klíč.
- V tabulce Zaměstnanec( RČ, Č_Vedoucího, Č_Oddělení) lze Č_Vedoucího odvodit z Č_Oddělení. Klíčem do tabulky je
přitom RČ zaměstance. (Nešikovné je to , protože při změně vedoucího nějakého oddělení budu muset projít všechny
zaměstnance toho oddělení a vedoucího u nich upravit.)
- Třetí normální forma definovaná jinak (ekvivalentně)
- Relační schéma A je v 3NF, jestliže pro každou fční závislost Y->x, kde Y je podmža A a x je atribut z A platí
alespoň jedna z podmínek:
- závislost je triviální, tj. atribut x je obsažen v Y,
- Y je nadklíč schématu A,
- x je klíčový atribut (je obsažen v alespoň jednom klíči).
- Boyce-Coddova normální forma (BCNF)
- nedovoluje ani tranzitivní závislost klíčových atributů, tj. obsahuje pouze body 1. a 2. z předchozí definice.
- Tady bych chtěl příklad, ale nějak mne nenapadá.
"Ekvivalentní informativnost"
Chystáme se upravovat schéma relační databáze. Bylo by špatné, kdybychom úpravami třeba přišli o nějaká data nebo
vztahy v databázi, proto během úprav kontrolujeme, jestli si neubližujeme. Soukromě jsem to nazval "ekvivalentní
informativností" původního a nového schématu databáze.
Cílem je z relačního schématu (R, F), kde R je konečná mža atributových jmen a F konečná mža funkčních závislostí,
udělat konečnou množinu schémat (R1, F1), ..., (Rk, Fk). Přitom Fi je "projekce" závislostí z F do dílčí relace Ri,
tj. Fi obsahuje všechny závislosti z F, pro které se v Ri vyskytují potřebné atributy.
Jinak řečeno: Při úpravách databáze sekám tabulky na kusy a o zadané závislosti mezi atributy se moc nestarám. Až
nakonec se ale musím kouknout, jestli jsem to nerozsekal tak, že nějakou závislost už v tabulkách nikdy nevyčtu.
"Informativnost" databázových schémat má dvě složky, které je třeba v zájmu "ekvivalence" ohlídat:
- Bezztrátovost dekompozice relace R na relace R1, ..., Rk
- Dekompozice je bezztrátová, jestliže zpětné spojení relací R1, ..., Rk (což jsou vykousané sloupečky z
původní velké relace R) splňuje R1 * R2 * ... * Rk = R.
- Tj., nestane se, že v zápalu boje zapomenu na nějaký údaj, ale taky žádný údaj nepřidám.
- Většinou, tj. když úplně nevynechám nějaký sloupeček, by se mi stalo, že nageneruju víc, než v původní relaci
bylo. Na to je třeba dát pozor.
- Věta o dekompozici dle funkčních závislostí:
Nechť A je relační schéma, X, Y, Z rozklad na A. Jestliže na A platí X->Y, je dekompozice do schémat
{X, Y} a {X, Z} bezztrátová.
Ekvivalentně: Dekompozice schématu S do schémat T, U je bezztrátová, jestliže platí T průnik U->T
nebo T průnik U->U
Důkaz: je prý vidět z definic operace projekce a spojení a fčních závislostí.
Komentář: Když před každým rozdělením tabulky na dvě ověřím, že rozděluji tam byla požadovaná závislost,
rozděluji bez ztráty informací.
- Zachování/pokrytí závislostí při dekompozici relace R se závislostmi F na relace R1, ..., Rk se
závislostmi F1, ..., Fk.
- Závislosti F1, ..., Fk pokrývají závislost F, jestliže platí
F+ = (sjednocení všech Fi)+.
- (Tato definice je v souladu s předchozí definicí pokrytí závislostí.)
Teď už jsme konečně hotovi vrhnout se do úprav schémat databází.
Algoritmy vylepšování schémat databází
Někdo nám dá špatně navrženou databázi nebo nějaký zamotaný popis toho, co chce do databáze ukládat.
Předpokládejme alespoň:
- jednoznačnost jmen atributů a jejich rolí,
- jednoznačnost vztahů mezi atributy (nevím moc, co to říká, ale prý: stejné fční závislosti v různých schématech
definují tutéž funkci)
Dejme tomu, že dostaneme jedinou tabulku R a množinu závislostí F. Cílem je z té jediné relace R a funčních
závislostí F udělat více relací R1, ..., Rk s odpovídajícími závislostmi F1, ..., Fk. Nová schémata musí být lepší co
do dosažené normální formy a zároveň musí být zachována jejich "informativnost"
Popíšeme dva odlišné postupy úprav schématu databáze, u každého zkusíme zkontrolovat, jestli jsme dosáhli vyšší
normální formy a jestli jsme zachovali "informativnost".
Pokud jsme dostali špatnou databázi, proces dekompozice ji opraví.
Pokud jsme dostali hromadu závislostí (z RČ poznáte příjmení, z příjmení poznáte barvu očí...), proces
syntézy nám z těchle funkčních závislostí postaví databázi v 3NF.
Syntéza
- Vstup:
- Množina atributových jmen R
- Množina funkčních závislostí F mezi atributy v R
- Výstup:
- Relace R1, ..., Rk s funkčními závislostmi F1, ..., Fk.
- Relace budou v 3NF a funkční závislosti pokryjí původní F.
- O bezztrátovosti syntézy (vycházíme-li z hotové databáze) hovoří věta na konci tohoto odstavce.
- Fáze I. Zjednodušme zadanou F
- Ve skriptech se praví, že chceme minimální pokrytí množiny závislostí (odstranění redundantních atributů a
závislostí). Neboť nevím, co to znamená, musím si domyslet vlastní obsah.
- 1. Vytvořme (pomocí pravidla dekompozice) elementrání závislosti:
- A->BC <=> A->B, A->C
- tím uděláme, že všechna pravidla budou mít vlevo jediný symbol
- Algoritmicky jsme to nikde neviděli.
- 2. Odstraňme redundantní atributy na levé straně pravidel:
- např. místo {RČ, Barva_vlasů, Barva_očí} -> Příjmení stačí RČ->Příjmení
- Jde o to, aby levé strany byly co nejmenší.
- Jak se to dělá algoritmicky, to zase nikdo neřekl.
- 3. Odstraňme redundantní závislosti:
- Tj. chceme zahodit pravidlo jako celek, je-li odvoditelné ze zbytku F.
- Algoritmus neznáme, kouzlíme.
- Jediné, co máme k dispozici, je věta: (BC->D) je v (F\(BC->D))+ <=> (BC)+ v F obsahuje D.
- 4. Spojme závislosti se stejnými nebo ekvivaletními levými stranami.
- Např. místo pravidel AB->C a AB->D použijme AB->CD.
- Nebo pokud AB<->CD (což prostě uhodneme! zas chybí alg!), z pravidel AB->E a CD->F uděláme AB->EF.
(Musíme si trošku dát pozor, abychom při samém vyhazování nezahodili pravidla, která umožňují tu ekvivalenci
AB<->CD!)
- Na konci tohoto kroku se už mezi závislostmi nesmí vyskytovat žádné dvě se shodnými nebo ekvivaletními levými
stranami.
- Fáze II. Konstrukce tabulek
- Podle závislostí, které zbyly v F, udělejme tabulky.
- Postup je snadný, ze závislostí vykácejme šipky.
- Tedy např. na základě závislosti AB->DEF uděláme tabulku se schématem ABDEF.
Text ve skriptech obsahuje ještě bod 2. Nalezněme nějaký univerzální klíč databáze
Proč to vůbec děláme??
A chceme najít jediný univerzální klíč, nebo všechny univerzální klíče? (To by se dělalo pomocí Lucchesiho Osbornova
algoritmu.)
Odpovědí na tyto otázky je snad následující věta, která pro posouzení předpokladů vyžaduje znalost nejlépe všech univerzálních klíčů.
Syntézu můžeme použít i pro vylepšení zadané databáze - když nám někdo zadá jedinou tabulku a seznam závislostí,
je to totiž vlastně vstup pro syntézu. No a pak má smysl se ptát, je-li tahle úprava schématu databáze bezztrátová.
Věta: (Bernstein, Dayal, Biskup)
Výsledek syntézy má vlastnosti bezztrátového spojení <=> alespoň jedna z výsledných tabulek obsahuje
alespoň jeden univerzální klíč původní databáze.
Bez náznaku dk.
Pokud jsme v maléru a nikde žádný univerzální klíč nemáme, stačí k databázi přidat navíc tabulku právě s tímto
klíčem.
Možná tohle byl důvod hledání univerzálního klíče...
Dekompozice
Dekompozice je metoda historicky starší než syntéza. Byla vytlačena syntézou hlavně proto, že její algoritmus je nedeterministický (v tom smyslu, že není řečeno, v jakém pořadí by měl člověk dekomponovat, aby dosáhl co nejlepšího schématu) a že postupy jsou složité.
Princip dekompozice spočívá v opakovaném používání známé věty, vždy na závislosti, které nám kazí požadovanou NF. Připomínám znění věty o bezztrátové dekompozici:
Nechť A je relační schéma, X, Y, Z rozklad na A. Jestliže na A platí X->Y, je dekompozice do schémat
{X, Y} a {X, Z} bezztrátová.
Rovněž připomínám test 3NF:
Relační schéma A je v 3NF, jestliže pro každou fční závislost Y->x, kde Y je podmža A a x je atribut z A platí
alespoň jedna z podmínek:
- závislost je triviální, tj. atribut x je obsažen v Y,
- Y je nadklíč schématu A,
- x je klíčový atribut (je obsažen v alespoň jednom klíči).
Algoritmus dekompozice:
- Vstup:
- Množina atributových jmen R (univerzální relace)
- Množina funkčních závislostí F mezi atributy v R
- Výstup:
- Relace R1, ..., Rk s funkčními závislostmi F1, ..., Fk.
- Relace budou v takové NF, kam to budeme chtít dotlačit (3NF nebo BCNF).
- Pokrytí funkčních závislostí bude třeba ověřit, obecně se mohou porušit.
- Bezztrátovost dekompozice je zaručena, všechny kroky děláme v souladu s větou.
- 1. Najít všechny univerzální klíče schématu.
- Algoritmus viz výše, hledání klíčů.
- Děláme to proto, abychom dokázali snadno odpovídat na otázku splněnosti 3NF.
- 2. Najít funkční závislost v F+, která porušuje BCNF nebo 3NF.
- Škodící fční závislost stačí hledat v F. Právě tady potřebujeme znát všechny klíče dekomponovaného schématu.
- V praxi se ukazuje, že lepšího výsledku dosáhneme, když místo nalezené závislosti W->X budeme dekomponovat raději podle závislosti W->(W+).
- 3. Provést dekompozici schématu podle nalezené závislosti A->B.
- Schéma C se rozdělí na dvě tabulky: levá bude obsahovat jako atributy levou a pravou stranu nalezené závislosti (tj. AB), pravá bude obsahovat levou stranu závislosti a zbytek atributů původního schématu (tj. A, C\B).
- 4. V dekomponovaných tabulkách najít klíče a pokračovat s každou tabulkou zvlášť podle bodu 2.
- V levé tabulce je jasným kandidátem na klíč levá strana závislosti, podle níž se štípalo (tj. A).
- Tento cyklus opakujeme, dokud všechny tabulky nejsou v požadované NF.
Postupovali jsme výhradně podle věty o bezztrátové dekompozici, bezztrátovost je tedy zaručena.
Obecně není jisté, že původní množina závislostí F bude novými Fi pokryta. Pokrytí je nutno ověřit samostatně. Stačí pro každou závislost z původní F zkontrolovat, že je v nějaké tabulce buď obsažena přímo, nebo že lze odvodit. (Při tomto odvozování se opět velmi hodí mít podtrhané klíče do jednotlivých tabulek.)
Podle pořadí výběru závislostí k dekompozici lze dosáhnout velmi odlišných výsledků. Žádný jednoduchý návod, jak si vybírat co nejlépa, ale navržen nebyl.
Snad se můžete poučit z příkladů, které najdete v textu přednášce.
Vícehodnotové závislosti (multizávislosti)
Multizávislosti už rozebírat nebudu. Za prvé jsem je nepochopil a za druhé už mne to nebaví.