OBSAH WEBU
ČTĚTE!
Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.
temata:33-relacni_datovy_model_sql:main [2011/03/29 12:12] sgs |
temata:33-relacni_datovy_model_sql:main [2011/06/02 17:36] (aktuální) vagabund |
||
---|---|---|---|
Řádek 1: | Řádek 1: | ||
- | =====Relační datový model a jazyk SQL===== | + | ~~ODT~~ |
- | ====Jazyk SQL==== | + | ====== Relační datový model a jazyk SQL ====== |
+ | |||
+ | ===== Relační datový model ===== | ||
+ | |||
+ | ==== Relační databáze ==== | ||
+ | |||
+ | <box round green 90%|**Názvosloví**> | ||
+ | |||
+ | * relace = databázová tabulka | ||
+ | * atributy = sloupce tabulky | ||
+ | * hodnota atributu = hodnota n-tice | ||
+ | * obor hodnot atributu = doména (v praxi se doméně říká též datový typ) | ||
+ | * aktivní doména = aktuálně se nacházející hodnoty z domény (to, co je aktuálně v tabulce) | ||
+ | * n-tice = řádky | ||
+ | * "tabulka STUDENT se sloupci JMENO, PRIJMENI, ..." = "relace STUDENT s atributy JMENO, PRIJMENI, ..." | ||
+ | |||
+ | </box> | ||
+ | |||
+ | <box round blue 90%|**Příklad**> | ||
+ | |||
+ | Nechť máme tabulku STUDENT(LOGIN, JMENO, PRIJMENI, ADRESA) asi takto: | ||
+ | |||
+ | ^LOGIN^JMENO^PRIJMENI^ADRESA^ | ||
+ | |xcerny00|Petr|Černý|Brněnská 15 Vyškov| | ||
+ | |xnovak00|Jan|Novák|Cejl 9 Brno| | ||
+ | |xnovak01|Pavel|Novák|Cejl 9 Brno| | ||
+ | |||
+ | **domény atributů**\\ | ||
+ | D<sub>LOGIN</sub> = {xnovak00, xnovak01, xbanan01, xchleba11, ...}\\ | ||
+ | D<sub>JMENO</sub> = {Petr, Pavel, Josef, ...}\\ | ||
+ | D<sub>PRIJMENI</sub> = {Grupa, Sadlo, Zendulka, ...}\\ | ||
+ | D<sub>ADRESA</sub> = {Brněnská 15 Vyškov, Cejl 9 Brno, ...}\\ | ||
+ | |||
+ | **relace = tabulka**\\ | ||
+ | R<sub>STUDENT</sub> <m>\subset</m> D<sub>LOGIN</sub> x D<sub>JMENO</sub> x D<sub>PRIJMENI</sub> x D<sub>ADRESA</sub>\\ | ||
+ | \\ | ||
+ | neboli podmnožina kartézského součinu jednotlivých domén\\ | ||
+ | |||
+ | * schéma tabulky - záhlaví tabulky | ||
+ | * tělo tabulky - její obsah,tj. řádky, tj. n-tice | ||
+ | * domény mohou obsahovat pouze atomické hodnoty (vícehodnotové se převádí na skalární redundancí zbylých sloupců) | ||
+ | |||
+ | </box> | ||
+ | |||
+ | <box green round 90%|**Definice**> | ||
+ | Nechť D1, D2, ..., Dn jsou množiny atomických hodnot označované jako //domény//. //Relace// (databázová) na doménách D1, D2, ..., Dn je dvojice **R** = (R, R<sup>*</sup>), kde R = R(A1:D1, A2:D2, ..., An:Dn) je //schéma// relace, kde Ai (Ai != Aj, i != j) značí jméno atributu definovaného na doméně D<sub>i</sub> a R<sup>*</sup> \subset D<sub>1</sub> x D<sub>2</sub> x ... x D<sub>n</sub> je tělo relace.\\ | ||
+ | |||
+ | Počet atributů n relace se označuje //stupeň (řád) relace//, kardinalita těla relace m = |R<sup>*</sup>| se označuje //kardinalita relace//\\ | ||
+ | |||
+ | Zjednodušené se relace zapisuje R(A1, A2, ..., An), třeba STUDENT(LOGIN, JMENO, PRIJMENI, ADRESA). | ||
+ | </box> | ||
+ | |||
+ | <note tip>Neboli viz příklad</note> | ||
+ | |||
+ | <note tip>Relační databáze - data jsou v tabulkách organizovány v souladu s relačním modelem (relační model - data strukturována na základě relací, tj. tabulek)</note> | ||
+ | |||
+ | |||
+ | <box green round 90%|**Definice**> | ||
+ | Integritní omezení = omezení kladená na data | ||
+ | * obecná omezení - musí platit vždy bez ohledu na aplikaci (např. PK, FK) | ||
+ | * specifiká omezení - závislá na aplikace (maximální délka řetězce, maximální hodnota, ...) | ||
+ | </box> | ||
+ | |||
+ | <box green round 90%|**Definice**> | ||
+ | **Kandidátní klíč (candidate key)** | ||
+ | |||
+ | Atribut CK relace R se nazývá kandidátním klíčem, když splňuje tyto dvě časově nezávislé vlastnosti: | ||
+ | * Hodnoty atributu CK v relaci R jsou unikátní (jednoznačné), tj. neexistují žádné dvě n-tice relace se stejnou hodnotou tohoto atributu. | ||
+ | * Atribut CK je vzhledem k jednoznačnosti hodnot v R minimální (neredukovatelný), tj. je-li CK složeným atributem, nelze vypustit z něho žádnou složku, aniž by přestala být splněna unikátnost hodnot. | ||
+ | </box> | ||
+ | |||
+ | <note tip>Hodnota atributu CK je unikátná, to zn., že se prvek z dané domény vyskytuje nejvýše jednou</note> | ||
+ | |||
+ | <box green round 90%|**Definice**> | ||
+ | **Primární klíč (primary key)** | ||
+ | |||
+ | //Primárním// klíčem je jeden z kandidátních klíčů (vybraný), zbývající kandidátní klíče se nazývají //alternativní// (někdy také sekundární). | ||
+ | </box> | ||
+ | |||
+ | <box green round 90%|**Definice**> | ||
+ | **Pravidlo integrity entit** | ||
+ | |||
+ | U žádné složky primárního klíče nesmí chybět hodnota. | ||
+ | </box> | ||
+ | |||
+ | <box green round 90%|**Definice**> | ||
+ | **Cizí klíč (foreign key)** | ||
+ | |||
+ | Atribut FK relace R2 se nazývá cizí klíč, právě když splňuje tyto časově nezávislé vlastnosti: | ||
+ | * Každá hodnota FK je buď plně zadaná nebo plně nezadaná. | ||
+ | * Existuje relace R1 s kandidátním klíčem CK takovým, že každá zadaná hodnota FK je identická s hodnotou CK nějaké n-tice relace R1 | ||
+ | </box> | ||
+ | |||
+ | <note tip>Neboli hodnota je hodnota nebo NULL, za druhé pro každou hodnota FK musí existovat příslušní PK. Jinak FK vytváří logické vazby mezi tabulkami/relacemi</note> | ||
+ | |||
+ | <box green round 90%|**Definice**> | ||
+ | **Pravidlo referenční integrity** | ||
+ | |||
+ | Relační databáze nesmí obsahovat žádnou nesouhlasnou hodnotu cizího klíče. | ||
+ | </box> | ||
+ | |||
+ | <box green round 90%|**Definice**> | ||
+ | **Schématem relační databáze** nazýváme dvojici (R, I), kde R = {R1, R2, ..., Rk,} je množina schémat relací a I = {I1, I2, ..., Il} je množina | ||
+ | integritních omezení. Někdy jsou lokální integritní omezení rozdělena mezi jednotlivá schémata, tj. R = {(R1, I1) , (R2, I2), ..., (Rk, Ik)} | ||
+ | </box> | ||
+ | |||
+ | <note tip>Neboli každý sloupce má svoje integritní omezení, tj. omezezení kladená na data (co může obsahovat, kde musí být hodnoty, ...)</note><note important>Pokud data v relaci splňují všechny integritní omezení, potom jsou data konzistentní</note> | ||
+ | |||
+ | ==== Relační Algebra ==== | ||
+ | |||
+ | <box green round 90%|**Definice**> | ||
+ | **Relační algebra** | ||
+ | |||
+ | Relační algebrou rozumíme dvojici RA = (R, O), kde nosičem R je množina relací a O je množina operací, která zahrnuje: | ||
+ | * tradiční množinové operace (sjednocení, průnik, rozdíl, součin) | ||
+ | * speciální relační operace, mezi které patří projekce, selekce (restrikce), spojení (přirozené). | ||
+ | </box> | ||
+ | |||
+ | <note important>Tabulka je množina n-tic, proto se každý záznam vyskytuje pouze jednou.</note> | ||
+ | |||
+ | <box green round 90%|**Definice**> | ||
+ | **Operace relační algebry** | ||
+ | |||
+ | //Sjednocením// relací R1 = (R, R1*) a R2 = (R, R2*) se schématem R je relace R1 union R2 = (R, R1* ∪ R2*).\\ | ||
+ | Analogicky pro //průnik// (R1 intersect R2) a //rozdíl// (R1 minus R2).\\ | ||
+ | //Kartézským součinem relací// R1 = (R1, R1*) a R2 = (R2, R2*) je relace R1 times R2 = ( (R1,R2), R1* x R2*).\\ | ||
+ | |||
+ | </box> | ||
+ | |||
+ | <note important>Sjednocení je možné provést pouze pro tabulky se stejnými sloupci. Pokud po sjednocení dostaneme dva a více stejných řádek, bere se jenom jeden.</note> | ||
+ | |||
+ | <box green round 90%|**Definice**> | ||
+ | **Projekce** | ||
+ | Projekce relace R = (R, R*) na atributy X, Y, ..., Z je relace R[X, Y, ..., Z] se schématem (X, Y, ..., Z) a tělem zahrnujícím všechny n-tice t = (x, y, …, z) takové, že v R* existuje n-tice t’ s hodnotou atributu X rovnou x, Y rovnou y, ... Z rovnou z. | ||
+ | </box> | ||
+ | |||
+ | <note tip>Z dané tabulky vybereme jen některé sloupce</note> | ||
+ | |||
+ | <box green round 90%|**Definice**> | ||
+ | **Selekce** | ||
+ | |||
+ | Nechť θ je operátor porovnání dvou hodnot (<, >, <>, =, atd.). θ selekce (restrikce) relace R = (R, R*) na atributech X a Y je relace\\ | ||
+ | R where X θ Y,\\ | ||
+ | která má stejné schéma jako relace R a obsahuje všechny n-tice t ∈ R*, pro které platí x θ y, kde x je hodnota atributu X a y hodnota atributu Y v ntici t. Na místě atributu X, resp. Y může být konstanta. Pak jde o θ selekci na atributu X, resp. Y. | ||
+ | |||
+ | Podle definice máme jenom jednu podmínku. Selekci lze dále rozšířit o spojky and, or, not. | ||
+ | </box> | ||
+ | |||
+ | <note tip>Vybíráme jen některé řádky z tabulky podle dané podmínky</note> | ||
+ | |||
+ | <box green round 90%|**Definice**> | ||
+ | **Přirozené spojení (natural join)** | ||
+ | |||
+ | Nechť R1 = (R1, R1*) je relace se schématem R1(X1,X2,..,Xm,Y1,Y2,...,Yn) a R2 relace se schématem R2(Y1,Y2, ...,Yn, Z1,Z2,...,Zk). Uvažujme složené atributy X=(X1,X2,...,Xm), Y=(Y1,Y2,...,Yn) a Z=(Z1,Z2,...,Zk). Potom přirozené spojení relací R1 a R2 je relace | ||
+ | R1 join R2 se schématem (X, Y, Z) a tělem zahrnujícím všechny n-tice t = (x, y, z) takové, že v R1* existuje n-tice t’ s hodnotou x atributu X a hodnotou y atributu Y a v R2* existuje n-tice t’’ s hodnotou y atributu Y a hodnotou z atributu Z. | ||
+ | </box> | ||
+ | |||
+ | <note tip>Neboli spojujeme podle sloupce se stejným názvem a podle stejné hodnoty</note> | ||
+ | |||
+ | <box blue round 90%|**Příklad**> | ||
+ | **T1** | ||
+ | |||
+ | ^A^B^C^ | ||
+ | |0|a|d| | ||
+ | |1|a|e| | ||
+ | |2|b|f| | ||
+ | |||
+ | **T2** | ||
+ | |||
+ | ^C^D^E^ | ||
+ | |e|1|0| | ||
+ | |d|1|1| | ||
+ | |d|0|1| | ||
+ | |||
+ | **T1 join T2** | ||
+ | ^A^B^C^D^E^ | ||
+ | |0|a|d|1|1| | ||
+ | |0|a|d|0|1| | ||
+ | |1|a|e|1|0| | ||
+ | </box> | ||
+ | |||
+ | <note tip>minimální množina operací relační algebry - sjednocení, rozdíl, kartézský součin, projekce a selekce. Z nich lze vytvořit zbylé operace</note> | ||
+ | |||
+ | <note tip>relačně úplný jazyk - lze vyjádřit alespoň totéž co relačním jazykem</note> | ||
+ | |||
+ | ===== Jazyk SQL ===== | ||
**SQL = structured query language**, je standardizovaný dotazovací jazyk používaný pro práci s daty v relačních databázích | **SQL = structured query language**, je standardizovaný dotazovací jazyk používaný pro práci s daty v relačních databázích | ||
Řádek 143: | Řádek 328: | ||
A zavolat pomocí příkazu: | A zavolat pomocí příkazu: | ||
<code>call sp_vratradky 10, 20)</code> | <code>call sp_vratradky 10, 20)</code> | ||
+ | |||
+ | **Triggery** - Trigger je uložená procedura, která se spouští v souvislosti s provedením nějakého akčního dotazu na | ||
+ | tabulce, nebo taky pouze ten spoustec, ktery ma navazanou uálost, a poté proceduru. | ||
+ | |||
+ | *Česky se tomu někdy říká „spoušť“ | ||
+ | *Trigger je "uložená procedura", to znamená, že uvnitř triggeru lze provádět většinu věcí, které umí uložené procedury. V triggeru lze mít například smyčku, podmínku, lokální proměnnou, matematický výpočet a podobně. | ||
+ | *Spouští se "v souvislosti" s akčním dotazem. Trigger se může spustit buď předtím nebo poté, co jsou změny v datech zapsány do databáze. | ||
+ | *„Akční dotaz“ znamená, že trigger lze spustit při vkládání dat, při jejich aktualizaci nebo při odstraňování dat z databáze | ||
+ | *Mají stejnou syntaxi jako uložené procedury, přesto se od nich v lecčems liší. Triggerům není možné předávat žádné vstupní parametry. | ||
+ | *Triggery navíc narozdíl od uložených procedur nemohou vracet sadu záznamů | ||
+ | *Pro MySQL platí, že se v triggeru nesmí objevit přinejmenším tyto příkazy: Příkazy ALTER, Příkazy pro řízení transakcí (START TRANSACTION, ROLLBACK, COMMIT), Volání procedur (CALL), Příkazy pro nastavování práv (GRANT, REVOKE) a některé další příkazy. | ||
+ | <code>create trigger trSaveRows | ||
+ | before delete | ||
+ | on bezpecna | ||
+ | for each row | ||
+ | begin | ||
+ | insert into bezpecna_zaloha(id, jmeno, plat, cas_odstraneni, | ||
+ | uzivatel) | ||
+ | values (old.id, old.jmeno, old.plat, now(), user()); | ||
+ | end;</code> | ||
+ | |||
+ | EMBEDED SQL / dynamic SQL?? | ||
+ | |||
+ | ===== Potvrzení ===== | ||
+ | |||
+ | <doodle single|33> | ||
+ | ^ OK ^ !!! ^ | ||
+ | </doodle> | ||
+ | |||
+ | {{tag>sgs vagabund IDS relacni_databaze relacni_model sql}} | ||
+ | |||
+ | ~~DISCUSSION~~ |