Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
statnice:bakalar:b0b36dbs [2025/06/04 22:16] zapleka3statnice: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í, objektově-relační mapování, noSQL databáze. ====+====== Konceptuální a logický datový model, dotazovací jazyk SQL, transakční zpracování, objektově-relační mapování, noSQL databáze. ======
  
 [[https://fel.cvut.cz/cz/education/bk/predmety/50/10/p5010606.html|B0B36DBS]] [[https://www.ksi.mff.cuni.cz/~svoboda/courses/202-B0B36DBS/|Webové stránky předmětu]] [[https://fel.cvut.cz/cz/education/bk/predmety/50/10/p5010606.html|B0B36DBS]] [[https://www.ksi.mff.cuni.cz/~svoboda/courses/202-B0B36DBS/|Webové stránky předmětu]]
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), kde:
 +    * **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ů**, která **jednoznačně identifikuje každý řádek** (n-tici) v relaci.
 +  * 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íč**, ale ne každý nadklíč je klíč.
 +  
 +  * Příklad:
 +    * Uživatel(ID, jméno, e-mail)
 +    * 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ů)**, který odkazuje na **primární klíč jiné relace**.
 +  * 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)
 +    * `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.
-  1. Najdeme jakýkoliv klíč `K`. +  Najdeme jakýkoliv klíč `K`. 
-  2. Vybereme funkční závislost `X → y` z `F` takovou, že `y ∈ K`, nebo ukončíme algoritmus pokud taková neexistuje. +  Vybereme funkční závislost `X → y` z `F` takovou, že `y ∈ K`, nebo ukončíme algoritmus pokud taková neexistuje. 
-  3. Vytvoříme množinu `K' = X ∪ (K \ {y})`. +  Vytvoříme množinu `K' = X ∪ (K \ {y})`. 
      * Jelikož platí `X ∪ (K \ {y}) → A`, je `K'` superklíč.      * Jelikož platí `X ∪ (K \ {y}) → A`, je `K'` superklíč.
-  4. Redukujeme levostranné atributy závislosti `K' → A`, a získáme nový **minimální** klíč `K'`. +  -  Redukujeme levostranné atributy závislosti `K' → A`, a získáme nový **minimální** klíč `K'`. 
-  5. Pokud `K'` není v množině dosud nalezených klíčů, přidáme jej, položíme `K := K'` a pokračujeme na krok 2. +  Pokud `K'` není v množině dosud nalezených klíčů, přidáme jej, položíme `K := K'` a pokračujeme na krok 2. 
-  6. Pokud už existuje, algoritmus končí.+  Pokud už existuje, algoritmus končí.
  
 ==== Normální formy ==== ==== Normální formy ====
Line 377: Line 412:
  
   * Relace **nesplňující** 1NF:   * Relace **nesplňující** 1NF:
- +<markdown> 
-    jméno příjmení | adresa                                +|**jmeno**|**prijmeni**|**adresa**
-    |-------|----------|----------------------------------------| +|---|---|---| 
-    | Josef | Novák    | Technická 2, Praha 16627               +|Josef|Novák|Technická 2, Praha 16627| 
-    | Petr  | Pan      | Karlovo náměstí 13, Praha 12135        |+|Petr|Pan|Karlovo náměstí 13, Praha 12135| 
 +</markdown>
  
   * Relace **splňující** 1NF:   * Relace **splňující** 1NF:
- +<markdown> 
-    jméno příjmení | ulice             číslo město PSČ   +|**jmeno**|**prijmeni**|**ulice**|**cislo**|**mesto**|**psc**
-    |-------|----------|--------------------|--------|--------|--------| +|---|---|---|---|---|---| 
-    | Josef | Novák    Technická          | 2      | Praha  | 16627  +|Josef|Novák|Technivká|2|Praha|16627| 
-    | Petr  | Pan      | Karlovo náměstí    | 13     | Praha  | 12135  |+|Petr|Pan|Karlovo náměstí|13|Praha|12135| 
 +</markdown>
  
 === Druhá normální forma (2NF) === === Druhá normální forma (2NF) ===
Line 428: Line 465:
     * Přísnější než 3NF – eliminují se i závislosti, kde `A` je klíčový atribut, ale `X` není superklíč.     * Přísnější než 3NF – eliminují se i závislosti, kde `A` je klíčový atribut, ale `X` není superklíč.
  
-  * Příklad porušení 3NF, které ještě **není** porušením BCNF:+  * Příklad porušení BCNF, které ještě **není** porušením 3NF:
     * Relace `{__StudentID__, CourseID, Instructor}`     * Relace `{__StudentID__, CourseID, Instructor}`
     * `CourseID` → `Instructor`     * `CourseID` → `Instructor`
Line 439: Line 476:
  
 ==== Transakční zpracování ==== ==== Transakční zpracování ====
-<markdown> +  * Transakce je posloupnost operací (část programu), která přistupuje a aktualizuje (mění) data. 
-- transakce je posloupnost operací (část programu), která přistupuje a aktualizuje (mění) data. +  Transakce pracuje s konzistentní databází. 
-Transakce pracuje s konzistentní databází. +  Během spouštění transakce může být databáze v nekonzistentním stavu. 
-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í. 
-Ve chvíli, kdy je transakce úspěšně ukončena, databáze musí být konzistentní. +  Dva hlavní problémy:  
-Dva hlavní problémy:  +    Různé výpadky (např. chyba hardware nebo pád systému) 
- Různé výpadkynapř. chyba hardware nebo pád systému +    Souběžné spouštění více transakcí 
- Souběžné spouštění více transakci +
-</markdown>+
 ==== ACID vlastnosti ==== ==== ACID vlastnosti ====
-<markdown> +  * 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 – transakce je atomickábuď se provede celánebo vůbec
- **A**tomicity transakce atomická buď se podaří a provede se celá nebo nic. Nelze vykonat jen část transakce+    **C**onsistency – transakce zachovává konzistenci dat a integritní omezení. 
- **C**onsistency transakce - konkrétní transformace stavu, zachování invariant - integritní omezení. +    **I**solation – transakce se navzájem neovlivňují (jako by běžely sériově)
- **I**solation : (isolace = serializovatelnost). I když jsou transakce vykonány zároveň, tak výsledek je stejný. jako by byly vykonány jedna po druhé+    **D**urability – po COMMIT jsou změny trvaléežijí i pád systému.
- **D**urability po úspěšném vykonání transakce (commit) jsou změny stavu databáze trvalé a to i v ípadě poruchy systému - zotavení chyb.+
  
-</markdown> 
 ==== Akce ==== ==== Akce ====
-<markdown> +  * **Akce na objektech:** `READ``WRITE``XLOCK``SLOCK``UNLOCK` 
-**akce na objektech :** READ, WRITE, XLOCK, SLOCK, UNLOCK +  **Globální akce:** `BEGIN``COMMIT``ROLLBACK` 
-**akce globální :** BEGIN, COMMIT, ROLLBACK +
-</markdown>+
 ==== Transakční historie ==== ==== Transakční historie ====
-<markdown> +  * Posloupnost akcí několika transakcí, zachovávající jejich lokální pořadí. 
-Posloupnost akcí několika transakcí, jež zachovává pořadí akcí, v němž byly prováděny +  Historie (rozvrh) je **sériová**, pokud transakce probíhají jedna po druhé (žádné prokládání operací)
-Historie (rozvrh) se nazývá *sériová*, pokud jsou všechny kroky jedné transakce provedeny před všemi kroky druhé transakce+
-</markdown>+
 ==== Serializovatelnost ==== ==== Serializovatelnost ====
-<markdown> +  * Teorie: transakce se skládají z akcí typu
-Teorie: Nechť se transakce $T$ i skládá následujících elementárních akcí: +    * `READ_i(A)` – čtení objektu `Atransakci `T_i` 
- - $\mathrm{READ}_i(A)$ - čtení objektu $Arámci transakce $T_i$ +    * `WRITE_i(A)` – zápis objektu `Atransakci `T_i` 
- - $\mathrm{WRITE}_i(A)$ - zápis (přepis) objektu $Arámci transakce $T_i$ +    * `ROLLBACK_i` – přerušení transakce `T_i` 
- - $\mathrm{ROLLBACK}_i(A)$ - přerušení transakce $T_i$ +    * `COMMIT_i` – potvrzení transakce `T_i`
- - $\mathrm{COMMIT}_i(A)$ - potvrzení transakce $T_i+
-- Jsou možné 4 případy:+
  
 +<markdown>
 |       | |       |
 |---|---|---| |---|---|---|
Line 483: Line 514:
 |WRITEI(A) - WRITEJ(A)|**Konflikt**|Pořadí má význam| |WRITEI(A) - WRITEJ(A)|**Konflikt**|Pořadí má význam|
 </markdown> </markdown>
 +
 ==== Konflikty ==== ==== Konflikty ====
-<markdown> +  * **WR konflikt (dirty read)** – jedna transakce zapíše, druhá čte nekompletní data. 
-*WR konflikt* jedna transakce data zapíše, druhá je čte předtím než byla commited, tzv. *dirty read* +  * **RW konflikt (unrepeatable read)** – jedna čtedruhá přepíše data dřív, než první skončí. 
-*RW konflikt* - transakce čte data a druhá je zapíše předtím než byla ta první ukončena, tzv. *unrepeatable read* +  * **WW konflikt (blind write)** – dvě transakce zapíší na stejné místo bez koordinace. 
-*WW konflikt* - přepis dat, která ještě nebyla commited, tzv. *blind write* +  * **Konfliktová ekvivalence** – dvě historie sdílejí stejné konfliktní páry. 
-- Dvě historie jsou *konfliktově ekvivalentní*, pokud sdílí stejné konfliktní páry +  **Konfliktová uspořádatelnost** – historie je konfliktově ekvivalentní se sériovou historií. 
-- Historie je *konfliktově uspořádatelná*, pokud je konfliktově ekvivalentní s nějakou sériovou historií +  * **Precedenční graf** – směrový graf, kde vrcholy jsou transakcehrany značí konflikty. 
-*Precedenční graf* je směrový graf, kde vrcholy jsou transakce hrany jsou konfliktní páry mezi transakcemi +    Pokud je **acyklický**, historie je serializovatelná. 
- Pokud je acyklický, je historie sériově uspořádatelná +
-</markdown>+
 ==== Zamykání ==== ==== Zamykání ====
-<markdown> +  * Způsob **pesimistické kontroly souběhu** pomocí zámků. 
-Způsob tzv. *pesimistické kontroly* v plánovači transakcí +  * **Zamykací protokol** zajišťuje konfliktní serializovatelnost. 
-*Zamykací protokol* je protokol, který zamyká entity tak, aby byla zabezpečena konfliktní serializovatelnost +  * Typy zámků: 
-- Dva druhy zámků +    * **XLOCK (exkluzivní zámek)** – pouze pro jednu transakci, umožňuje zápis čtení. 
- *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)** – umožňuje více transakcím číst. 
-*Sdílený zámek$S(A)$ je zámek, který může být držen více transakcemiale umožňuje pouze zápis, nikoliv čtení +    * **UNLOCK** – uvolnění zámku. 
-- Navíc je definována operace odemykání $U(A)$ +
-</markdown>+
 ==== Dvoufázové zamykání (2PL) ==== ==== Dvoufázové zamykání (2PL) ====
-<markdown> +  * Transakce: 
-- Pokud transakce chce číst (zapisovatentitu $A$, musí nejprve získat sdílený (exkluzivnízámek na tuto entitu +    * Nejprve pouze **získává** zámky (růstová fáze)
-- Transakce nesmí zažádat o zámek na entitu $A$ pokud jej předtím už uvolnila +    * Poté je **pouze uvolňuje** (klesající fáze). 
-Zajišťuje acykličnost precedenčního grafu +  Zajišťuje **serializovatelnost**, ale **nezajišťuje zotavitelnost** (možné kaskádové zrušení).
-- Nezajišťuje zotavitelnost (ž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) +
-</markdown>+
  
 === Striktní dvoufázové zamykání (Strict 2PL) === === Striktní dvoufázové zamykání (Strict 2PL) ===
-<markdown> +  * Všechny zámky jsou **drženy až do COMMIT/ROLLBACK**. 
-Zajišťuje zotavitelnost a kaskádovité přerušování +  Zajišťuje zotavitelnost i prevenci kaskádového přerušení. 
-- Všechny zámky může transakce pustit až poté co je ukončena + 
-</markdown> +==== Uváznutí (Deadlock) ==== 
-==== Uváznutí (deadlock) ==== +  * Nastane, když každá transakce čeká na zámek držený jinou transakcí. 
-<markdown> +  * Reprezentace pomocí **grafu čekání**: 
-- Situace, která nastane, když všechny transakce čekají až jiná transakce uvolní zámek +    Vrcholytransakce 
-- Lze identifikovat pomocí tzv. *grafu čekání* +    Hrana `T₁ → T₂`: `T₁` čeká na zámek držený `T₂` 
- Vrcholy jsou jednotlivé transakce +    * **Cyklus = deadlock** 
- Hrana z $T_1$ do $T_2$ říká, že transakce $T_1$ čeká až $T_2$ uvolní zámek + 
- - Pokud je v grafu cyklus, došlo k uváznutí +=== Metody prevence řešení uváznutí === 
-</markdown> +  * **Detekce:** pomocí grafu čekánípřeruší se jedna transakce. 
-=== Metody prevence/řešení uváznutí === +  * **Prevence:** 
-<markdown> +    **Wait-Die:** starší čeká, mladší umírá (rollback). 
-- Přerušení transakce a restart +    **Wound-Wait:** starší zabije mladší, jinak čeká
-Detekce uváznutí pomocí grafu čekání přerušení transakce na základě nějakého kritéria (například transakce, která vykonala nejméně práce) +  * **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á dálepokud ne, tak je ukončena +
- *wound-wait- pokud má čekající transakce vyšší prioritu tak ukončí transakci, která drží zámek, který potřebuje, jinak čeká dále +
-</markdown>+
 === Coffmanovy podmínky === === Coffmanovy podmínky ===
-<markdown> +Uváznutí může nastatpokud platí všechny 4 podmínky: 
-- K uváznutí může nastat pokud platí všechny z následujících podmínek +  - **Vzájemné vyloučení** – prostředky nejsou sdílené. 
-1. *Vzájemné vyloučení* - zdroje nejsou plně sdíleny a jsou drženy exkluzivně +  - **Zadržení a čekání** – proces drží a zároveň žádá další. 
-2. *Držení zdrojůdalší zdroje mohou být vyžadovány i když už jsou jiné drženy +  - **Žádná preempce** – prostředky nejsou vynuceně odebrány. 
-3. *Žádná preempce* - zdroje mohou být vypuštěny pouze dobrovolně +  - **Kruhové čekání** – cyklická závislost v čekání. 
-4. *Kruhové čekání* - transakce čekají a vyžadují zdroje kruhu +  * Pokud **aspoň jedna podmínka neplatí**, uváznutí nemůže nastat. 
-- Nenaplnění jakékoliv z těchto podmínek stačí na prevenci uváznutí +
-</markdown>+
 ==== Fantom ==== ==== Fantom ====
-<markdown> +  * 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 čte množinu řádků podle podmínky (např. WHERE cena < 1000). 
-Jedna transakce pracuje s nějakou množinou entitzatímco druhá transakce tuto množinu změ +  * Jiná transakce mezitím přidá nový záznamkterý podmínce odpovídá. 
-- Můžvést k nekonzistentní databázi +  * První transakce je **ovlivněna novým záznamem**, i když už měla dané zámky. 
-- 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. 
-</markdown>+
Navigation

Playground

QR Code
QR Code statnice:bakalar:b0b36dbs (generated for current page)