Relációs sémák tervezése
Cél: az anomáliák és redundancia megszüntetése
A tervezéshez a poorly designed Főnökök(név, cím, kedveltSörök, kedvencSör) fogjuk használni
Anomáliák
Törlési anomália
- Az éppen nem aktív kapcsolatról minden adatot elveszíthetünk
- Mi van akkor, ha jelen pillanatban már senki sem szereti a Bud-ot, ki tudjuk találni, ki gyártotta
- segítek, nem, lmao
Módosítási anomália
- Biztosan minden érintett sort módosítani fogunk?
- Ha Janeway- ből Judy lesz, minden sorral meg fogjuk tenni?
Beszúrási anomália
- A kapcsolatnak létrehozáskor léteznie kell
- Mi van, ha a főnök nem iszik sört egyáltalán??
Relációk felbontása
\(R\) relációt, \(\{A_1,A_2, \ldots,A_n\}\) attribútumokkal helyettesítjük az \(S(B_1,B_2,\ldots,B_m)\) és \(K(C_1,C_2,\ldots,C_k)\) relációkkal úgy, hogy
Veszteségmentes felbontás
- Ha \(r = \Pi_{R_1}(r)\Join\ldots\Join\Pi_{R_k}(r)\) teljesül, akkor az előbbi összekapcsolás veszteségmentes
- \(\Pi_{R_i}(r)\) az \(r\) sorainak \(R_i\) attribútumaira projektálva
- \(r\subseteq\Pi_{R_1}(r)\Join\ldots\Join\Pi_{R_k}(r)\) mindíg teljesülni fog
R R1 R2
A | B | C A | B B | C
----------- ------- ------
a | b | c a | b b | c
d | e | f d | e e | f
c | b | c c | b
Boyce-Codd normálforma - BCNF
Egy \(R\) reláció BCNF-ban van, ha minden \(X\to Y\) nemtriviális FF-re \(R\)-ben X szuperkulcs
- Nemtriviális: \(Y\not\subseteq X\)
- Szuperkulcs: tartalmaz kulcsot (ő maga is lehet kulcs)
A Főnökök(név, cím, kedveltSörök, kedvencSör) példa esetén
- FF-ek:
név → cím kedveltSör,kedveltSörök → gyártó - Egy kulcs van:
{név, kedveltSörök} - A FF esetén sem szuperkulcs a bal oldal
- Ketten kulcsot alkotnak, remember, akkor semelyik rész sem szuperkulcs magában
- Konklúziónk az, hogy a
Főnökökreláció nincs BCNF-ben
BCNF-re való felbontás
- Adott \(R\) reláció, és \(F\) funkcionális függőségek
- Van-e olyan \(X\to Y\) FF, ami cérti a BCNF-t?
- Ha előáll egy olyan következmény \(F\) FF-ben, ami sérti a BCNF-t, akkor valamelyik \(F\)-beli FF is sérti
- Kiszámoljuk \(X^+\)-t
- Ha nem jelenik meg az összes attribútum, akkor \(X\) nem szuperkulcs!
R dekomponálása \(X\to Y\) felhasználásával
- \(R\)-t két részre bontjuk
- \(R_1=X^+\)
- \(R_2 = R -(X^+ - X)\)
- Vagy \(R_2 = (R \ X^+)\cup X\)
- A meglévő FF-eket projektáljuk a két új relációsémára
Dekomponálás - Diagram

Dekomponálás - Példa
Főnökök(név, cím, kedveltSörök, gyártó, kedvencSör)
$F= $ név → cím, név → kedvencSör, kedveltSörök → gyártó
Vegyük a név → cím FF-t
A dekomponálás eredménye:
- Főnökök1(név, cím, kedvencSör)
- Főnökök2(név, kedveltSörök, gyártó)
Ellenőrizzük, hogy az új Főnökök1 és Főnökök2 BCNF-ben van-e
Az FF-ek projektálása könnyű
- Főnökök1(név, cím, kedvencSör)
- FF-ek:
név → cím,név → kedvencSör - Egyetlen kulcs: \(\{\text{név}\}\), tehát BCNF-ben van
- FF-ek:
- Főnökök2(név, kedveltSörök, gyártó)
- Egyetlen FF:
kedveltSörök → gyártó - Egyetlen kulcs: \(\{\text{név}, \text{kedveletSörök}\}\)
- Sérül a BCNF 🤯
- Egyetlen FF:
Bontsuk tovább a Főnökök2(név, cím, kedveltSörök, gyártó)-r
A dekomponálásból lesznek:
- Főnökök3(kedveltSörök, gyártó)
- Főnökök4(név, kedveltSörök)
Dekomponálás - Kimenet

Így már lehet antialkoholista vezetőnk, ott egyszerűen
NULL-ra vesszük fel a kapcsolatot
Mért működik a BCNF?
- Egy reláció bármely veszteségmentes felbontásán egyik elemét annal veszteségmentes felbontásával helyettesítjük, az továbbra is veszteségmentes marad
- Minden két attribútumú séma BCNF-ben van
- Láthatóan működik, sajnos a függőségek vetítése miatt exponenciális lépésszámú is lehet
Chase-test
- Példának adott \(R(A,B,C,D),\;F=\{A\to B,\;B\to C,\;CD\to A\}\), illetve az \(R_1(A,D),\;R_2(A,C),\;R_3(B,C,D)\) felbontások
- Veszteségmentes-e ez így?
- Vegyük a \(\orange{t=(a,b,c,d)}\) sorát a \(R_1\Join R_2\Join R_3\) összekapcsolásnak
- Bizonyítani kell, hogy \(t\) az \(R\) egy sora, a következő táblánk van:
| A | B | C | D |
|---|---|---|---|
| \(a\) | \(b_1\) | \(c_1\) | \(d\) |
| \(a\) | \(b_2\) | \(c\) | \(d_2\) |
| \(a_3\) | \(b\) | \(c\) | \(d\) |
Az alsóindexek azt mutatják, hogy valami \(t\) -től lehetségesen eltérő elemet látunk
- Ez azt is jelenti, hogy egyáltalán nem biztos, hogy \(t\)-t megtaláltuk
- Az FF-ek segíthetnek feloldani a bizonytalanságokat
- Egy FF alkalmazásával minden ismert heélyettesítést végezzünk el
- A két indexes szimbólum esetén a kissebbiket adjuk át
- Az algotritmus véget ér, ha valamelyik sorban megjelenik \(t\), vagy már nincs több felhasználható szimbólum
Alkalmazzuk sorra az FF-eket, nézzük mit kapunk
| A | B | C | D |
|---|---|---|---|
| \(a\) | \(b_1\) | \(c_1\) | \(d\) |
| \(a\) | \(b_2\) | \(c\) | \(d_2\) |
| \(a_3\) | \(b\) | \(c\) | \(d\) |
| A | B | C | D |
|---|---|---|---|
| \(a\) | \(b_1\) | \(c_1\) | \(d\) |
| \(a\) | \(b_{\green{1}}\) | \(c\) | \(d_2\) |
| \(a_3\) | \(b\) | \(c\) | \(d\) |
| A | B | C | D |
|---|---|---|---|
| \(a\) | \(b_1\) | \(\green{c}\) | \(d\) |
| \(a\) | \(b_1\) | \(c\) | \(d_2\) |
| \(a_3\) | \(b\) | \(c\) | \(d\) |
| A | B | C | D |
|---|---|---|---|
| \(a\) | \(b_1\) | \(c\) | \(d\) |
| \(a\) | \(b_1\) | \(c\) | \(d_2\) |
| \(\orange{a}\) | \(\orange{b}\) | \(\orange{c}\) | \(\orange{d}\) |
Lényegében a Függőség megkötési segítenek