| tags | vaje, opb, normalizacija |
|---|---|
| hackmd | https://hackmd.io/lM4y6e9DRSi_w-gcOpsl_g |
| plugins | mathjax, mermaid |
Dana je relacija
Lastnosti funkcijskih odvisnosti:
-
Refleksivnost:
$A \in X \Rightarrow X \to A$ -
Tranzitivnost:
$(\forall A \in Y: X \to A) \land Y \to B \Rightarrow X \to B$ -
Povečanje:
$X \to A \Rightarrow XB \to A$
Ključi:
- Množica
$K \subseteq S$ je nadključ, če velja$K \to S$ . - Množica
$K \subseteq S$ je ključ, če je minimalen nadključ - tj., za vsak$A \in K$ velja$K \setminus {A} \not\to S$ .
Normalne oblike:
-
3NF: za vsako funkcijsko odvisnost
$X \to A$ velja$$ A \in X \quad \lor \quad X \text{ vsebuje ključ} \quad \lor \quad A \text{ je del ključa.} $$
-
BCNF: za vsako funkcijsko odvisnost
$X \to A$ velja$$ A \in X \quad \lor \quad X \text{ vsebuje ključ.} $$
Dana je relacija
Izpeljane funkcijske odvisnosti:
Ključi: ACD, BCD, CDE
| fun. odv. | 3NF | BCNF |
|---|---|---|
| ja | ne | |
| ja | ne | |
| ja | ne |
Primer podatkov:
| A | B | C | D | E |
|---|---|---|---|---|
| 1 | a | x | Q | Z' |
| 1 | a | y | R | W |
| 2 | a | x | S | Z' |
| 2 | a | z | S | Z |
Anomalija spreminjanja: če popravimo Z v Z' v stolpcu E prve vrstice, moramo to ponoviti še v tretji vrstici.
graph LR
R["R(AB*C*D*E)"] --- R1["R1(*AB)"]
R --- R2["R2(*B*CE)"]
R --- R3["R3(A*D*E)"]
V SQL lahko za to poskrbimo z določilom ON UPDATE CASCADE pri določitvi tujih ključev.
Imejmo sledeče atribute z ER diagrama letališčne baze:
| oznaka | opis |
|---|---|
| D | datum kontrole |
| E | EMŠO tehnika |
| I | ime testa |
| K | kapaciteta letala |
| M | model letala |
| O | dosežena ocena pri kontroli |
| P | plača tehnika |
| R | reg. št. letala |
| S | oznaka specializacije |
| T | test |
Določi funkcijske odvisnosti med zgornjimi atributi, če lahko test na nekem letalu izvaja samo tisti tehnik, ki je specialist za model letala.
Pretvori shemo v 3NF. Ali se sklada s shemo, dobljeno iz ER diagrama?
Ključi: DERT, DRST
graph LR
R["R(*D*EMO*R*T) kontrola"]
R --- R2["R2(I*T) test"]
R --- R4["R4(M*R) letalo"] --- R3["R3(K*M) model"]
R --- R6["R6(*E*MS) specialist"]--- R5["R5(EM*S) specialist"]
R6 --- R1["R1(*EP) tehnik"]
R6 --- R3
Dane so sledeče podrelacije relacije
-
$R_1(ABCDE)$ ,$A \to B$ ,$C \to D$ -
$R_2(ABF)$ ,$AC \to E$ ,$B \to F$ -
$R_3(AD)$ ,$D \to G$ ,$G \to H$ -
$R_4(DCGH)$ ,$A \to I$ ,$I \to A$ $R_5(ACEI)$
Za vsak primer ugotovi, ali je podrelacija v BCNF, in če ni, jo pretvori v BCNF.
-
Ključ: ACE
Loadinggraph LR R["R(*A*C*E)"] --- R1["R1(*AB)"] R --- R2["R2(*CD)"]
-
Ključ: AB
Loadinggraph LR R["R(*A*B)"] --- R1["R1(*BF)"]
3., 4., 5. so v BCNF.
Dana je relacija
-
$C \to D$ ,$C \to A$ ,$B \to C$ -
$B \to C$ ,$D \to A$ -
$ABC \to D$ ,$D \to A$ -
$A \to B$ ,$BC \to D$ ,$A \to C$ -
$AB \to C$ ,$AB \to D$ ,$C \to A$ ,$D \to B$
Za vsako ugotovi, v kateri normalni obliki je
-
Ključ: B; ni v 3NF
Loadinggraph LR R["R(*BC)"] --- R1["R1(A*CD)"]
-
Ključ: BD; ni v 3NF
Loadinggraph LR R["R(*B*D)"] --- R1["R1(*BC)"] R --- R2["R2(A*D)"]
-
Ključa: ABC, BCD; je v 3NF, ni v BCNF
Loadinggraph LR R["R(*A*B*CD)"] --- R1["R1(A*D)"]
-
Ključ: A, ni v 3NF
Loadinggraph LR R["R(*ABC)"] --- R1["R1(*B*CD)"]
-
Ključi: AB, AD, BC, CD; je v 3NF, ni v BCNF
Loadinggraph LR R["R(*A*BCD)"] --- R1["R1(A*C)"] R --- R2["R2(B*D)"]