Adatmodellezés · 3. témakör

Relációs adatmodell és normalizálás

Kulcsok, függőségek és normálformák lépésről lépésre. Egy képzési központ adatain megvizsgáljuk a táblabontást, majd relációs műveletekkel visszakapcsoljuk az összetartozó tényeket.

1NF → 2NF → 3NF → 4NFTáblák és kulcsokRelációs műveletek15 önellenőrző feladat

01 · Relációs modell

A relációs adatmodell alapfogalmai

AlapfogalomA relációs adatmodell az adatokat elnevezett relációkban írja le. Egy reláció meghatározott attribútumokhoz tartozó sorok halmaza; táblázatos megjelenítésében a sorok rekordok, az oszlopok attribútumok.

Az ER-modell azt fogalmazza meg, milyen dolgokat és kapcsolatokat tartunk nyilván. A relációs modell ehhez logikai táblaszerkezetet ad: megnevezi a relációkat, az attribútumokat, az azonosítókat és a hivatkozásokat. Még nem a lemezen elfoglalt helyet vagy az indexek fizikai felépítését tervezzük. A logikai modell alapján később konkrét adatbázis-kezelőben hozhatjuk létre a táblákat.

Egy rekord egy konkrét tényt ír le. A KURZUS reláció egyik sora például a C11 azonosítójú Webes arculat kurzus adatait tartalmazza. A kurzus címe attribútum, a Webes arculat ennek egy értéke. A mező kifejezést a gyakorlatban gyakran az oszlopra használjuk; egy konkrét cella az adott rekord adott attribútumának értékét mutatja.

A reláció fokszáma az attribútumainak száma, kardinalitása pedig a benne lévő rekordok száma. A fejléc nem adatrekord. Az alábbi reláció fokszáma 4, kardinalitása 3. Új kurzus felvételekor a kardinalitás változik, a fokszám ugyanannyi marad; új attribútum bevezetése a sémát módosítja.

Az értéktartomány, más néven domén, az attribútum megengedett értékeit írja le. A férőhely egész szám, nálunk 1 és 40 közötti értékkel; a kurzusazonosító szöveges kód; a cím nem üres szöveg. Az adattípus a technikai lehetőségeket, az üzleti szabály pedig a ténylegesen elfogadható értékeket határozza meg. Egy egész számos oszlop önmagában még nem tiltja a negatív férőhelyet.

A matematikai reláció halmaz: nincs benne két azonos sor, és a sorok sorrendje nem hordoz jelentést. Az attribútumot a neve azonosítja, nem a képernyőn elfoglalt helye. SQL-táblákban és lekérdezési eredményekben megfelelő korlátozás vagy DISTINCT nélkül ismétlődés is előfordulhat; a gyakorlati megvalósítást ezért tudatosan kell a logikai modellhez igazítani.

Három kurzus, négy attribútum
kurzus_idcímférőhelyoktató_id
C11Webes arculat20O7
C12Digitális grafika16O8
C13Adatvizualizáció24O7

Kidolgozott példa · Fokszám és kardinalitás

A táblába felvesszük a C14 kurzust, változatlan oszlopokkal.

  1. A korábbi 3 rekord mellé egy új rekord kerül: a kardinalitás 4 lesz.
  2. A 4 attribútum változatlan: a fokszám továbbra is 4.
  3. Ha hozzáadunk egy kezdés_dátuma attribútumot is, a fokszám 5-re nő.

02 · Relációs modell

Kulcsok: azonosítás és hivatkozás

AlapfogalomA szuperkulcs olyan attribútumhalmaz, amely minden megengedett állapotban egyértelműen azonosítja a rekordot. A kulcsjelölt minimális szuperkulcs: egyetlen attribútumát sem hagyhatjuk el az azonosítóképesség elvesztése nélkül.

A tervezéskor a kulcsjelöltek közül egyet elsődleges kulcsnak választunk. A többi kulcsjelölt alternatív kulcs. A minimális itt nem azt jelenti, hogy az összes jelölt közül a legkevesebb oszlopot tartalmazza: azt jelenti, hogy az adott jelöltnek nincs fölösleges összetevője. Egy egyoszlopos és egy kétoszlopos minimális jelölt egyaránt lehet érvényes.

Az elsődleges kulcs nem ismétlődhet és nem tartalmazhat hiányzó értéket. Jó választás, ha stabil, rövid és minden rekordhoz rendelkezésre áll. A név általában rossz azonosító: két embernek lehet azonos neve, és a név megváltozhat. A mesterséges tanuló_id azonosító megoldja az azonosítást, de önmagában nem tiltja, hogy ugyanazt a személyt tévedésből kétszer vegyük fel.

Összetett kulcsról beszélünk, ha több attribútum együtt szükséges az egyértelmű azonosításhoz. A JELENTKEZÉS relációban a (tanuló_id, kurzus_id) pár megfelelő, ha ugyanaz a tanuló ugyanarra a konkrét kurzuskiírásra legfeljebb egyszer jelentkezhet. Egyik oszlop sem elegendő önmagában. Ha ugyanarra a kiírásra ismételt jelentkezéseket is megőrzünk, más azonosítást kell választani, vagy az esemény sorszámával kell bővíteni a kulcsot.

Az idegen kulcs egy reláció egy vagy több attribútuma, amely egy hivatkozott reláció kulcsértékéhez kapcsolódik. A kurzus oktató_id mezője az OKTATÓ oktató_id kulcsára hivatkozik. A hivatkozott kulcs lehet elsődleges vagy megfelelő egyediségi korlátozással védett alternatív kulcs. Összetett kulcsra a teljes, megfelelő sorrendű és kompatibilis értéktípusú oszlopkombinációval kell hivatkozni.

Az idegen kulcs értéke rendszerint ismétlődhet: több kurzusnak lehet ugyanaz az oktatója. Hiányzó értéket csak akkor engedünk meg, ha a kapcsolat opcionális. Egy kurzushoz itt kötelező oktatót rendelni, ezért az oktató_id nem lehet NULL. Az idegen kulcs oszlopának puszta elnevezése még nem biztosítja a hivatkozások érvényességét; a megvalósításban korlátozást is létre kell hozni.

Kulcstípusok és jelentésük
FogalomPéldaMiért?
Szuperkulcs(tanuló_id, név)Az id már azonosít; a név fölösleges része az azonosítónak.
Kulcsjelölttanuló_idEgyedi, és nincs elhagyható összetevője.
Alternatív kulcstanulói_kódHa garantáltan egyedi és nem hiányzó, másik minimális azonosító.
Összetett elsődleges kulcs(tanuló_id, kurzus_id)A jelentkezés azonosításához mindkettő szükséges.
Idegen kulcsKURZUS.oktató_idLétező oktatói rekordra hivatkozik.

Kidolgozott példa · Azonos név, külön személy

A T101 és T102 azonosítójú tanuló neve egyaránt Szabó Luca.

  1. A név nem különbözteti meg a két rekordot.
  2. A különböző tanuló_id értékek egyértelmű azonosítást adnak.
  3. Ha a tanulói_kód is egyedi az üzleti szabály szerint, azt is egyediségi korlátozással védjük.

03 · Relációs modell

Relációs séma és integritási szabályok

AlapfogalomA relációs séma a reláció nevét, attribútumait és korlátozásait írja le. A reláció aktuális állapota az adott pillanatban tárolt rekordok halmaza.

A tervet rekordok nélkül is megadhatjuk: OKTATÓ(oktató_id, név, email), KURZUS(kurzus_id, cím, férőhely, oktató_id). A kulcsot aláhúzással vagy PK felirattal jelölhetjük. Az idegen kulcsot FK jelölés, a hivatkozott reláció és a célattribútum megnevezése teszi félreérthetetlenné. Fontosabb az egyértelmű jelmagyarázat, mint egy adott rajzolóprogram használata.

A diagramon a nyíl a hivatkozó idegen kulcstól a hivatkozott kulcs felé mutat. Ez a hivatkozás iránya, nem időbeli folyamat vagy adatmozgás. Az oktató–kurzus kapcsolat 1:N: egy kurzus pontosan egy oktatóhoz tartozik, egy oktató pedig nulla vagy több kurzust vezethet. A nyilak mellett a részvétel minimumát és maximumát külön is megadhatjuk.

Az egyedintegritás az elsődleges kulcs egyediségét és hiánytalanságát biztosítja. A hivatkozási integritás azt mondja ki, hogy a nem hiányzó idegenkulcs-értékhez létezzen megfelelő hivatkozott rekord. Az értéktartomány-integritás a típusokat és megengedett értékeket védi. Üzleti szabály például az is, hogy egy pontszám 0 és 100 között lehet.

Mi történjen, ha törölnénk azt az oktatót, akinek még kurzusai vannak? Több érvényes döntés létezik, de ezeket előre rögzíteni kell. Nálunk a törlést elutasítjuk, amíg át nem adjuk a kurzusokat más oktatónak. A kapcsolódó kurzusok automatikus törlése olyan adatvesztést okozna, amelyet ez a nyilvántartás nem kíván. Az automatikus törlés csak megfelelő üzleti indokkal használható.

A kapcsolat egyértelmű szöveges leírása

OKTATÓ(oktató_id PK, név, email)

KURZUS(kurzus_id PK, cím, férőhely, oktató_id FK)

KURZUS.oktató_id → OKTATÓ.oktató_id

KURZUS.oktató_id: kötelező érték; OKTATÓ törlése: csak hivatkozás nélkül

A normalizált séma hivatkozásai
TANULÓtanuló_id PKtanulónévOKTATÓoktató_id PKoktatónévoktatói_emailJELENTKEZÉStanuló_id PK-rész, FKkurzus_id PK-rész, FKjelentkezés_dátumapontszámKURZUSkurzus_id PKkurzuscímoktató_id FKFK → PKJelentkezésenként 1 tanulóKurzusonként 1 oktatóPK = elsődleges kulcs; FK = idegen kulcs.A JELENTKEZÉS PK-ja két attribútumból áll.

A nyilak az idegen kulcstól a hivatkozott kulcs felé mutatnak. A tanulóhoz és kurzushoz nulla vagy több jelentkezés tartozhat; egy jelentkezés pontosan egy tanulóra és egy kurzusra hivatkozik.

Kidolgozott példa · Hivatkozási hiba

Felvennénk a C14 kurzust O99 oktatóazonosítóval, de O99 nem szerepel az OKTATÓ relációban.

  1. A típus megfelelő lehet, de a célrekord nem létezik.
  2. A hivatkozási integritás miatt a műveletet el kell utasítani.
  3. Először rögzítjük az O99 oktatót, vagy más, létező oktatót rendelünk a kurzushoz.

04 · Relációs modell

Funkcionális, teljes, részleges és tranzitív függés

AlapfogalomAz X → Y funkcionális függés azt jelenti, hogy bármely két megengedett rekordban azonos X értékhez azonos Y érték tartozik. X lehet egy attribútum vagy attribútumok együttese; Y szintén lehet több attribútum.

A tanuló_id → tanulónév függés a nyilvántartás szabálya: ugyanazon azonosítóhoz ugyanabban az állapotban egy név tartozik. A fordított függés nem feltétlenül igaz, mert különböző tanulóknak lehet azonos nevük. A függés nem azt jelenti, hogy a név számítással előállítható az azonosítóból; azt jelenti, hogy az azonosító ismeretében egyértelműen megtaláljuk.

Egy mintatáblából függést biztosan cáfolhatunk: két azonos X mellett különböző Y ellenpélda. Néhány sorból azonban általában nem bizonyíthatjuk a szabályt. Ha a jelenlegi kurzuscímek különböznek, attól még nem lesz cím → kurzus_id függés: később azonos című új kiírás is készülhet. A függéseket a teljes életciklusra érvényes követelményekből vezetjük le.

Y teljesen függ X-től, ha X meghatározza Y-t, de X egyetlen valódi részhalmaza sem elegendő ehhez. A jelentkezés dátuma teljesen függ a (tanuló_id, kurzus_id) pártól: ugyanaz a tanuló különböző kurzusokra különböző napokon jelentkezhet, és ugyanarra a kurzusra a tanulók sem szükségképpen egyszerre jelentkeznek.

Részleges függésnél az összetett meghatározó egy kisebb része is elegendő. A tanulónév a jelentkezési táblában függ a teljes kulcspártól is, de már a tanuló_id önmagában meghatározza. Ezért az összetett kulcshoz képest részlegesen függ. Hasonlóan a kurzuscím a kurzus_id-től függ; nem kell hozzá a tanuló.

Tranzitív függés láncolatban jelenik meg. Ha kurzus_id → oktató_id és oktató_id → oktatónév, akkor kurzus_id → oktatónév is következik. A normalizálás szempontjából akkor problémás a közvetítő, ha nem a reláció kulcsa: az oktató neve így minden hozzá tartozó kurzusban újra megjelenik. Nem minden logikai következtetési lánc jelent automatikusan 3NF-sértést; a kulcsokat és a függő attribútumokat is vizsgálni kell.

Függőségek a képzési központban
FüggésTípusa a nagy jelentkezési táblábanIndok
tanuló_id → tanulónévRészleges a páros kulcshoz képestAz adott tanuló neve nem függ a választott kurzustól.
kurzus_id → kurzuscím, oktató_idRészleges a páros kulcshoz képestA kiírás adatai a kurzushoz tartoznak.
(tanuló_id, kurzus_id) → jelentkezés_dátuma, pontszámTeljesEgy konkrét jelentkezés adatai.
oktató_id → oktatónév, oktatói_emailTranzitív lánc részeAz oktatói adatok az oktatót jellemzik.

Kidolgozott példa · Ellenpélda keresése

Valaki azt állítja: tanulónév → tanuló_id.

  1. Vegyünk fel két külön személyt, azonos Szabó Luca névvel és eltérő azonosítóval.
  2. A meghatározó érték azonos, a meghatározott érték különbözik.
  3. Ez cáfolja a feltételezett függést, ezért a név nem lehet kulcs.

05 · Relációs modell

Miért normalizálunk? Redundancia és anomáliák

AlapfogalomA normalizálás a relációs sémák függőségeken alapuló rendezése és szükség szerinti szétbontása. Célja a fölöslegesen ismételt tények és az ebből eredő módosítási, beszúrási, törlési anomáliák csökkentése, az információ megőrzésével.

Képzeljünk el egy képzési központot, amely a tanulókat, kurzuskiírásokat, oktatókat és jelentkezési eredményeket egyetlen nagy táblába írja. Minden új jelentkezéskor újra begépeli a tanuló és a kurzus adatait, valamint az oktató nevét és emailcímét. Egy 20 fős kurzus oktatói emailcíme akár 20 sorban ismétlődik; több kurzus esetén még többször.

A redundancia nem egyszerűen azt jelenti, hogy valamilyen érték többször látható. Az O7 idegen kulcs ismétlődése a különböző kurzusokban szükséges kapcsolatot fejez ki. Az O7-hez tartozó emailcím külön tárolt másolatai viszont ugyanazt az oktatói tényt ismétlik, ezért eltérhetnek egymástól. A tervezés célja az, hogy minden tény a megfelelő helyre kerüljön.

Módosítási anomália: Barta Nóra emailcímének változásakor minden érintett sort frissíteni kell. Ha egyet kihagyunk, a nyilvántartás ellentmondásos lesz. Beszúrási anomália: egy új, még jelentkező nélküli kurzust nem tudunk szabályosan felvenni, ha az egyetlen tábla kulcsa tanulót is megkövetel. Törlési anomália: az utolsó jelentkezés törlésekor véletlenül a kurzus és oktató adatai is eltűnhetnek.

A normalizálás során különválasztjuk a különböző tárgyú tényeket, majd kulcsokkal kötjük össze őket. Nem elég azonban „minél több táblát” készíteni. Minden bontást meg kell indokolni, a kulcsokat meg kell őrizni, és meg kell vizsgálni, visszaállítható-e az eredeti információ. A tárolási igény csökkenhet, de az elsődleges cél a következetes és karbantartható szerkezet; a több kulcs és index miatt a fizikai méret nem minden esetben lesz kisebb.

A közös példa rögzített üzleti szabályai
SzabályKövetkezmény
Egy kurzus_id egy konkrét kurzuskiírást jelöl.Ugyanilyen című új kiírás új azonosítót kap.
Egy tanuló egy kiírásra legfeljebb egyszer jelentkezhet.A jelentkezés kulcsa a tanuló_id és kurzus_id pár.
Egy kiírásnak pontosan egy felelős oktatója van.kurzus_id → oktató_id.
Egy oktatónak egy aktuális neve és emailcíme van.oktató_id → oktatónév, oktatói_email.
A pontszám egy jelentkezés aktuális eredménye.Nem tárolunk több külön vizsgakísérletet ebben a modellben.

Kidolgozott példa · Új kurzus, még nincs jelentkező

A C14 kurzust meghirdetik, de még senki sem választotta.

  1. A tanuló_id-t is megkövetelő jelentkezési sorba nem tudjuk önállóan betenni.
  2. Nem készítünk kitalált tanulót vagy hiányzó kulcsértéket a kurzus kedvéért.
  3. Külön KURZUS relációban a kiírás jelentkezés nélkül is tárolható.

06 · Relációs modell

Első normálforma: egy cella, egy érték

AlapfogalomEgy reláció első normálformában, 1NF-ben van, ha az attribútumai a választott doménben egyértékű, atomi értékeket tartalmaznak, és nincsenek ismétlődő mezőcsoportok. A rekordok azonosítását egy megfelelő kulcs biztosítja.

Egy feliratkozási lapon Mira mellé ezt írjuk a kurzusok cellába: „C11, C12”, a pontszámokhoz pedig „85, 72”. A jelentkezések így listákba kerülnek. Nem tudunk egyetlen kurzusra megbízhatóan szűrni, és két párhuzamos lista esetén könnyen felcserélődhet, melyik eredmény melyik kurzushoz tartozik. A kurzus1, kurzus2, kurzus3 oszlopok szintén ismétlődő csoportot alkotnak és önkényes felső korlátot vezetnek be.

Az 1NF kialakításakor minden konkrét jelentkezést saját sorba teszünk. Mira két jelentkezése két sor lesz, a tanuló adatai ekkor még megismétlődnek. A kurzus és az eredmény összetartozását megőrizzük: nem állítunk elő minden kurzus–pontszám kombinációt. Az atomi sorokra bontás nem jelenti egymástól független listák vak összeszorzását.

A táblánkat a (tanuló_id, kurzus_id) kulcspár azonosítja. Mira azonosítója kétszer szerepelhet, a C11 kurzushoz több tanuló tartozhat, de a T101–C11 pár csak egyszer jelenik meg. A név, cím és oktatói adatok ismétlődése még nem sérti az 1NF feltételeit: ezeket a következő normálformák segítségével rendezzük.

Az atomiság a feladattól függ. Egy szöveg karakterekre bontható, mégis kezelhető egyetlen értékként. A tanulónév maradhat egy mező, ha a rendszer egész névként használja. Ha a vezetéknév és keresztnév külön feldolgozási cél, külön attribútumokat tervezünk. A vessző jelenléte önmagában nem bizonyít többértékűséget; a cella jelentését kell megvizsgálni.

A sémában minden rekord ugyanazokhoz az attribútumokhoz tartozik, és az attribútumnevek egy reláción belül egyértelműek. Egy képernyőn használt rendezés nem része az 1NF logikai követelményeinek. SQL-ben a sorok azonosítására PK vagy megfelelő UNIQUE és NOT NULL korlátozásokat használunk; a kimenet rendezését külön ORDER BY írja elő.

A rendezetlen kiindulás
tanuló_idtanulónévkurzusok és eredmények
T101Fekete MiraC11: 85 pont; C12: 72 pont
T102Kovács ÁronC11: 91 pont
T103Németh SáraC13: 88 pont

A kurzusok és eredmények itt még egy cellában tárolt jelentkezéslistát alkotnak.

1NF: egy sor egy jelentkezés
tanuló_idtanulónévkurzus_idkurzuscímoktató_idoktatónévoktatói_emailjelentkezés_dátumapontszám
T101Fekete MiraC11Webes arculatO7Barta Nóranora@example.hu2026-10-0185
T101Fekete MiraC12Digitális grafikaO8Varga Balázsbalazs@example.hu2026-10-0272
T102Kovács ÁronC11Webes arculatO7Barta Nóranora@example.hu2026-10-0291
T103Németh SáraC13AdatvizualizációO7Barta Nóranora@example.hu2026-10-0388

Kulcs: (tanuló_id, kurzus_id). Az oktatói adatok ismétlődése szándékosan látható, mert a további lépések ezt rendezik.

Kidolgozott példa · Miért nem elég a tanuló_id?

A T101 tanuló a C11 és C12 kurzusra is jelentkezett.

  1. A két jelentkezés két külön tény, ezért két rekordra van szükség.
  2. A tanuló_id ugyanaz a két sorban; önmagában nem azonosít.
  3. A kurzus_id-val együtt már megkülönbözteti a jelentkezéseket az egyszeri jelentkezés szabálya mellett.

07 · Relációs modell

Második normálforma: szüntessük meg a részleges függéseket

AlapfogalomEgy reláció 2NF-ben van, ha 1NF-ben van, és minden nem kulcsattribútuma teljesen függ minden kulcsjelöltjétől. Nem kulcsattribútum az, amely egyetlen kulcsjelöltnek sem része.

A nagy jelentkezési tábla összetett kulcsának két része van: tanuló_id és kurzus_id. A tanulónév csak az elsőtől, a kurzuscím és oktatói adatok csak a másodiktól függenek. A jelentkezés_dátuma és pontszám viszont a kettő együttese alapján határozható meg. A bontás során az egymáshoz tartozó adatokat a megfelelő meghatározóval együtt emeljük külön relációba.

Létrehozzuk a TANULÓ relációt tanuló_id elsődleges kulccsal. Ebben a tanuló nevét csak egyszer tároljuk. A KURZUS_2NF relációba a kurzus kiírásadatai és egyelőre az oktató adatai kerülnek, kurzus_id kulccsal. A JELENTKEZÉS a két azonosítót, a jelentkezés dátumát és a pontszámot őrzi. Ebben mindkét azonosító idegen kulcs is: külön-külön hivatkoznak a megfelelő törzsadatokra.

A JELENTKEZÉS összetett elsődleges kulcsa és két külön idegen kulcsa nem ugyanaz a korlátozás. A PK a párok egyediségét, a két FK a létező tanulót és kurzust biztosítja. Ha a két oszlopot külön-külön UNIQUE-nak tennénk, megtiltanánk, hogy egy tanuló több kurzusra járjon, illetve hogy egy kurzusra több tanuló jelentkezzen.

A bontás után egy tanuló újabb jelentkezésekor nem kell újra rögzíteni a nevét. A kurzus jelentkezés nélkül is tárolható. Ugyanakkor az oktató neve több külön kurzus sorában továbbra is ismétlődhet: a 2NF ezt még nem szünteti meg, mert a tranzitív függések a következő lépés tárgyai.

Ha minden kulcsjelölt egyetlen attribútumból áll, részleges függés nem lehet: a nem kulcsattribútumot nem határozhatja meg a kulcs valamely nem üres, kisebb része. Az, hogy csak a kiválasztott PK egyoszlopos, még nem elég: egy másik, összetett kulcsjelölt miatt is vizsgálni kell a részleges függést. Ezért a kulcsjelöltek feltárása megelőzi a normálforma megállapítását.

TANULÓ – a tanuló adatai
tanuló_id (PK)tanulónév
T101Fekete Mira
T102Kovács Áron
T103Németh Sára
KURZUS_2NF – az oktatói ismétlődés még megmarad
kurzus_id (PK)kurzuscímoktató_idoktatónévoktatói_email
C11Webes arculatO7Barta Nóranora@example.hu
C12Digitális grafikaO8Varga Balázsbalazs@example.hu
C13AdatvizualizációO7Barta Nóranora@example.hu
JELENTKEZÉS – a kapcsolat saját adatai
tanuló_id (PK-rész, FK)kurzus_id (PK-rész, FK)jelentkezés_dátumapontszám
T101C112026-10-0185
T101C122026-10-0272
T102C112026-10-0291
T103C132026-10-0388

Kidolgozott példa · A név változtatása 2NF után

Fekete Mira nevét javítjuk a nyilvántartásban.

  1. Egyetlen TANULÓ rekordot módosítunk, T101 azonosítóval.
  2. A JELENTKEZÉS sorai továbbra is T101-re hivatkoznak.
  3. A két kurzusra vonatkozó jelentkezéshez nem tárolunk külön névmásolatot.

08 · Relációs modell

Harmadik normálforma: a közvetett függések rendezése

AlapfogalomA 3NF a nem kulcsattribútumok kulcsoktól való, problémás tranzitív függéseit zárja ki. Pontosan: minden nem triviális X → A funkcionális függésnél X szuperkulcs, vagy A valamely kulcsjelölt része.

A KURZUS_2NF táblában a kurzus_id meghatározza az oktató_id-t, az oktató_id pedig az oktató nevét és emailcímét. Az oktató_id nem kulcs ebben a táblában: O7 több kurzusban szerepel. Az oktatónév és email nem kulcsattribútumok. Ez a függőség megsérti a 3NF feltételeit, és fennmaradó módosítási anomáliát eredményez.

Az oktató saját adatait külön OKTATÓ relációba helyezzük, oktató_id kulccsal. A KURZUS relációban a kurzus_id, kurzuscím és az oktató_id idegen kulcs marad. A TANULÓ és JELENTKEZÉS szerkezete ebben a lépésben nem változik. A végső modell négy relációból áll: TANULÓ, KURZUS, OKTATÓ és JELENTKEZÉS.

Az O7 oktató nevét és emailcímét most egyetlen helyen tároljuk. A C11 és C13 kurzus ezt az oktatót hivatkozza. Emailváltozáskor csak az OKTATÓ megfelelő rekordját kell módosítani. Egy még kurzushoz nem rendelt új oktató is felvehető, és egy kurzus törlése nem törli automatikusan az oktatót.

A megadott függőségek mellett mind a négy reláció 3NF-ben van. Az OKTATÓ-ban az id határozza meg a saját adatokat; a KURZUS-ban a kurzus id-je a címét és oktatóját; a TANULÓ-ban a tanuló id-je a nevét; a JELENTKEZÉS-ben a teljes páros kulcs a dátumot és eredményt. Az állítás a rögzített követelményekre épül, nem minden elképzelhető alkalmazásra.

A „minden függés csak az elsődleges kulcsból indulhat” mondat hasznos lehet a kezdő példákban, de általános 3NF-definíciónak túl erős. Alternatív kulcsok is meghatározhatnak adatokat, a pontos 3NF pedig bizonyos kulcsattribútumokra végződő függéseket is megenged. A minden nem triviális funkcionális függés meghatározóját szuperkulcsként megkövetelő szigorúbb forma a Boyce–Codd-normálforma, BCNF.

OKTATÓ – az oktatói tények helye
oktató_id (PK)oktatónévoktatói_email
O7Barta Nóranora@example.hu
O8Varga Balázsbalazs@example.hu
KURZUS – az oktatóhoz már csak hivatkozunk
kurzus_id (PK)kurzuscímoktató_id (FK)
C11Webes arculatO7
C12Digitális grafikaO8
C13AdatvizualizációO7

A négyrelációs végeredmény

TANULÓ(tanuló_id PK, tanulónév)

OKTATÓ(oktató_id PK, oktatónév, oktatói_email)

KURZUS(kurzus_id PK, kurzuscím, oktató_id FK → OKTATÓ)

JELENTKEZÉS(tanuló_id PK-rész és FK → TANULÓ, kurzus_id PK-rész és FK → KURZUS, jelentkezés_dátuma, pontszám)

Kidolgozott példa · Törlési anomália megszüntetése

T103 visszavonja az egyetlen C13-as jelentkezést.

  1. A JELENTKEZÉS megfelelő sorát töröljük.
  2. A C13 kurzus adatai a KURZUS relációban megmaradnak.
  3. Az O7 oktató adatai az OKTATÓ relációban szintén megmaradnak.

09 · Relációs modell

Negyedik normálforma: független többértékű tények

AlapfogalomA többértékű függés, X ↠ Y, olyan szabályt fejez ki, amelyben egy adott X-hez tartozó Y értékek halmaza független a reláció többi attribútumának értékeitől. A 4NF minden nem triviális többértékű függés meghatározójától szuperkulcsot követel meg.

A tanfolyamok nyilvántartásához új igény érkezik: tudni szeretnénk, milyen oktatási nyelveken érhető el egy kurzus, és melyik eszközcsomag használható hozzá. A példában ez a két választás egymástól független. A C21 kurzus magyarul vagy angolul végezhető, és a résztvevő laptopot vagy tabletet választhat; mind a négy kombináció megengedett.

Egyetlen KURZUS_LEHETŐSÉG(kurzus_id, nyelv, eszköz) táblában ezért négy sor szükséges. A teljes hármas azonosítja a sort: a kurzus_id önmagában nem határoz meg egy nyelvet vagy eszközt, és a kurzus–nyelv párhoz is több eszköz tartozik. Ha nincs további funkcionális függés, ez a háromoszlopos reláció akár BCNF-ben is lehet, mégis fölöslegesen ismétli a két független tényt.

Ha egy harmadik eszközcsomagot vezetünk be, minden meglévő nyelv mellé új sort kell írnunk. Ha egy sor kimarad, a tábla tévesen azt sugallja, hogy az adott nyelv mellett az új eszköz nem választható. A függőség nem kurzus_id → nyelv, mert több nyelv van, hanem kurzus_id ↠ nyelv; hasonlóan kurzus_id ↠ eszköz.

Két relációra bontunk: KURZUS_NYELV(kurzus_id, nyelv) és KURZUS_ESZKÖZ(kurzus_id, eszköz). Mindkettőben a két oszlop együtt a kulcs. A kurzus_id idegen kulcsként egy külön KURZUS törzsrelációra hivatkozik. Nem a két kapcsolótábla egymásra hivatkozik kurzus_id-val, hiszen ez egyikben sem egyedi.

A függetlenség kulcsfontosságú feltétel. Ha angol oktatás csak laptopon, magyar pedig csak tableten lehetséges, a hármasokat nem szabad két független listára bontani: az összekapcsolás tiltott párokat hozna létre. Ilyenkor a nyelv–eszköz kombináció maga is tárolandó tény. A 4NF nem azt jelenti, hogy a táblában egyetlen többértékű attribútum sem szerepelhet: az 1NF-ben már atomi cellákkal dolgozunk, a 4NF a sorok közötti többértékű függéseket vizsgálja.

Az összes megengedett kombináció egy táblában
kurzus_idnyelveszköz
C21magyarlaptop
C21magyartablet
C21angollaptop
C21angoltablet
KURZUS_NYELV – kulcs: (kurzus_id, nyelv)
kurzus_id (PK-rész, FK)nyelv (PK-rész)
C21magyar
C21angol
KURZUS_ESZKÖZ – kulcs: (kurzus_id, eszköz)
kurzus_id (PK-rész, FK)eszköz (PK-rész)
C21laptop
C21tablet

10 · Relációs modell

Relációs műveletek: átnevezés, korlátozás és vetület

AlapfogalomA relációs algebra műveletei relációkból új relációkat állítanak elő. A korlátozás sorokat válogat, a vetület attribútumokat választ ki, az átnevezés pedig a reláció vagy attribútumai nevét változtatja meg az eredményben.

A jól normalizált modell több kisebb táblából áll. Ez megkönnyíti a karbantartást, de a kérdésekhez gyakran több reláció adatait kell felhasználni. A relációs műveletek adják meg, hogyan szűrjük, szűkítsük és kapcsoljuk össze az adatokat. Az eredmény is reláció, így további művelet bemeneteként használható.

A relációs kalkulus elsősorban azt fejezi ki, milyen feltételeknek megfelelő adatokat keresünk. Az algebra műveletek kombinációjával írja le az eredmény előállítását. Az SQL deklaratív lekérdezőnyelv: a kívánt eredményt adjuk meg, a végrehajtás fizikai módját a kezelő optimalizálja. Az alábbi algebrai jelölések tanulási eszközök, nem egy adott programban változtatás nélkül végrehajtható parancsok.

Átnevezésnél, RENAME vagy ρ művelettel, például a pontszám oszlopot eredménynek nevezzük az előállított relációban. A rekordok száma és a tárolt értékek nem változnak. Ez nem azonos az eredeti SQL-tábla szerkezetének tartós módosításával: lekérdezésben az AS álnév az eredmény fejlécét változtatja meg.

A korlátozás, RESTRICT vagy σ, az adott feltételt teljesítő teljes sorokat tartja meg. A pontszám ≥ 85 feltétel három sort választ ki a négyből. Az oszlopok száma változatlan. Összetett feltételnél ÉS, VAGY, illetve tagadás is használható, de ezek jelentését pontosan meg kell határozni.

A vetület, PROJECT vagy π, csak a kiválasztott attribútumokat őrzi meg. A kurzus_id vetülete a C11, C12 és C13 értékeket adja. A halmazalapú algebrában a két C11 eredménysor egyetlen sorrá válik. SQL-ben a SELECT kurzus_id alapból megtarthatja az ismétlődést; a halmazjellegű vetülethez SELECT DISTINCT kurzus_id használható. A szűrés és vetítés sorrendjét úgy válaszd, hogy a szükséges feltételattribútum ne vesszen el túl korán.

A három művelet jelölése

ρ eredmény←pontszám (JELENTKEZÉS)

σ pontszám≥85 (JELENTKEZÉS)

π kurzus_id (JELENTKEZÉS)

Korlátozás: legalább 85 pont
tanuló_idkurzus_idjelentkezés_dátumapontszám
T101C112026-10-0185
T102C112026-10-0291
T103C132026-10-0388
Vetület: a jelentkezéssel rendelkező kurzusok
kurzus_id
C11
C12
C13

Kidolgozott példa · Legalább 85 pontos eredmények tanulói

Csak azoknak a tanulóknak az azonosítója érdekel, akiknek legalább egy eredménye 85 vagy több.

  1. Először a pontszám alapján korlátozunk: σ pontszám≥85 (JELENTKEZÉS).
  2. Az eredményből tanuló_id vetületet képezünk.
  3. A megoldás T101, T102, T103. Előzetes vetítésnél ne hagyd el a pontszámot a szűrés előtt.

11 · Relációs modell

Keresztszorzat: minden sort minden sorral

AlapfogalomR × S keresztszorzata az R minden rekordját párosítja az S minden rekordjával. Az eredmény kardinalitása |R| · |S|, fokszáma pedig a két fokszám összege, az attribútumnevek egyértelműsítése után.

Egy nyílt napon két bemutatóterem és három idősáv közül választhatunk. Szeretnénk elkészíteni az összes lehetséges terem–idősáv párt, még az események tényleges beosztása előtt. A TEREM és IDŐSÁV relációk keresztszorzata éppen ezt a hat kombinációt adja.

A keresztszorzat még nem mondja meg, melyik kombinációt foglaltuk le. Csak lehetőségeket állít elő. Ha a két relációban azonos nevű attribútum van, előbb átnevezzük, vagy egyértelmű minősítéssel különböztetjük meg őket. Például terem.név és idősáv.név helyett használható teremnév és idősávnév.

Az eredmény azonosítható a két kiinduló reláció kulcsának együttesével. A példában (terem_id, sáv_id) kulcsjelölt. Az egyes kulcsrész önmagában ismétlődik, hiszen minden terem három időponthoz, minden időpont két teremhez kapcsolódik.

A méret gyorsan nő. Két 1000 és 10 000 rekordos reláció keresztszorzata 10 000 000 rekordot adhat. Ez nem azt jelenti, hogy egy adatbázis-kezelő minden JOIN esetén ténylegesen létrehozza az összes ilyen sort: a végrehajtás hatékonyabb lehet. Logikai értelemben azonban az összes lehetséges párosítás megértése segít az összekapcsolási feltétel jelentésének felismerésében.

TEREM
terem_idteremnév
R1Kék terem
R2Zöld terem
IDŐSÁV
sáv_idkezdés
S109:00
S210:00
S311:00
A hat lehetséges pár
terem_idteremnévsáv_idkezdés
R1Kék teremS109:00
R1Kék teremS210:00
R1Kék teremS311:00
R2Zöld teremS109:00
R2Zöld teremS210:00
R2Zöld teremS311:00

Kidolgozott példa · Méret számítása

A TEREM 2 attribútumot és 2 rekordot, az IDŐSÁV 2 attribútumot és 3 rekordot tartalmaz.

  1. Az eredmény fokszáma: 2 + 2 = 4.
  2. Az eredmény kardinalitása: 2 · 3 = 6.
  3. Ha valamelyik reláció üres, a keresztszorzatnak 0 rekordja lesz.

12 · Relációs modell

Unió, metszet és különbség

AlapfogalomUnióban mindkét reláció rekordjai szerepelnek; metszetben csak a mindkettőben szereplők; R − S különbségében azok, amelyek R-ben megvannak, S-ben nincsenek. A műveletek kompatibilis sémájú relációkat igényelnek.

Legyen A a robotika szakkörre, B a videókészítő szakkörre jelentkező tanulók azonosítóinak relációja. A két eredmény egy-egy tanuló_id attribútumot tartalmaz, azonos értéktartománnyal. Így értelmesen összehasonlíthatók. Ha az egyik táblában személyazonosítók, a másikban ugyanilyen típusú teremkódok szerepelnének, a technikailag hasonló oszlop nem biztosítana megfelelő jelentést.

A ∪ B a legalább egy szakkörre jelentkezőket adja. A közösen szereplő T102 csak egyszer jelenik meg, mert relációs halmazműveletet végzünk. SQL-ben az UNION eltávolítja a duplikált eredménysorokat, az UNION ALL viszont megőrzi őket. Ez utóbbi nem ugyanaz a halmazművelet.

A ∩ B azok azonosítóit adja, akik mindkét szakkörben jelen vannak. A − B csak a robotikára, de videókészítésre nem jelentkezőket adja. B − A más eredmény: a különbség nem felcserélhető. Az unió és metszet viszont a két bemenet felcserélésekor ugyanazt az eredményt adja.

A kompatibilitás azonos számú és megfelelően egymáshoz rendelt doménű attribútumot kíván. Az attribútumokat szükség esetén átnevezzük. SQL-ben a SELECT-listák megfelelő pozíciói alapján illesztjük az eredményeket, ezért az oszlopsorrend itt különösen fontos. A nevek egyezése önmagában nem elég, az értékek jelentését is egyeztetni kell.

Egyesítés után a korábbi kulcs egyedisége nem feltétlenül marad meg, ha a bemenetek eltérő, egymástól független azonosító-kiosztást használnak. Két szervezet „1” id-jű rekordja nem biztos, hogy ugyanazt a személyt jelenti. Ha azonos személyekről készítünk részlistákat ugyanabból a közös azonosítórendszerből, mint itt, akkor a tanuló_id következetes azonosító marad.

Két szakkör névsorának azonosítói
Robotika: AVideókészítés: B
T101T102
T102T104
T103—

A gondolatjel a bemutató táblában csak azt jelzi, hogy a B listának nincs harmadik eleme; nem adatérték.

A három halmazművelet eredménye
MűveletEredmény
A ∪ BT101, T102, T103, T104
A ∩ BT102
A − BT101, T103
B − AT104

Kidolgozott példa · Ellenőrzés darabszámmal

|A| = 3, |B| = 2, |A ∩ B| = 1.

  1. Az unió elemszáma: 3 + 2 − 1 = 4.
  2. A − B elemszáma 2; B − A elemszáma 1.
  3. A metszet miatt az unió mérete nem egyszerűen 3 + 2.

13 · Relációs modell

JOIN: összekapcsolás a megfelelő feltétellel

AlapfogalomA kapcsolás, JOIN, két reláció azon rekordpárjait állítja elő, amelyek teljesítik az összekapcsolási feltételt. A természetes kapcsolás a közös nevű attribútumokon értékegyezést követel, és ezeket egyszer tartja meg.

A normalizáláskor a kurzus és az oktató adatait szétválasztottuk. Most arra kérdezünk rá: melyik kurzusnak ki a felelős oktatója? A KURZUS minden sorához azt az OKTATÓ rekordot illesztjük, amelynek oktató_id értéke megegyezik a kurzusban tárolt idegen kulccsal.

A C11 kurzus O7-re hivatkozik, ezért Barta Nóra adatait kapja. A C12 O8-ra hivatkozik, így Varga Balázsét. A C13 ismét O7-re hivatkozik, ezért ugyanaz az oktató két külön eredménysorban jelenik meg. Az oktatói rekord tárolása egy helyen történik, de a lekérdezés több kurzus mellett is megjelenítheti az adatát.

A megfelelően érvényesített kötelező FK és az oktatói kulcs egyedisége miatt minden kurzushoz pontosan egy oktatói sor illeszkedik; ebben a példában három eredménysor lesz. A természetes kapcsolás eredményének fokszáma 3 + 3 − 1 = 5. Explicit SQL JOIN esetén a SELECT-lista határozza meg a megjelenő oszlopokat, így nem alkalmazható rá automatikusan ez a fokszámképlet.

A JOIN leírható keresztszorzat és korlátozás kombinációjaként: először elképzeljük az összes rekordpárt, majd kiválasztjuk azokat, ahol KURZUS.oktató_id = OKTATÓ.oktató_id. Az eredményből elhagyjuk a második, azonos értékű oktatóazonosító-oszlopot. Ez logikai felépítés, nem a végrehajtási terv kötelező formája.

Ha egy belső egyenlőségkapcsolásnál nincs illeszkedő érték, az érintett rekordhoz nem keletkezik eredménysor. Ha egyik rekordpár sem illeszkedik, az eredmény üres: nem keresztszorzat. A természetes kapcsolás közös attribútum nélküli különleges esetben ad keresztszorzatot, mert nincs megkötendő közös érték. LEFT JOIN-nál a bal oldali sor megmaradhat hiányzó jobb oldali értékekkel; ez külön művelet.

Veszélyes, ha két táblában véletlenül azonos nevű, de eltérő jelentésű oszlop szerepel. A természetes kapcsolás minden közös nevet figyelembe vesz. Gyakorlati lekérdezéseknél az explicit ON feltétel és megfontolt oszloplista jobban láthatóvá teszi a kívánt kapcsolatot. A KURZUS.név és OKTATÓ.név például nem kapcsolómező.

KURZUS és OKTATÓ természetes kapcsolása
kurzus_idkurzuscímoktató_idoktatónévoktatói_email
C11Webes arculatO7Barta Nóranora@example.hu
C12Digitális grafikaO8Varga Balázsbalazs@example.hu
C13AdatvizualizációO7Barta Nóranora@example.hu

Egy explicit SQL-példa

SELECT k.kurzus_id, k.kurzuscim, o.oktatonev

FROM kurzus AS k

JOIN oktato AS o ON k.oktato_id = o.oktato_id;

Kidolgozott példa · Mira kurzusai és oktatói

T101 jelentkezéseihez tanfolyamcímet és oktatónevet szeretnénk.

  1. A JELENTKEZÉS-t tanuló_id = T101 feltétellel korlátozzuk.
  2. Kurzus_id alapján hozzákötjük a KURZUS megfelelő sorait.
  3. Oktató_id alapján hozzákötjük az OKTATÓ adatait.
  4. Vetületet képezünk a cím és oktatónév oszlopokra: Webes arculat – Barta Nóra; Digitális grafika – Varga Balázs.

14 · Relációs modell

A bontás ellenőrzése: veszteségmentesség és függőségmegőrzés

AlapfogalomA dekompozíció veszteségmentes, ha a szétbontott relációk megfelelő összekapcsolásával pontosan az eredeti reláció állítható elő: sem eredeti rekord nem vész el, sem nem valódi rekordkombináció nem keletkezik.

A veszteségmentesség nem azt jelenti, hogy az összes attribútum valahol megmaradt. Az értékek közötti összetartozást is meg kell őrizni. Ha csak azt jegyezzük fel, kik jártak kurzusra, és milyen pontszámok születtek, de elveszítjük a pontszám és jelentkezés kapcsolatát, a rekonstruált tábla téves eredményeket rendelhet a tanulókhoz.

A fő példában a JELENTKEZÉS tartalmazza a tanuló_id és kurzus_id értékeket, ezért a TANULÓ-val és KURZUS-sal pontosan tudjuk összekapcsolni. A kurzus megtartja az oktató_id-t, így az oktatói rész is helyesen rekonstruálható. Az eredeti négy jelentkezési rekord minden adatát visszakapjuk.

A mintarekordokkal végzett próbavisszakapcsolás hasznos, de a sémaszintű bizonyítást nem helyettesíti. Két relációra történő, funkcionális függőségekre épülő bontásnál elegendő feltétel, hogy a közös attribútumok meghatározzák legalább az egyik kapott reláció összes attribútumát. A kurzus_id meghatározza a kurzus saját adatait; a tanuló_id a tanulóét; az oktató_id az oktatóét.

A függőségmegőrzés azt jelenti, hogy az eredeti függőségeket a kapott kisebb relációkban ellenőrizhető szabályokból együtt is következtethetjük. Nem kell minden ellenőrzéshez nagy összekapcsolást végrehajtanunk. A tanuló_id → tanulónév a TANULÓ-ban, a kurzus_id → oktató_id a KURZUS-ban, az oktató_id → email az OKTATÓ-ban ellenőrizhető. A teljes jelentkezési kulcsra vonatkozó függés a JELENTKEZÉS-ben marad.

A rossz bontást álrekordok is elárulhatják. Tegyük fel, hogy T101 a C11-en 85, a C12-n 72 pontot kapott. Ha a tényeket TANULÓ_KURZUS(tanuló_id, kurzus_id) és TANULÓ_PONT(tanuló_id, pontszám) relációra bontjuk, a tanuló_id szerinti JOIN négy kombinációt eredményez. A C11–72 és C12–85 sorok sosem voltak valósak. Ez a példa különbözik a 4NF független listáitól: itt a pontszám nem független a kurzustól.

Egy hibás bontás visszakapcsolása
tanuló_idkurzus_idpontszámÉrtékelés
T101C1185Eredeti tény
T101C1172Álrekord
T101C1285Álrekord
T101C1272Eredeti tény

Kidolgozott példa · A helyes visszakapcsolás

A négyrelációs 3NF modellből rekonstruáljuk a jelentkezések adatait.

  1. JELENTKEZÉS JOIN TANULÓ a tanuló_id alapján: mind a 4 jelentkezés egy nevet kap.
  2. Az eredmény JOIN KURZUS a kurzus_id alapján: minden jelentkezés saját kurzusadatot kap.
  3. Az eredmény JOIN OKTATÓ az oktató_id alapján: minden kurzus saját oktatóadatot kap.
  4. A végeredményt az eredeti 1NF táblával összevetve minden értékpár és a 4 sor is megegyezik.

15 · Relációs modell

A normalizálás tömör, formális leírása

AlapfogalomAz R(A, B, …) jelölés egy reláció sémáját, a K = {…} egy megadott kulcsjelöltjét írja le. Az X → Y függés alapján csak akkor bontunk, ha a függés az összes megengedett adatállapotban érvényes.

A formális jelölés nem új eljárás: ugyanazokat a lépéseket rövidebben mutatja. Az általános betűk helyett maradjunk a központi példa jelentéssel bíró rövidítéseinél. T a tanuló_id, C a kurzus_id, N a tanulónév, L a kurzuscím, O az oktató_id, V az oktatónév, E az oktatói_email, D a jelentkezés dátuma, P a pontszám.

A kiinduló R(T, C, N, L, O, V, E, D, P) reláció kulcsa {T, C}. A függések: T → N; C → L, O; O → V, E; (T, C) → D, P. Tranzitivitás miatt C → V, E is következik. A kulcs teljességét az ellenőrzi, hogy T önmagában több kurzussal, C önmagában több tanulóval fordulhat elő.

A 2NF alak: TANULÓ(T, N), KURZUS_2NF(C, L, O, V, E), JELENTKEZÉS(T, C, D, P). Kulcsaik rendre {T}, {C}, {T, C}. A kurzushoz tartozó összes oktatói adat ebben a lépésben még együtt marad, mert a részleges függéseket már megszüntettük, a tranzitív függést még nem.

A 3NF alakhoz az O → V, E függés alapján a KURZUS_2NF relációt KURZUS(C, L, O) és OKTATÓ(O, V, E) relációkra bontjuk. A másik kettő változatlan. A közös O meghatározza az OKTATÓ minden attribútumát, ezért ez a kétrelációs bontás veszteségmentes.

A kulcsjelöltek vizsgálatához attribútumlezárást is használhatunk. X⁺ azoknak az attribútumoknak a halmaza, amelyeket a megadott függésekből X alapján meghatározhatunk. A {T, C} lezárása tartalmazza T-t, C-t, majd N-t, L-t, O-t, V-t, E-t, D-t és P-t: az egész sémát. T lezárása csak T és N, C lezárása C, L, O, V és E. Ezért egyik kulcsrész sem azonosít önmagában minden adatot.

A lezárások számítása
Kiinduló halmazMeghatározható attribútumokAz egész R szuperkulcsa?
{T}{T, N}Nem
{C}{C, L, O, V, E}Nem
{O}{O, V, E}Nem
{T, C}{T, C, N, L, O, V, E, D, P}Igen; a megadott függések mellett minimális is.

A 3NF séma röviden

TANULÓ(T PK, N)

KURZUS(C PK, L, O FK → OKTATÓ)

OKTATÓ(O PK, V, E)

JELENTKEZÉS(T és C együtt PK; T FK → TANULÓ; C FK → KURZUS; D; P)

Kidolgozott példa · Mire jó a kulcs minimalitásának vizsgálata?

Valaki K = {T, C, D} kulcsot javasol.

  1. T és C együtt már meghatároz mindent, köztük D-t is.
  2. D elhagyható a meghatározó halmazból.
  3. {T, C, D} szuperkulcs, de nem kulcsjelölt, mert nem minimális.

16 · Relációs modell

A normálformák rendszere és a tervezés ellenőrzése

AlapfogalomA magasabb normálforma a megelőző feltételeket is teljesíti. A szokásos hierarchia: 4NF ⇒ BCNF ⇒ 3NF ⇒ 2NF ⇒ 1NF. A normálformát a teljes séma, a kulcsjelöltek és az érvényes függőségek alapján állapítjuk meg.

A gyakorlati vizsgálatot az adatok jelentésével kezdjük. Először felsoroljuk, milyen tényeket kell tárolni, majd megadjuk az azonosítókat és a függéseket. Ezután ellenőrizzük a többértékű cellákat, a részleges és tranzitív függéseket, végül szükség esetén a független többértékű függéseket. Az egyes bontásokhoz a közös attribútumok és hivatkozások biztosítanak kapcsolatot.

Nem kell minden problémát kizárólag alulról építkező táblabontással megoldani. Egy jó ER-modell alapján eleve jól elkülönülhetnek a tanulói, kurzus- és oktatói tények. A normalizálás ekkor ellenőrző és finomító eszköz: megmutatja, maradt-e fölösleges adatismétlés vagy rejtett függés a logikai tervben.

A 3NF nem garantálja, hogy minden elképzelhető redundancia megszűnik. A 4NF példában a funkcionális függések rendben voltak, de két független választás összes kombinációjának tárolása okozott gondot. Ugyanakkor egy tábla szétbontása önmagában sem érték: a bizonyítható, veszteségmentes és a követelményeket megőrző terv a cél.

Az ismétlődő id, a több JOIN vagy a nagyobb táblaszám nem bizonyít hibát. A tervet konkrét műveletekkel próbáljuk ki: fel tudunk-e venni új oktatót kurzus nélkül, új kurzust jelentkezés nélkül; egy oktatói adat változását egyetlen helyen javítjuk-e; egy jelentkezés törlése megőrzi-e a többi önálló tényt?

A tanulási folyamat végén olvasd össze a sémát az eredeti igényekkel. A modellben minden tárolandó ténynek legyen helye, minden kulcsnak indoka, minden FK-nak pontos célja, és minden hiányzó érték megengedésének üzleti magyarázata. A normalizálás a logikai szerkezet minőségét javítja; a teljesítmény hangolása és fizikai tárolás tervezése további feladat.

Normálformák áttekintése
FormaMit vizsgálunk?Tipikus javításA példánkban
1NFAtomi, egyértékű attribútumok; nincs ismétlődő mezőcsoport.A jelentkezéslista helyett külön rekordok.Egy sor egy tanuló–kurzus jelentkezés.
2NFNem kulcsattribútum nem függhet részlegesen egy kulcsjelölttől.A tanulói és kurzusadatok külön táblába kerülnek.TANULÓ, KURZUS_2NF, JELENTKEZÉS.
3NFMinden nem triviális X → A esetén X szuperkulcs, vagy A kulcsattribútum.A problémás közvetett függés megszüntetése.Az OKTATÓ adatai külön relációban.
BCNFMinden nem triviális funkcionális függés meghatározója szuperkulcs.A nem kulcs meghatározók további vizsgálata.A megadott függőségek mellett a négyrelációs modell ezt is teljesíti.
4NFMinden nem triviális többértékű függés meghatározója szuperkulcs.Független többértékű tények különválasztása.KURZUS_NYELV és KURZUS_ESZKÖZ külön tárolása.

17 · Önellenőrzés

Gyakorlás és önálló modellalkotás

Először önállóan válaszolj, és indokold meg a döntésedet! A kérdés megnyitásakor megjelenik a megoldás és a magyarázat. A táblabontási feladatot saját relációs sémával oldd meg, majd hasonlítsd össze a mintával.

1. Egy relációnak 7 attribútuma és 18 rekordja van. Új, változatlan szerkezetű rekordot veszünk fel. Mi lesz a fokszám és kardinalitás?

A fokszám 7 marad, a kardinalitás 19 lesz. A fejléc nem rekord; új adat nem jelent új attribútumot.

2. A JELENTKEZÉS kulcsa (tanuló_id, kurzus_id). Miért nem kell mindkét oszlopra külön UNIQUE korlátozás?

A párnak kell egyedinek lennie. Külön UNIQUE esetén minden tanuló csak egy kurzusra jelentkezhetne, és minden kurzushoz csak egy tanuló tartozhatna. A két külön FK más célú: a hivatkozott tanuló és kurzus létezését biztosítja.

3. A tanuló_id → név függésből következik-e a név → tanuló_id?

Nem. Két különböző tanuló neve lehet azonos. A fordított függéshez külön, garantált egyediségi szabály szükséges; néhány pillanatnyilag eltérő név nem bizonyítja ezt.

4. A (tanuló_id, kurzus_id) kulcsú nagy táblában hogyan függ a tanulónév és a pontszám?

A tanulónév részlegesen függ a páros kulcstól, mert tanuló_id önmagában meghatározza. A pontszám a megadott szabályok mellett teljesen függ a páros kulcstól: sem a tanuló, sem a kurzus önmagában nem elegendő.

5. A C11 és C13 kurzus oktatója O7. Miért problémás az oktatói email tárolása a kurzusok mellett?

A kurzus_id → oktató_id → email tranzitív láncban az oktató_id nem a kurzustábla kulcsa. Az email több sorban ismétlődik és részleges javításkor ellentmondás keletkezhet. Az oktatói adatokat OKTATÓ-ba emeljük, a kurzusban FK marad.

6. T101 két jelentkezése közül töröljük a C12-est. Mi marad meg a normalizált modellben?

T101 a TANULÓ-ban megmarad. C12 a KURZUS-ban megmarad, és O8 az OKTATÓ-ban is megmarad. Csak a megfelelő JELENTKEZÉS rekord tűnik el, hacsak további, külön üzleti műveletet nem kezdeményezünk.

7. A C21 kurzus 2 nyelven és 3 eszközzel használható; a választások függetlenek. Hány hármas, és hány sor kell a két kapcsolótáblába?

Egyetlen hármastáblában 2 · 3 = 6 kombináció szükséges. KURZUS_NYELV-ben 2 sor, KURZUS_ESZKÖZ-ben 3 sor, összesen 5. A kurzus törzsrekordját ez a darabszám nem számolja. JOIN-nal a 6 megengedett kombináció visszaállítható.

8. Angol oktatás csak laptopon, magyar csak tableten lehetséges. Szétválasztható-e az adat két független listára?

Nem így. A nyelv és eszköz nem független; a bontás majd JOIN az angol–tablet és magyar–laptop tiltott kombinációkat is előállítaná. A megengedett hármasokat vagy ezek kapcsolatát külön meg kell őrizni.

9. Mi a π kurzus_id (JELENTKEZÉS) eredménye a közös mintán, és miért nem négysoros?

C11, C12, C13: 3 sor. A két C11 azonos eredménysor halmazalapú vetítéskor egyetlen rekorddá válik. SQL-ben ehhez SELECT DISTINCT kurzus_id FROM jelentkezes szükséges.

10. Egy 5 rekordos, 3 attribútumos és egy 4 rekordos, 2 attribútumos reláció keresztszorzata milyen méretű?

20 rekord és 5 attribútum: kardinalitás 5 · 4, fokszám 3 + 2. Az azonos attribútumneveket meg kell különböztetni. Ha az egyik bemenet üres volna, a rekordok száma 0 lenne.

11. A = {T101, T102, T103}, B = {T102, T104}. Mi A ∩ B, A − B és A ∪ B?

Metszet: {T102}. Különbség: {T101, T103}. Unió: {T101, T102, T103, T104}. A halmazjelleg miatt T102 csak egyszer szerepel az unióban.

12. Belső egyenlőségkapcsolásnál a két reláció közös kulcsértékei között nincs egyezés. Mi az eredmény?

Üres eredmény, nem keresztszorzat. A keresztszorzat minden párt megenged; a belső kapcsolás csak a feltételt teljesítő párokat tartja meg. Közös attribútum nélküli természetes kapcsolás más eset: az valóban keresztszorzat.

13. Miért hibás a TANULÓ_KURZUS(T, C) és TANULÓ_PONT(T, P) bontás a fő példában?

T101 két kurzusa és két pontszáma a T szerinti JOIN-ban négy kombinációt ad. Az eredetileg nem szereplő C11–72 és C12–85 párok álrekordok. A kurzus és pontszám kapcsolata elveszett: a helyes JELENTKEZÉS-ben T, C és P együtt marad.

14. R(T, C, N, L, O, V, E, D, P): T → N; C → L,O; O → V,E; TC → D,P. Mi {C}⁺ és mi {T,C}⁺?

{C}⁺ = {C,L,O,V,E}. {T,C}⁺ az egész sémát tartalmazza: {T,C,N,L,O,V,E,D,P}. C nem szuperkulcs, TC az. Mivel T és C külön nem határoz meg mindent, TC a megadott függések mellett minimális kulcsjelölt.

15. Az id oszlop hozzáadása automatikusan 3NF-be hoz-e egy hibás nagy táblát?

Nem. Az id azonosítja a sorokat, de az oktató_id → oktatói_email és más nem kulcsból kiinduló, problémás függések megmaradhatnak. Az üzleti tényeket és minden kulcsjelöltet továbbra is vizsgálni kell.

Önálló tervezési feladat: eszközkölcsönző

Egy technikumi eszközkölcsönzőben tanulók több különböző eszközt kölcsönözhetnek, és ugyanazt az eszközt idővel többször is kiadhatják. Egy kölcsönzés_id egyetlen kiadási eseményt azonosít, amely pontosan egy tanulóhoz és egy eszközhöz tartozik. A kölcsönzéshez kiadás_dátuma és visszahozási_határidő tartozik. Egy eszköz_id egy fizikai példányt jelöl. Egy eszköz pontosan egy típussal rendelkezik. A típus_id meghatározza a típus nevét és a javasolt kölcsönzési napok számát. A tanuló_id meghatározza a tanuló nevét. A kiinduló, már atomi tábla: KIADÁS(kölcsönzés_id, tanuló_id, tanulónév, eszköz_id, típus_id, típusnév, javasolt_napok, kiadás_dátuma, visszahozási_határidő).

  1. Határozd meg a kulcsot és az alapvető funkcionális függéseket!
  2. Indokold meg, miért nem elég kulcsnak a tanuló_id és eszköz_id pár!
  3. Állapítsd meg, hol vannak anomáliák, és készíts 3NF relációs sémát!
  4. Jelöld a PK-kat, FK-kat, és adj meg megfelelő JOIN-útvonalat!
  5. Magyarázd meg, miért nem tároljuk kizárólag számított értékként a konkrét visszahozási határidőt!
Részletes mintamegoldás és indoklás
  1. A kulcs a kölcsönzés_id. Ugyanaz a tanuló ugyanazt a példányt több külön időpontban kölcsönözheti, ezért a tanuló_id–eszköz_id pár nem egyedi. A kiadás dátuma sem feltétlenül egyedi; nem feltételezünk napi egyetlen kiadást.
  2. A függések: kölcsönzés_id → tanuló_id, eszköz_id, kiadás_dátuma, visszahozási_határidő; tanuló_id → tanulónév; eszköz_id → típus_id; típus_id → típusnév, javasolt_napok. A megadott szabályok mellett minden kulcsjelölt egyoszlopos, így nincs részleges függés: a nagy atomi tábla 2NF-ben van. A nem kulcs attribútumokon átvezető tranzitív függések miatt azonban nincs 3NF-ben.
  3. A 3NF modell: TANULÓ(tanuló_id PK, tanulónév); TÍPUS(típus_id PK, típusnév, javasolt_napok); ESZKÖZ(eszköz_id PK, típus_id FK → TÍPUS); KÖLCSÖNZÉS(kölcsönzés_id PK, tanuló_id FK → TANULÓ, eszköz_id FK → ESZKÖZ, kiadás_dátuma, visszahozási_határidő). Az általános szabályok és a konkrét esemény adatai elkülönülnek.
  4. KÖLCSÖNZÉS-ből tanuló_id alapján TANULÓ-ra, eszköz_id alapján ESZKÖZ-re, majd típus_id alapján TÍPUS-ra kapcsolunk. Így minden konkrét kiadás visszakapja saját tanulóját, eszközét és típusadatait. A bontás közös attribútumai mindig a megfelelő törzsreláció kulcsát határozzák meg.
  5. A javasolt napok típusszintű alapértelmezés. A konkrét szerződött határidő eltérhet ettől, illetve a szabály később változhat. A múltbeli kölcsönzés tényleges határidejét meg kell őrizni; ez saját eseményadat, nem hibás másolata a mai típusbeállításnak.

Ha a kulcsokat, függéseket és a bontások okát önállóan meg tudod indokolni, és a relációs műveletekkel vissza tudod keresni az összetartozó adatokat, a relációs modell legfontosabb alapjait már használni is tudod.