Pokiaľ si pod pojmami z nasledovnej kapitoly neviete nič predstaviť a naviac sa v tom zmätku vôbec nevyznáte, nedajte sa odradiť. Takto občas pôsobia odborné texty. Preformulovať niektoré vety do ľudskej reči vyžaduje niekedy veľké úsilie.
Rôzne typy architektúr databázových systémov vychádzajú zo skutočnosti, že je nutné rozlišovať niekoľko typov užívateľov databázových systémov:
Jedna z architektúr vyzerá takto: manžér dát je prostredníkom medzi SRBD a operačným systémom, hlavne čo sa týka prenosu dát medzi diskom a pamäťami. Kompilátor JDD zpracováva definíciu schémy, ukladá ju do katalógu dát. Run-time procesor k databáze pristupuje v dobe behu programu, k disku ma prístup prostredníctvom manažéra dát. Predkompilátor zpracováva príkazy JMD, ktoré saj vyskytujú v hostiteľskom jazyku, kompilátor potom vytvorí kód na nižšej úrovni prístupu k databáze a tento kód sa pripojí ku zbytku aplikačného programu alebo užívateľskej transakcii. Dotazový procesor interpretuje, kompiluje či zariaďuje optimalizáciu dotazu v dotazovacom jazyku, volá run-time procesor pre vyhodnotenie dotazu.
Dnes se väčšinou používa architektúra klient-server s funkčnou distribúciou. Aplikacie sú obecne v heterogénnom prostredí OS a sieti reprezentovanej procesmi - klientami. Dáta sú uložené v databázach na serveroch. Klientske požiadavky smerujú k serveru, ktorý má absolútnui kontrolu nad prístupom k dátam a je zodpovedný za integritu databázy. Komunikácia sa odohráva prostredníctvom SQL, i keď klient môže dotaz formulovať i v inom jazyku, který se musí previesť do SQL.
Schéma databázy sa skladá z typov záznamu, které obsahujú popis atribútu, a z typu C-mnočín, ktoré definujú vzťahy mezi záznami daných typov. Sieťová databáza je množinou zaznamov a C-množín vyhovujúcich schéme. Každý záznam má priradený databázový kľúč - diskovú adresu. Typ C-množiny je pomenovaná usporiadaná dvojica typov záznamov - vlastník a člen. Jeden záznam typu člen však nemôže byť obsadený ako člen v dvoch C-množinách rovnakého typu. Tak isto tak nie sú povolené rekurzívnei vzťahy - jeden typ nemôže byť súčasne vlastníkom a členom v jednom type C-množiny.
Príklad definíce dát:
RECORD NAME IS ZAMESTNANEC
LOCATION MODE IS VIA ZAMESTNAVA SET
01
C_ZAM PIC IS 9(5)
01 JMENO_ZAM TYPE IS CHARACTER 25
...
RECORD NAME
IS PREDNASKA
LOCATION MODE IS CALC HASH1 USING C_PRED
...
RECORD
NAME IS STUDENT
LOCATION IS CALC HASH2 USING C_ST
LOCATION MODE reprezentuje popis umiestnenie záznamu: CALC - použije sa daná hašovacia procedúra, VIA - umiestnenie a prístup prostredníctvom vlastníckeho záznamu.
ORDER IS FIRST / LAST / NEXT / PRIOR / IMMATERIAL - nový záznam se vloží na začiatok / na koniec / za posledný vkladaný / pred posledný vkladaný / ľubovolne.
ORDER IS SORTED BY DEFINED KEY
ASCENDING/DESCENDING KEY IS
meno_klucovej_polozky
DUPLICATES ARE NOT ALLOWED / FIRST / LAST
FIND - vyhľadávanie dát:
STUDENT.C_STUD: =
"K32"
FIND ANY STUDENT USING C_STUD
...
FIND DUPLICATE STUDENT USING
C_STUD
...
FIND OWNER WITHIN SI_ZAPSAL
GET - posledný zpracovaný záznam daného typu sa prenesie do pracovnej oblasti pre ďaľšiei spracovanie.
MODIFY - umistenie modifikovaného záznamu do databázy. Takýto záznam možno nájsť pomocou FIND FOR UPDATE.
ERASE - vymazanie záznamu nájdeného pomocou FIND FOR UPDATE.
STORE - vloženie záznamu vytvoreného v pracovnej oblasti
CONNECT - záznam v databázi sa pripojí ako člen do nejakej C-množiny.
HDM je vlastne specialnim pripadem SDM - i zde je mozne modelovat pouze vztahy 1:N.
Terminologie: typum zaznamu se rika typy segmentu, zaznamum segmenty, polozkam typu zaznamu pole. Typy segmentu a poli viditelne pro uzivatele se oznacuji jako senzitivni. Databazi tvori les stromu, ktere se prochazeji metodou "pre-order".
HDM je rozdelen do tri urovni:
Uzivatel se diva na databazi prostrednictvim PSB (Program Specification Block). PSB obsahuje nekolik PCB (Program Communication Block) - jejich analogii jsou tzv. pohledy v relacnich modelech.
Tohle uz mi pripada jako hrabani se ve zbytecnych detailech, ktere se navic na prednaskach, pokud vim, neprobiraji.
Relacni model pouziva jediny konstrukt - databazovou relaci. Tato relace je vybavena pomocnou strukturou - schematem relace. Schema se sklada ze jmena relace, jmen atributu a domen. Prvky domen (mnozin, z nichz se berou komponenty prvku relace) jsou atomicke hodnoty - nelze je relacnim SRBD dekomponovat do mensich casti. Omezeni na atomicnost komponent prvku relaci se oznacuje jako 1. normalni forma.
Klic schematu je minimalni mnozina atributu, jejiz hodnoty jednoznacne urcuji n-tice relace. Existuje-li vice klicu, zvoleny klic se oznacuje jako primarni. Klic obsahujici pouze jeden atribut je jednoduchy, klic obsahujici vice atributu se oznacuje jako slozeny. Atribut, ktery je soucasti nejakeho klice, je klicovy, v opacnem pripade je neklicovy.
E-R model je vhodny pro navrh databaze "shora dolu". Postup:
Povinne clenstvi se znaci krouzkem uvnitr obdelniku prislusne entity, nepovinne krouzkem vne obdelniku entity.
Pojem databazovy dotaz pro dane databazove schema oznacuje funkci, ktera je definovana nad prostorem vsech pripustnych databazi s danym schematem. Hodnotou teto funkce bude opet urcita databaze se specifikovanym schematem, jiz nazveme odpoved na dotaz.
Funkce (dotaz) by mela z praktickych duvodu splnovat nasledujici kriteria:
Ke kazdemu vyrazu jazyka by melo byt mozne priradit dotaz - jazyk by mel byt omezeny. V dotazovacim jazyku by melo byt mozne vyjadrit libovolny dotaz - jazyk by mel byt expresivni. Jazyk, jenz je soucasne omezeny a expresivni, se nazyva uplny.
Mnozina vsech dotazu, ktere lze dotazovacim jazykem vyjadrit, se nazyva vyjadrovaci sila dotazovaciho jazyka. Pri porovnavani dvou jazyku oznacime jako silnejsi ten, ktery ma vetsi vyjadrovaci silu. Lze-li jako silnejsi oznacit oba jazyky, jsou navzajem ekvivalentni.
Relacni algebra je nastrojem pro manipulaci relaci. Jde o jazyk, v nemz se nepracuje s n-ticemi relaci (na rozdil od jazyku sitoveho a hierarchickeho modelu), ale s celymi relacemi.
Zakladni prostredky: kartezsky soucin, sjednoceni, prunik a rozdil relaci, dale pak projekce R[C] (zuzeni relace na sloupce s atributy v C), selekce R(c) (zuzeni relaci na radky vyhovujici podmince c), spojeni R*S schemat R(A), S(B) (vysledkem je relace, jejiz projekce na A je z R a projekce na B je z S) a deleni relaci se schematy R(A) a S(B), kde B je podmnozinou A (vysledkem je relace se schematem A-B obsahujici mnozinu takovych n-tic t, ze pro kazdou n-tici z S existuje n-tice r z R tak, ze r[A-B]=t a r[B]=s).
U spojeni rozlisujeme leve c-polospojeni se schematy R a S, jehoz vysledkem jsou ty n-tice relace R*, ktere jsou spojitelne pomoci podminky c. Analogicky se definuje prave polospojeni. Polospojeni pres rovnost se rika prirozene polospojeni.
Leve vnejsi spojeni se schematy R(A) a S(B) vytvori nejvetsi relaci sjednoceni A a B, jejichz projekce na atributy A je relace R, projekce na atributy B se sklada z podmnoziny relace S a radku prazdnych hodnot. Analogicky se definuje prave vnejsi spojeni.
Priklad dotazu v relacni algebre: dodej seznam kin, kde nedavaji zadny film s Marlonem Brando:
KINO[NAZEV_K] - (FILM(HEREC=Brando)[JMENO_F]*PROGRAM[NAZEV_K,JMENO_F])[NAZEV_K]
Priklad:
x.NAZEV_K,k.ADRESA,x.JMENO_F,x.DATUM where PROGRAM(x) and KINO(k) and k.NAZEV_K = x.NAZEV.K
je totez, co PROGRAM * KINO v relacni algebre
Priklad:
adr,d where exists n (PROGRAM(NAZEV_K:n,DATUM:d) and KINO(NAZEV_K:n,ADRESA:adr))
da jako vysledek adresy kin, v nichz se promita (tj. jsouv programu), s daty promitani.
Projekce: SELECT
Selekce: FROM
Podminka:
WHERE
Seskupeni podle stejnych hodnot: GROUP BY
Kriterium setrideni: ORDER BY
Priklad: Naleznete ISBN knih, jejichz cena neni rovna cene zadne z knih z Velke Britanie.
SELECT ISBN FROM EXEMPLAR WHERE CENA NOT IN (SELECT EXEMPLAR.CENA FROM EXEMPLAR WHERE EXEMPLAR.ZEME_VYDANI='GB')
Navrhem relacniho schematu databaze rozumime jakesi rozmisteni atributu z dane mnoziny do jedntlivych schemat relaci. Obvyklym postupem byva nalezeni funkcnich zavislosti: necht A = {A1, A2,..., An} je relacni schema, X, Y jsou podmnozinou A. Rekneme, ze Y funkcne zavisi na X (znacime X -> Y), jestlize pro kazdou instanci databaze r nad A plati: pro vsechna t1, t2 z r: t1.X=t2.X -> t1.Y=t2.Y.
Pri navrhu databaze se snazime udrzet "co nejvyssi" normalni formu. Normalni formy jsou definovany takto:
Castecna zavislost je zavislost neklicoveho atributu na podmnozine klice.
Tranzitivni zavislost: atribut C je tranzitivne zavisly na X, pokud plati X -> Y - > C a neplati Y -> X, kde X, Y jsou podmnoziny mnoziny vsech atributu a C se v X ani v Y nevyskytuje.
Trivialni zavislost: pokud Y je podmnozinou X, pak X -> Y.
Dekompozici schematu relace rozumime rozklad mnoziny vsech atributu do podmnozin. Dekompozice ma vlastnost pokryti zavislosti, je-li sjednoceni uzaveru na jednotlivych dekomponovanych funkcnich zavislostech totozny s uzaverem vsech funkcnich zavislosti (uzaver F+ je mnozina vsech funkcnich zavislosti odvoditelnych z F).
Dekompozice by mela mit vlastnost bezeztratoveho spojeni - kazdou pripustnou relaci S* by melo byt mozne rekonstruovat pomoci prirozeneho spojeni S* na atributy jednotlivych relaci dekompozice.
Tvrzeni: Mejme schema R(A,B,C), kde A, B, C jsou disjunktni mnoziny atributu, a funkcni zavislost B -> C. Rozlozime-li R na schemata R1(B,C) a R2(A,B), je takto provedena dekompozice bezeztratova. Naopak, je-li dekompozice R1(B,C) a R2(A,B), musi platit bud B -> C, nebo B -> A.
Dekompozice obecne muze mit vlastnost bezeztratoveho spojeni, nemusi vsak mit vlastnost pokryti zavislosti.
Nyni popiseme dva algoritmy navrhu schematu relacni databaze: shora dolu (dekompozice relacnich schemat) a zdola nahoru (synteza relacnich schemat). Dulezitymi predpoklady jsou predpoklad schematu univerzalni relace (jmeno atributu je jednoznacne a hraje pouze jednu roli) a predpoklad jednoznacnosti vztahu (pro kazdou mnozinu atributu existuje nejvyse jeden typ vztahu). Nasim cilem bude 3NF nebo BCNF, pokusime se o splneni vlastnosti pokryti zavislosti a vlastnosti bezeztratoveho spojeni.
Vstup: F nad mnozinou atributu O schematu relace R(O)
Vystup:
relacni schema databaze R = {Ri(Oi,Fi)} obsazene v RESULT
begin RESULT := {R}; DONE := FALSE; Vytvor F; while (not DONE) do if (v RESULT existuje Ri, ktere neni v BCNF) then begin necht X -> Y je netrivialni funkcni zavislost v Ri(O) a necht X -> Oi neni v F+; RESULT := (RESULT - Ri(Oi)) sjednoceno s Ri(Oi - Y) sjednoceno s Rj(XY) end; else DONE := TRUE end
Vysledne schema je v BCNF a dekompozice ma vlastnost bezeztratoveho spojeni, nemusi vsak byt zachovana vlastnost pokryti zavislosti.
Algoritmus syntezy vychazi ze zadane mnoziny atributu a funkcnich zavislosti. Vytvori se minimalni pokryti (pokryti mnoziny funkcnich zavislosti F je G takova, ze F+ = G+; neredundantni pokryti neobsahuje redundantni zavislosti; minimalni pokryti - neredundantni pokryti, ktere neobsahuje v jednotlivych zavislostech na leve strane zadne redundantni atributy) a zavislosti se roztridi tak, aby v kazde skupine byly zavislosti se stejnou levou stranou. Atributy zavislosti skupiny tvori schema jedne relace vznikle syntezou, atributy leve strany zaroven tvori klic schematu. Schemata s ekvivalentnimi klici je vhodne sloucit do jednoho schematu. Atributy, ktere se v zadne skupine nevyskytuji, lze pripojit k libovolnemu schematu ci pro ne vytvorit samostatnou relaci.
Vysledek syntezy je v 3NF, zavislosti jsou zachovany, bezeztratovost splnena byt nemusi.
© Pavel Machek
Transakce by mohla vypadat treba takhle:
Begin_transaction Zmena_cisla_ctenare input(stare_cislo, nove_cislo); read (temp, CTENAR.C_CT = stare_cislo); if temp = empty then begin output("ctenar neexistuje") ROLLBACK end else begin modify1(CTENAR, stare_cislo, nove_cislo); modify2(VYPUJCKY, stare_cislo, nove_cislo); modify3(REZERVACE, stare_cislo, nove_cislo); end COMMIT end_transaction
ROLLBACK znamena "vrat databazi do stavu, v jakem byla pred zacatkem transakce" (v nasem priklade se provede nop - prazdna transakce, protoze pred ROLLBACK neni zadny zapis). COMMIT znamena "databaze je znovu konzistentni, ucin zmenu permanentni".
Transakce by mela splnovat vlastnosti ACID: