Adatbázisrendszerek
I. |
|
Vizsga adminisztrációs
adatbázisa |
A feladat leírása, egyedek, kapcsolatok
leírása:
A feladat egyetemünkön félévek
végén az egyes tárgyak lezárására szolgáló vizsgák adatainak, és a rájuk
jelentkező hallgatók adminisztrálása. Nyilvántartja a vizsgák tárgyát,
típusát, helyét, idejét, a vizsgák helyéül szolgáló termek helyét, férőhelyének
számát, a vizsgát tartó tanárok nevét, azonosítóját, beosztását, szobaszámát,
a hallgatók nevét, azonosítóját, tankörét,
jelentkezését. Segítségével lekérdezhető, mely tantárgyakból hol, mikor,
ki milyen vizsgát tart, vagy tartott, és arra kik jelentkeztek, van-e még
hely jelentkezők számára, és egy adott időpontban mely termek mely vizsgák
részére hány fővel (max. fő) van lefoglalva,
vagy szabadok még újabb vizsgák tartására. A termekről vezetett nyilvántartás
segítségével esetleges összevonások is szervezhetők. Tanárok csak akkor
kerülnek be a nyilvántartásba, ha vizsgát szándékszanak tartani, ugyanígy
a hallgatók is csak akkor, ha jelentkeznek
valamelyik vizsgára. Viszont a termek listája teljes egészében benne van
az adatbázisban, hogy könnyebb legyen vizsgához megfelelőt választani.
Az adatbázis feladata ebben ki is merül, azt már nem tartja számon, hogy
a jelentkező elment-e, és milyen eredménnyel
szerepelt. Ezen dolgok már nem publikusak a tanárok és a hallgatók előtt,
és a tanulmányi osztály úgyis számon tartja egy másik adatbázisban.
Egyedek definíciói, tulajdonságaik:
Vizsga:
A modell fő egyede: erre a vizsgára jelentkeznek a hallgatók,
ezt tartja a tanár, és ehhez foglal
termet az ezzel megbízott személy: tanár, gyakvezér, tanszéki adminisztráció
(a modell szempontjából lényegtelen). (Az előbbi mondatban dőlten
szedve a modell leendő kapcsolatai szerepeltek.)
Az egyed tulajdonságai:
-
ID: azonosító - number(3) Elsődleges kulcs,
-
Szak: melyik kar melyik szakának a tantárgyából lészen a
vizsga (pl: ME-GÉK Műsz. inf.)
- char(20),
-
Tárgya: mely tantárgyból lesz a vizsga - char(30),
-
Típusa: (többértékű) ez több
dolgot is meghatároz: mi a vizsga típusa (szigorlat, kollokvium, aláírás-pótló,
gyakjegy-utóvizsga, különbözeti, javítóvizsga), másrészt az adott alkalommal
milyen típusú vizsgákat lehet letenni (szigorlat, kollokvium,
aláírás-pótló, gyak-UV, különbözeti, eltolt)
Tehát így nem kell az adott tárgyból típustól függően több vizsgát kiírni,
ha azt ugyanazon időpontban és helyen kívánja a tanár tartani. Ha a hallgató
pl. aláírás-pótlásra megy, akkor ezt csak a jelentkezésében kell jeleznie
(mint az legtöbbször a gyakorlatban történik*), és a jelentkezésnek (vagy
ha a modell nem engedi, akkor a hallgatónak) lesz is ilyen tulajdonsága.
(*Megjegyzés: ha nem, akkor a modell lehetőséget
nyújt típusokra külön-külön alkalmakat kiírni.) - char(15),
-
Ideje: (összetett) Meghatározza,
mikor lesz a vizsga. Elemei: dátuma - Date,
kezdési időpont - Time
-
Max. jelentkező: (függ a terem
befogadóképességétől, és hogy a tanár mennyire szeret szanaszéjjel ültetni)
A jelentkezések száma nem haladhatja meg ezt az értéket. Ezért a jelentkezés
kapcsolatnak lesz egy ?sorszáma? tulajdonsága, amely megmondja, hányadiknak
jelentkezett a hallgató. Ez természetesen az adatbázisból lesz meghatározva:
hány jelentkezés történt már. - number(3),
-
Min. jelentkező: ha ennél kevesebb
jelentkezés történik, a vizsga elmaradhat. (Ha itt nincs értéke (vagyis
NULL értékű), akkor nincs ilyen megkötés.) - number(2).
Tanár: Aki a vizsgát tartja.
Az egyed tulajdonságai:
-
Login: - char(10)
Elsődleges
kulcs,
-
Név - char(30),
-
Beosztás: udvariasság szempontjából - char(15),
-
Szobaszám: a tanár szobája, ahol megtalálható A sztring elso
karaktere(i) az épületre, a szóköz karakter utáni szám az emeletre és az
emeleten belüli sorrendben elfoglalt helyére utal. (pl:
A4 113) - char(8).
Terem: ahol a vizsga lesz.
Lehet az egy tanár szobája is bizonyos esetekben, ekkor a terem száma megegyezik
egy szobaszámmal.
A teremnek van:
-
Megnevezése: előadó, terem,
tanári szoba - char(15) Elsődleges
kulcs,
-
Helye: tájékozatlan hallgatók eligazításához kell. Értékének
felépítése ugyanaz, mint a tanár szobaszámánál- char(8).
-
Férőhelyének száma: nem lehet
kisebb, mint a max. jelentkezők száma a vizsgánál. Ezt a vizsga kiírójának
figyelembe kell venni. Tanári szoba esetén nincs. - number(3).
Hallgató: aki a vizsgára
jelentkezik.
Van:
-
Login: - char(10)Elsődleges
kulcs,
-
Neve - char(30),
-
Tanköre - char(5).
E/R modell:
Kapcsolatok:
Vizsgát tart: Kötelező
jellegű, mert ha a tanár kitűzte a vizsgát, akkor a ?vizsgát meg is kell
tartania?, vagyis tanár nélkül nincs vizsga.
Egy vizsgán több tanár is megjelenhet felügyelni (és nem
feltétlenül azok, akik értékelni fognak - írásbeli esetén), és az adott
alkalommal ugyanaz a tanár több vizsgát is tarthat ,ha más-más tantárgyakból,
vagy más-más típusút ugyanazon tantárgyból tart.
Teremfoglalás: Kötelező
jellegű, mert valahol lennie kell a vizsgának.
Egy vizsga általában csak
egy teremben van, de egy teremben lehet több vizsga is, ha ugyanazon tanár
több tárgyból és/vagy többféle vizsgát tart, vagy ha különböző vizsgák
tanárai erről megegyeznek.
Jelentkezés: Nincs
kötelező jellege, mert egy kiírt vizsgára nem kötelező a hallgatónak elmenni.
Egy vizsgára több hallgató is jelentkezhet (normális esetben),
és egy hallgató több vizsgára is jelentkezhet, a gyakorlat
szerint ugyanazon napra eső vizsgákra is.
Tulajdonságai:
-
Sorszám: megmondja, hányadiknak
jelentkezett a hallgató, hány jelentkezés történt már. Értéke nem haladhatja
meg a vizsgára nevezők maximális számát - number(3),
-
Vizsga típusa: ezzel jelzi a hallgató a
tanár felé, hogy ő a különböző típusok közül (ha az adott alkalomra több
is ki van írva) melyikre jelentkezik, így a tanár tudja, milyen sorokat
kell összeállítania - char(15).
IFO modell:
Konverzió:
-
Az ID, Szak, Tárgy, Min. fő, Max. fő elemi objektumok,
az Ideje aggregáció - Dátum és Kezdési idő elemi objektumokból
tevődik össze - és a Típus csoportképzés meghatározzák a Vizsga
absztrakt objektumot.
-
A Login, Név, Tankör elemi objektumokból a Hallgató
absztrakt
objektum lesz meghatározva,
-
a Login, Név, Beosztás, Szobaszám elemi objektumokból
a Tanár absztrakt objektum,
-
a Megnevezés, Helye, Férőhely elemi objektumokból
a Terem absztrakt objektum, amelynél a Helye rekordösszetétel:
az Épület, Emelet, Ajtó elemi objektumokból áll.
-
Ha specializáljuk a Tanár absztrakt objektumot, mint
Vizsgáztatót,
akkor ennek egy csoportját hozzárendelve egy Vizsgához
kapjuk, kik
tartják a vizsgát.
-
Ha specializáljuk a Hallgató absztrakt objektumot,
mint Jelentkezőt - amelyhez hozzá van még a Sorszám és a
Típus
elemi objektum rendelve -, akkor ennek egy csoportját hozzárendelve egy
Vizsgához
kapjuk,
kik jelentkeznek az adott vizsgára.
-
Ha specializáljuk a Terem absztrakt objektumot, mint
Helyét,
akkor ezt hozzárendelve egy Vizsgához megkapjuk, hol lesz a vizsga.
Relációs
adatmodell:
A relációs adatmodell létrehozása a megadott szabályokat
követi:
-
Egyedből rekord: Vizsga,
Terem, Tanár, Hallgató rekordok;
-
Tulajdonságból mező;
-
1-N kapcsolatból kapcsolókulcs (a kapcsolat N-es oldalára
kerül): Tart ( Vizsgát kiír);
-
N-M kapcsolat kapcsolórekord segítségével: Jelentkezés
és
Teremfoglalás
kapcsolótáblák létrehozása (a Jelentkezés
rekord még a Jelentkezés
kapcsolat
tulajdonságait is tartalmazza);
-
Többértékű tulajdonság külön
rekord lesz (Vizsga típusa), de ehelyett máshogy valósítjuk
meg: Mivel csak öt különböző értéket vehet fel - szigorlat (S), kollokvium
(V), aláírás-pótló(A),
gyak-UV (G), különbözeti (K),
eltolt (E), jelölje mindegyiket egy karakter. Ezek kombinációja kerül a
mezőbe, ami lekérdezésnél kiértékelhető (program vagy felhasználó által).
Így a mező típusa: char(5). Ebből következően a Jelentkezés típusa
mező
is csak ezen értékek közül vehet fel egyet(!), ezért ennek típusa:
char(1);
-
Összetett tulajdonság egy mezőbe
összevonva vagy több mezőre bontva szerepel: itt a terem helyét
szétszedtem.
-
A Vizsga tábla ID mezeje, Jelentkezés tábla
Sorszám
mezeje
egy Sequencer objektum által kap értéket. Mivel minden vizsgára
külön-külön lehet jelentkezni, minden vizsgához tartozik egy saját
sequencer
a jelentkező sorszámának megállapításához, a vizsga ID-jéhez viszont
elég egy is.
Normalizálás:
Először meg kell vizsgálni a függőségeket:

Első normálforma: mező atomisága és kulcsmező létezése
Az atomiság teljesül mindegyik táblára, mert a konverziónál
a többértékű vizsga típusa mező új formában tárolja az értékeket
(lásd: relációs adatmodell),
az összetett vizsga ideje mező dátum és kezdési idő mezőkre,
a terem helye mező pedig épület, emelet, ajtó mezőkre esett
szét. Kulcsmező mindegyik táblában van, és ezekből indulnak ki a függőségek,
kivéve a Tart és Jelentkezés táblában:
-
A Tart tábla két mezője együtt már egyedi, itt ez
lesz az összetett kulcs.
-
A Jelentkezés táblában a Vizsga és a
Hallgató
mező
együtt lesz összetett kulcs, ami már egyedi minden rekordelőfordulásra,
így azonosítja azt.
Mindezek után így néz ki a modell:

Második normálforma:
teljes kulcsból, ne pedig részkulcsból induljanak ki a függőségek:
Részkulcsok a Tart
és
Jelentkezés táblában vannak, de ezekből nem indul ki függőség, csak
a teljes kulcsból..
Harmadik normálforma:
ne legyen tranzitív függőség:
Nincs tranzitiv függőség.
Így már nekieshetünk
az SQL megvalósításhoz. A SELECT-ek:
1. Irassuk ki a tantermek es az
eloadok atlagos ferohelyeinek szamat a Miskolci Egyetemen!
2. Irassuk ki, hogy kik jelentkeztek
mar fizika vizsgara (ElDinOpt+MechHotan-eltolt)!
3. Irassuk ki, hogy hol van a
XXX-as eloado!
4. Modositsuk Raisz Peter beosztasat
docensre!
5. Irassuk ki mikor vizsgaztat
Fegyverneki!
Es a megoldasok:
1. CREATE VIEW KOD AS SELECT VIZSGA
FROM TART WHERE TANAR=(SELECT LOGIN FROM TANAR WHERE NEV='FEGYVERNEKI SANDOR');
SELECT DATUM, SZAK, TARGY FROM
VIZSGA, KOD WHERE ID=VIZSGA;
DROP VIEW KOD;
2. UPDATE TANAR SET BEOSZTAS='DOCENS'
WHERE NEV='RAISZ PETER';
3. SELECT HELYE FROM TEREM WHERE
MEGNEV='XXX. ELOADO';
4. CREATE VIEW VID AS SELECT ID
FROM VIZSGA WHERE TARGY IN ('ELEKRODINAMIKA OPTIKA' , 'MECHANIKA ALAPJAI
HOTAN' );
CREATE VIEW LOGJel AS SELECT HALLGATO
FROM JELENTKEZES,VID WHERE ( VIZSGA=ID and tipus like 'V%' );
SELECT NEV FROM HALLGATO, LOGJEL
WHERE HALLGATO=LOGIN;
DROP VIEW VID;
DROP VIEW LOGJEL;
5. SELECT AVG( FEROHELY ) FROM TEREM;