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 [2026/06/16 21:50] (current) – [Boyce-Coddova normální forma (BCNF)] badinmic | ||
|---|---|---|---|
| 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 430: | Line 465: | ||
| * Přísnější než 3NF – eliminují se i závislosti, | * Přísnější než 3NF – eliminují se i závislosti, | ||
| - | * Příklad porušení | + | * Příklad porušení |
| * Relace `{__StudentID__, | * Relace `{__StudentID__, | ||
| * `CourseID` → `Instructor` | * `CourseID` → `Instructor` | ||
| 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. |
| - | </ | + | |