Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
statnice:bakalar:b0b36dbs [2025/06/04 22:20] – [Normální formy] zapleka3 | statnice:bakalar:b0b36dbs [2025/06/14 21:53] (current) – [Transformace ER schématu do relačního schématu] prokop | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | ==== Konceptuální a logický datový model, dotazovací jazyk SQL, transakční zpracování, | + | ====== Konceptuální a logický datový model, dotazovací jazyk SQL, transakční zpracování, |
[[https:// | [[https:// | ||
Line 88: | Line 88: | ||
* Operace: prohledávání grafu, porovnávání vzorů, grafové algoritmy. | * Operace: prohledávání grafu, porovnávání vzorů, grafové algoritmy. | ||
* Použití např.: RDF, FlockDB, sociální sítě. | * Použití např.: RDF, FlockDB, sociální sítě. | ||
+ | |||
+ | ==== Relační model ==== | ||
+ | |||
+ | === Definice === | ||
+ | * Relační model je **teoretický základ relačních databází**. | ||
+ | * Informace jsou uloženy v **relacích** (tabulkách), | ||
+ | * **relace** = množina n-tic (řádků), | ||
+ | * **atribut** = sloupec tabulky, | ||
+ | * každá relace má svůj **název** a **schéma** (atributy a jejich domény). | ||
+ | |||
+ | * Relace je matematicky definována jako **množina** (žádné duplicitní řádky). | ||
+ | |||
+ | === Klíč (Key) === | ||
+ | * Klíč je **množina atributů**, | ||
+ | * Pokud existuje více klíčů, označujeme jeden jako **primární klíč** (primary key). | ||
+ | * Klíč musí být **minimální** – žádný jeho podmnožinový soubor nesmí být klíčem. | ||
+ | |||
+ | === Nadklíč (Superkey) === | ||
+ | * Nadklíč je **množina atributů, která jednoznačně identifikuje řádky**, ale **nemusí být minimální**. | ||
+ | * Každý **klíč je zároveň nadklíč**, | ||
+ | | ||
+ | * Příklad: | ||
+ | * Uživatel(ID, | ||
+ | * Nadklíč: {ID, jméno}, {ID, e-mail}, {ID, jméno, e-mail} | ||
+ | * Klíč: {ID} | ||
+ | |||
+ | === Cizí klíč (Foreign Key) === | ||
+ | * Cizí klíč je **atribut (nebo více atributů)**, | ||
+ | * Zajišťuje **referenční integritu** mezi dvěma tabulkami. | ||
+ | * Při vkládání nebo mazání hodnot musí být zachována návaznost mezi tabulkami. | ||
+ | |||
+ | * Příklad: | ||
+ | * Tabulka `Objednávka`(ID, | ||
+ | * `zákazník_id` je cizí klíč do `Zákazník`(ID) | ||
+ | |||
==== Transformace ER schématu do relačního schématu ==== | ==== Transformace ER schématu do relačního schématu ==== | ||
Line 360: | Line 395: | ||
==== Lucchesi-Osbornův algoritmus ==== | ==== Lucchesi-Osbornův algoritmus ==== | ||
* Algoritmus k nalezení **všech** klíčů relačního schématu. | * Algoritmus k nalezení **všech** klíčů relačního schématu. | ||
- | | + | |
- | | + | |
- | | + | |
* Jelikož platí `X ∪ (K \ {y}) → A`, je `K'` superklíč. | * Jelikož platí `X ∪ (K \ {y}) → A`, je `K'` superklíč. | ||
- | | + | |
- | | + | |
- | | + | |
==== Normální formy ==== | ==== Normální formy ==== | ||
Line 441: | Line 476: | ||
==== Transakční zpracování ==== | ==== Transakční zpracování ==== | ||
- | < | + | * Transakce |
- | - transakce | + | |
- | - Transakce pracuje s konzistentní databází. | + | |
- | - Během spouštění transakce může být databáze v nekonzistentním stavu. | + | |
- | - Ve chvíli, kdy je transakce úspěšně ukončena, databáze musí být konzistentní. | + | |
- | - Dva hlavní problémy: | + | |
- | - Různé výpadky, např. chyba hardware nebo pád systému | + | |
- | - Souběžné spouštění více transakci | + | |
- | </ | + | |
==== ACID vlastnosti ==== | ==== ACID vlastnosti ==== | ||
- | < | + | * K zachování konzistence a integrity databáze, transakční mechanismus musí zajistit: |
- | - K zachování konzistence a integrity databáze, transakční mechanismus musí zajistit: | + | |
- | - **A**tomicity | + | |
- | - **C**onsistency | + | |
- | - **I**solation | + | |
- | - **D**urability | + | |
- | </ | ||
==== Akce ==== | ==== Akce ==== | ||
- | < | + | |
- | - **akce na objektech :** READ, WRITE, XLOCK, SLOCK, UNLOCK | + | |
- | - **akce | + | |
- | </ | + | |
==== Transakční historie ==== | ==== Transakční historie ==== | ||
- | < | + | * Posloupnost akcí několika transakcí, |
- | - Posloupnost akcí několika transakcí, | + | |
- | - Historie (rozvrh) | + | |
- | </ | + | |
==== Serializovatelnost ==== | ==== Serializovatelnost ==== | ||
- | < | + | * Teorie: |
- | - Teorie: | + | * `READ_i(A)` – čtení objektu |
- | - $\mathrm{READ}_i(A)$ - čtení objektu | + | * `WRITE_i(A)` – zápis objektu |
- | - $\mathrm{WRITE}_i(A)$ - zápis | + | * `ROLLBACK_i` – přerušení transakce |
- | - $\mathrm{ROLLBACK}_i(A)$ - přerušení transakce | + | * `COMMIT_i` – potvrzení transakce |
- | - $\mathrm{COMMIT}_i(A)$ - potvrzení transakce | + | |
- | - Jsou možné 4 případy: | + | |
+ | < | ||
| | | | ||
|---|---|---| | |---|---|---| | ||
Line 485: | Line 514: | ||
|WRITEI(A) - WRITEJ(A)|**Konflikt**|Pořadí má význam| | |WRITEI(A) - WRITEJ(A)|**Konflikt**|Pořadí má význam| | ||
</ | </ | ||
+ | |||
==== Konflikty ==== | ==== Konflikty ==== | ||
- | < | + | * **WR konflikt |
- | - *WR konflikt* | + | |
- | - *RW konflikt* | + | |
- | - *WW konflikt* | + | * **Konfliktová ekvivalence** – dvě historie |
- | - Dvě historie | + | |
- | - Historie je *konfliktově | + | * **Precedenční graf** – směrový graf, kde vrcholy jsou transakce, hrany značí konflikty. |
- | - *Precedenční graf* je směrový graf, kde vrcholy jsou transakce | + | |
- | - Pokud je acyklický, | + | |
- | </ | + | |
==== Zamykání ==== | ==== Zamykání ==== | ||
- | < | + | * Způsob |
- | - Způsob | + | * **Zamykací protokol** zajišťuje |
- | - *Zamykací protokol* | + | * Typy zámků: |
- | - Dva druhy zámků | + | * **XLOCK |
- | - *Exkluzivní zámek* $X(A)$ je zámek, který může držet pouze jedna transakce, pouze transakce, která drží zámek $X(A)$, pak může přistupovat k entitě $A$ | + | * **SLOCK |
- | - *Sdílený zámek* $S(A)$ je zámek, který může být držen více transakcemi, ale umožňuje | + | * **UNLOCK** – uvolnění zámku. |
- | - Navíc je definována operace odemykání $U(A)$ | + | |
- | </ | + | |
==== Dvoufázové zamykání (2PL) ==== | ==== Dvoufázové zamykání (2PL) ==== | ||
- | < | + | * Transakce: |
- | - Pokud transakce chce číst | + | * Nejprve pouze **získává** zámky |
- | - Transakce nesmí zažádat o zámek na entitu $A$ pokud jej předtím už uvolnila | + | * Poté je **pouze uvolňuje** |
- | - Zajišťuje | + | |
- | - Nezajišťuje zotavitelnost (může se stále stát, že transakce uvolní všechny zámky, jiná po ní pokračuje a je ukončena a potom je první transakce přerušena) | + | |
- | </ | + | |
=== Striktní dvoufázové zamykání (Strict 2PL) === | === Striktní dvoufázové zamykání (Strict 2PL) === | ||
- | < | + | * Všechny zámky jsou **drženy až do COMMIT/ |
- | - Zajišťuje zotavitelnost | + | |
- | - Všechny zámky může transakce pustit až poté co je ukončena | + | |
- | </ | + | ==== Uváznutí (Deadlock) ==== |
- | ==== Uváznutí (deadlock) ==== | + | * Nastane, když každá transakce |
- | < | + | * Reprezentace |
- | - Situace, která nastane, když všechny transakce čekají až jiná transakce | + | |
- | - Lze identifikovat | + | |
- | - Vrcholy | + | * **Cyklus = deadlock** |
- | - Hrana z $T_1$ do $T_2$ říká, že transakce $T_1$ čeká | + | |
- | - Pokud je v grafu cyklus, došlo k uváznutí | + | === Metody prevence |
- | </ | + | * **Detekce:** pomocí grafu čekání, přeruší se jedna transakce. |
- | === Metody prevence/řešení uváznutí === | + | * **Prevence:** |
- | < | + | |
- | - Přerušení transakce a restart | + | * **Wound-Wait:** starší zabije mladší, jinak čeká. |
- | - Detekce | + | * **Strategie výběru oběti:** přeruší se transakce podle délky běhu, počtu zámků apod. |
- | - Dvě strategie na předcházení uváznutí, využívá priority transakcí: | + | |
- | - *wait-die* - pokud má čekající transakce vyšší prioritu tak čeká | + | |
- | - *wound-wait* - pokud má čekající transakce vyšší | + | |
- | </ | + | |
=== Coffmanovy podmínky === | === Coffmanovy podmínky === | ||
- | < | + | Uváznutí |
- | - K uváznutí | + | - **Vzájemné vyloučení** – prostředky |
- | 1. *Vzájemné vyloučení* | + | - **Zadržení |
- | 2. *Držení | + | - **Žádná preempce** – prostředky nejsou vynuceně odebrány. |
- | 3. *Žádná preempce* | + | - **Kruhové čekání** – cyklická závislost |
- | 4. *Kruhové čekání* | + | * Pokud **aspoň jedna podmínka neplatí**, |
- | - Nenaplnění jakékoliv z těchto podmínek stačí na prevenci | + | |
- | </ | + | |
==== Fantom ==== | ==== Fantom ==== | ||
- | < | + | * Specifický problém u transakcí s dotazy přes množiny záznamů. |
- | - Může nastat v databázi, kde jsou vkládány a mazány nové položky | + | |
- | - Jedna transakce | + | * Jiná transakce mezitím přidá nový záznam, který podmínce odpovídá. |
- | - Může vést k nekonzistentní databázi | + | * První |
- | - Může nastat i při striktním dvoufázovém zamykání | + | * Řešení: **zámky na rozsah (range locks)** – např. pomocí indexových struktur. |
- | </ | + |