A relációs adatmodell mûveleti része

 

 

Az elõzõ fejezetben megismerkedhettünk a relációs adatmodell struktúrális és integritási komponenseivel. E komponensek vesznek részt a relációs modell felépítésébében, e komponensekbõl áll össze a relációs adatstruktúra. Az itt megadott szabályok határozzák meg, hogy hogyan nézhet ki egy konkrét adatbázis. Mivel ezen komponensek az adatbázis bármely idõpontbeli állapotaira vonatkoznak, tulajdonképpen idõtõl függetlenek, ezért statikus elemeknek nevezzük õket.

 

Az adatbázisok azonban nem holt, befagyott rendszerek, struktúrák. Az adatbázis értelme, hogy használják, hogy felhasználják. E felhasználás során a különbözõ felhasználók módosíthatják és lekérdezhetik az adatbázis tartalmát. Az adatrbázis akkor lesz tehát élõ, ha csatlakozik hozzá olyan funkciócsoport is, amley lehetõvé teszi az adatbázisban tárolt adatok módosítását és lekérdezését. Mivel e kompononsek az adatbázis változásaihoz, megváltoztatásához kapcsolódnak, ezért dinamikus komponenseknek nevezzük. A relációs adatmodell mûveleti része ezen dinamikus adatkezelõ és adatlekérdezõ lehetõségeket foglalja magába.

 

A relációs adatmodell mûveleti része a relációkon alapul, azaz a mûveletek mindegyike relációkon értelmezett. Ez azt jelenti, hogy bemenõ operandusai a relációk lehetnek. A lehetséges mûveleteket számba véve a következõ mûveletköröket lehet kiemelni:

- adatok lekérdezése

- adatok felvitele

- adatok módosítása

- adatok törlése

A fenti négy mûveletkörbõl az utóbbi hármat együttesen adatkezelõ (data manipulation) utasításoknak nevezik. Az adatkezelõ utasítások értelmezése viszonylag egyértelmû, hiszen mindenki sejti, mit is fog jelenteni, hogyan történhet pl. az adatok felvitele. Ezzel szemben az adatlekérdezés egy sokkal szabadabb, tágabb értelmezést biztosít, hiszen itt elviekben nagyon sokfajta lehetõség kínálkozik arra, hogy mit és hogyan olvasok ki az adatbáziból, hogyan rakhatjuk össze az elemi információkat egy komplex kérdés esetén. Ezért az adatlekérdezési funkciót sokkal nagyobb terjedelemben fogjuk tárgyalni, mint az adatkezelõ mûveleteket. Mivel az adatkezelõ mûveleteknél bizonyos pontokon hivatkozni fogunk az adatlekérdezéshez kapcsolódó elemekre, így elõbb az adatlekérdezés mûveletét vessszük át.

 

A relációkból elméletileg igen sokféleképpen, sokféle mechanizmussal lehet adatokat kiolvasni. A gyakorlatban is több tipusát láthatjuk az adatlekérdezés mechanizmusának, habár az igazi relációs adatmodell kijelölt egyfajta kezelési technikát. A Codd által javasolt mechanizmus ugyanis sokkal erõforrásigényesebb, mint a hagyományos adatolvasási mechanizmusok. A szokásos rekordorientált megközelítés, amely mint látni fogjuk igencsak idegen a tiszta, igazi relációs adatmodelltõl, e hatékonysági korlátok miatt tudott napjainkig is megférkõzni az egyszerûbb, relációkat tároló xBase-es adatkezelõ rendszerekben.

A relációs adatmodellben a relációkból történõ információ kinyerése is biztos elméleti alapokon nyugszik. A Codd által definiált adatlekérdezõ mûveletcsoportot összefoglalóan relációs algebrának nevezik. A relációs algebra az alapja a ma már szabványként elfogadott és leginkább elterjed adatlekérdezõ relációs parancsnyelvnek, az SQL-nek is.

 

Nézzük, mit is jelent pontosan a relációs algebra kifejzés. Az algebra szó a matematikában azt a diszciplinát jelöli, amely egy halmazon értelmezett mûveletek tulajdonsáait vizsgálja. A mi esetünkben a mûveletek a relációkon értelmezettek, így innen származik a relációs algebra kifejezése. A mûveletek tehát relációkon értelmezettek és ami nagyon fontos és lényeges, hogy relációkat is adnak eredményül. Tehát egy lekérdezés eredménye egy újabb relációt szolgáltat, vagyis a relációs algebrai mûveletek nem vezetnek ki a relációk halmazából, a kapott eredmény szintén az adatbázis részének tekinthetõ.

 

Ez a tulajdonság alapján szokták azt mondani, hogy a relációs algebrai mûveletek zártak a relációk halmazára nézve, hiszen bárhogy is alkalmazva õket, újból egy adatbázisbeli relációt fogunk kapni. A zártság egy mellékkövetkezménye, hogy e rendszerben az egyes mûveletek sokkal nagyobb szabadsággal ágyazhatók egymásba, hiszen egy eredményül kapott reláció szabadon felhasználható más mûveleteknél mint bemenõ operandus. Ezáltal szinte korlátlan a lehetséges lekérdezési utasítások darabszáma, a felhasználók a rendelkezésre álló mûveletelemeket szinte tetszõlegesen illeszthetik egymáshoz.

 

Mivel a relációkat halmazokként értelmeztük, ezért szokás a relációs algebrát is halmazorientáltnak nevezni. A mûveleteket tehát a rekordok halmazán értelmezzük, azaz minden mûvelet a relációban lévõ össszes, feltételnek eleget tévõ rekordra fog vonatkozni. A relációs algebra több különbözõ mûvelet is értelmez a relációkra vonatkozóan. Ezek között vannak olyanok melyek egyparaméterûek és vannak kétparaméterû mûveletek is. A piacon kapható RDBMS rendszerek zöme az SQL kezelõ nyelven alapszik, s e nyelv igen jól megvalósítja a most bemutatandó relációs algebrai mûveleteket. Más kezelô felületek, mint pl. az Xbase alapú rendszerek csak részben felelnek meg a halmazorientáltság követelményeinek, s továbbra is a korábbi adatmodellekben megszokott rekordorientált mûveletközelítést alkalmazzák.

 

Relációs algebra mûveletei

 

Elsõként tekintsük át, milyen mûveletek tartoznak a relációs algebra körébe, majd eztkövetõen sorra vesszük az egyes mûveleteket. A relációs algebra a következõ mûveletek tartalmazza:

 

- szelekció

- projekció

- join, egyesítés

- unió

- metszet

- különbség

- osztás

- kiterjesztés

- csoportosítás

A megadott mûveletek közül az elsõ hét már Codd definiciójában i benne foglaltatott, míg az utólsó kettõ csak késõbb, a felhasználói igények alaposabb elemzlése után került be a relációs algebrába.

A felsorolt lekérdezõ mûveletek nem változtatják meg az operandusként megadott relációkat, csak olvassák azokat, majd az eredményt leteszik egy új, önálló eredmény relációba. A relációs algebra mûveletei közül az elsô három játsza a legnagyobb szerepet, mivel ezek a mûveletek fordulnak elô a leggyakrabban a lekérdezések során.

Elsôként ezeket vesszük sorra.

 

A szelekciós mûveletek a relációban szereplô rekordelôfordulások egy részhalmazának az elôállítására szolgál. A kiválasztott részhalmazba csak azok a rekordelôfordulások kerülnek bele, melyek kielégítik a szelekciós feltételt. A szelekció elvégzéhez tehát meg kel adni egy relációt és egy feltételt. A feltételnek olyannak kell lennie, hogy a reláció minden rekordjára kiértékelhetõ legyen, s egy logikai értéket adjon vissza. Azon rekordok, melyekre a feltétel igaz értékû lesz, bekerülnek az eredményrelációba. Úgyis mondhatnánk, hogy a szelekció a tábla néhány sorát adja meg eredményként.

 

Az alábbi példában az AUTÓ táblából kiválasszuk, szelektáljuk a kék színû autókat. Az eredményreláció csak a kék színû autókat fogja tartalmazni.

 

 

A szelekciós feltételt lehet egyszerû vagy összetett, melyben hivatkozhatunk mezôértékre és konstans adatelemekre is. Ha egy konstans értékkel hasonlítunk össze egy mezôt, akkor beszélünk konstans szelekciós feltételrôl, ha pedig két mezôt hasonlítunk össze, akkor attribútum szelekciós feltételt értékelünk ki.

Az elõzõ példában szereplõ szín = 'piros' feltétel egy konstans szelekciót ad meg, míg egy emberek adatait tároló relációban az életkor > 2*testsúly feltétel két mezõ értékét hasonlítja össze, így ez attributum szelekciót reprezentál.

 

Ha adott egy tanulókat tartalmazó reláció, akkor konstans szelekcióra fog épülni az a mûvelet, amely azon hallgatókat adja vissza egy eredménytáblába, melyek jeles eredményt értek el matematikából. A szelekciós feltétel itt az lesz, hogy a matematika jegy jeles. Az attribútum szelekcióra lehet egy másik példa az, amikor azon hallgatókra vagyunk kíváncsiak, akiknek jobb jegye van matematikából mint magyarból. Ekkor a szelekciós feltétel, hogy a matematika érdemjegy mezô nagyobb értéket tartalmazzon, mint a magyar érdemjegy mezô.

 

Az elemi feltételeket logikai operátorokkal összekötve összetett szelekciós feltételt kapunk. Erre lehet példa a szelekció, amikor azon autók adatai kerülnek át az eredménytáblába, melyek vagy kék színûek vagy Mazda a tipusuk.

 

 

A felhasználható operátorok körérõl majd az SQL nyelv tárgyalásakor beszélünk részletesebben. Annyi már elõrebocsájtható, hogy a szokásos operátorok (AND, OR, NOT, <, >, =, +, -, *, /) itt is alkalmazhatók, ezek köre azonban ki fog bõvülni néhány újabb, speciális utasítással.

 

A projekció azt a mûveletsort jelenti, amikor a relációban a rekord elôfordulásokat leíró mezôkbôl csak bizonyos mezôk értékeit kérdezzük le eredményként. Az eredményreláció csak a kijelölt mezôkre vonatkozó adatokat tartalmazza, viszont minden rekordelôfordulás szerepel az eredményrelációban. A projekció tehát a tábla leszûkítését jelenti bizonyos oszlopaira.

A projekció elvégzéséhez meg kell adni a kiinduló relációt és az eredménytáblába átkerülô mezôk explicit felsorolását..

 

Projekciónak felel meg az a lekérdezési mûvelete, amikor az autók adatai közül csak az autó színére és tipusaira vagyunk kíváncsi, azaz az eredményreláció csak a szín és a tipus mezôt tartalmazza, viszont minden lehetséges értékpárost tartalmazni fog az eredményreláció.

 

 

A projekcióval kapcsolatosan az a probléma merülhet fel, hogy mi történik akkor, ha a projekcióval kapott eredményrelációban egy rekordelôfordulás többször is elôfordulna. A példánkban ez akkor következne be, ha létezne két azonos tipusú és színû autó. Az elméleti relációs modell szerint egy relációban egy rekordelôfordulás nem szerepelhet kétszer, ezért az eredménytáblának csak egyszer kell tartalmaznia minden eredmény rekordot. Ezáltal az eredmény reláció számossága kisebb lehet, mint az induló reláció számossága.

A gyakorlati RDBMS rendszerek viszont gyakran minden elôfordulást meghagynak az eredménytáblában, mivel ez a többszörösség gyakran hasznos információt jelenthet a felhasználónak, ezért külön kapcsoló áll rendelkezésre az egyes lekérdezõ nyelveknél a projekcióhoz, ha nem akarunk elôfordulás többszörözést az eredmény relációban.

 

A szelekció és projekció együttesen is használható, pl. amikor azon autók rendszámára vagyunk kiváncsiak, amelyek színe piros vagy kék. Az eredményrelációt a következõ ábra mutatja:

 

 

 

Az összekapcsolás (join) mûvelete az elôzô mûveletektôl eltérôen egy kétoperandusú operátor, azaz két relációból állít elô egy eredmény relációt. Az összekapcsolás a relációk Descartes szorzatán alapszik, vagyis amikor az eredménytáblában a két táblából vett rekordelôfordulások minden lehetséges párosítása szerepel. Az egyesítés eredményeként kapott reláció mindkét reláció minden mezôjét tartalmazza.

Az összekapcsolás bemenõ paramétereinek két relációnevet kell megadni. Ekkor az eredményreláció úgy áll elõ, hogy az egyik reláció minden rekordját összekapcsoljuk a másik tábla minden rekordjával. Ha az egyik tábla N rekordot, a másik meg M rekordot tartalmaz, akkor N*M lehetséges illesztés lehetséges, tehát az eredménytábla is N*M rekordot fog tartalmazni. Az eredményreláció szerkezete a két, összekapcsolt relációból származó minden mezõt magába foglal. Azaz ha az egyik reláció N darab mezõt, a másik meg M darab mezõt tartalamaz, akkor összesen N+M mezõje lesz az elõálló eredményrelációnak.

 

Az összekapcsolásra azért van szükség, mert a relációs adatbázisokban az adatok több relációba szétszórtan helyezkednek el, s a felhasználónak viszont gyakran van szüksége az elemi adatok mellett a kapcsolatban álló adatokra is. Az elõzõ modelljeinkben például külön táblában tároltuk mind az autó, mint a tulajdonos adatait. Erre azért is szükség volt, mert mindkettõ különbözõ adatszekezettel írható le. Egy ezen modellre épülõ információs rendszerben minden valószínûség szerint gyakran igény jelentkezne olyan információra is, mely az autókat és a tulajdonos embereket együtt mutatja, vagyis az autót a tulajdonosával együtt kívánjuk megjeleníteni. A kapcsolódó, de különbözõ relációkban elhelyezkedõ adatok együttes elõálítására az összekapcsolás mûvelete ad lehetõséget.

 

Az elõzõekben említett példának egy mintarendszerre vonatkozó szemléltetését láthatjuk az alábbi ábrán:

 

 

Természetesen ritkán fordul elô, hogy minden lehetséges párosításra szükségünk van, viszont annál gyakrabban szeretnénk azon párosításokat megkapni, melyek valamilyen feltételnek megfelelnek. Ez azért is olyan gyakori, mert a kapcsolatokat, mint ismert az adatértékeken keresztül, pl. a kapcsolókulcs és kulcs értékegyezôségével tároljuk.

Tehát amikor a kapcsolatban álló rekordelôfordulásokat kívánom elôállítani, akkor szükség van mindkét rekordra, melyeket az köt össze, hogy azonos értékek vannak az illeszkedô mezôkben. Azaz a lehetséges, összes párosítások közül csak azokra vagyunk kíváncsiak, melyeknél a két illeszkedô mezô azonos értéket vesz fel.

 

A kapcsolat azonban nemcsak értékegyezôségen, hanem más összetettebb feltételeken keresztül is megvalósulhat. Ezért az összekapcsolás mûveletéhez hozzátartozik egy illesztési feltétel is, mely megadja, hogy mely párosítások kerüljenek át a Descartes szorzatból az eredménytáblába. Az egyesítési feltétel itt is lehet egyszerû és összetett feltétel. Ekkor tehát a két alaptábla mellett egy illesztési feltételt is megadnak a mûvelet végrehajtásához.

 

Példaként továbbra is azt az esetet tekintsük, amikor az autók és az emberek külön-külön relációban helyezkednek el, s a két egyed között egy tulajdonosi relációt modellezünk, s a kapcsolatot az autó relációba helyezett kapcsoló mezôvel reprezentáljuk. Az autó reláció tartalmaz egy tulajdonos mezôt, mely a tulajdonosának az azonosító kódját tartalmazza. Az elvégzendô mûvelet, az autók rendszámának és a tulajdonos nevének a kiírása az eredménytáblába.

 

Mivel két táblából kell az adatokat összeszedni, ezért használjuk az összekapcsolás mûveletét, s az illesztési feltételként azt adhatjuk meg, hogy az autó rekord tulajdonos mezôjének értéke legyen egyenlô az ember rekord azonosító kód mezôjének értékével. Ha utánagondolunk, láthatjuk hogy az eredmény elõállításához nem elegendõ csupán az összekapcsolás mûvelete, hiszen annak eredménye más mezõket is tartalmaz. Ezért az összekapcsolás után még egy projekciót is végre kell hajtani. E példában tehát a mûveletek egymásutánfûzésére is példát kaphatunk.

 

 

Az összefûzés egyik speciális esete a természetes összefûzés (natural join), amikor az egyesítési feltétel a két tábla azonos elnevezésû és domainnel rendelkezõ mezôire követeli meg az értékegyezôséget. Az eredménytábla a felesleges redundancia elkerülése miatt a kapcsoló mezôt csak egyszer tartalmazza.

 

 

Az összekapcsolásnak a natural join mellett még számos más változata is van, melyekre késôbb még majd visszatérünk.

 

Az unió halmazegyesítést jelent, ez is kétoperandusú mûvelet, viszont itt mindkét táblának kompatibilis szerkezetûnek kell lenni, hiszen az eredményreláció mindkét reláció rekordelôfordulásait tartalmazza, s hogy azok egy relációba elhelyezhetôek legyenek, mindkét kiinduló relációnak kompatibilis felépítésûnek kell lennie. Az eredményreláció struktúrája megegyezik a bemenõ relációk struktúrájával.

 

 

A metszet két relációban mindkét helyen elôforduló rekordelôfordulásokat adja vissza az eredménytáblában. Itt is mindkét táblának kompatibilis szerkezetûnek kell lenni, hiszen az eredményreláció a mindkét relációban meglelhetô közös rekordelôfordulásokat tartalmazza.

 

 

A különbség is kétoperandusú mûvelet, mely az elsôként vett relációban megtalálható, de a másodikban nem szereplô rekordelôfordulásokat adja vissza az eredménytáblában. Itt is mindkét táblának kompatibilisnek kell lennie. A különbség mûvelete nem szimmetrikus, azaz az eredmény függ az operandusok megadási sorrendjétõl. Apéldában a FIÚK táblából vonjuk ki a VERSENYZÕK táblát.

 

 

Az osztás egy kissé bonyolultabb mûveletet jelent. Ez is kétoperandusú az elõzõ mûveletekhez hasonlóan. Az R1 és R2 relációk hányadosa az a reláció, melyben R1 mindazon rekordjainak projekciói tartoznak, melyek Descartes szorzata az R2-vel, legnagyobb részhalmazát alkotják az R1-nek. Gyakorlatban igen ritkán használt és kevés RDBMS-ben megvalósított mûvelet ez, hiszen végrehajtása igen idõigényes, s gyakorlati haszna sem jelentõs.

 

 

A példában azért lett a (Laci, Zoltán) értékeket tartalmazó tábla az eredménytábla, mert ez az a reláció, melynek összekapcsolása a SPORTÁG relációval benne van a HOBBY relációban és ez adja a legnagyobb ily módon elõálló részhalmazát a HOBBY táblának. Az osztás eredményét egyébként az alábbi módon állíthatjuk elõ: elõbb szeleketáljuk a HOBBY táblát a SPORTÁG táblában megadott értékek szerint, s projekciót végzünk a SPORTÁG-ban nem szereplõ mezõkre. A szelekciót a SPORTÁG tábla minden rekordjára el kell végezni, így annyi eredménytáblát kapunk, ahány sorból állt az osztó tábla. Ezután vesszük az eredménytáblák metszetét, ami egyben az osztás eredményét tartalmazó tábla is lesz.

 

 

A kiterjesztés mûvelete valójában kicsit késôbb került be a köztudatba, s még ma sem terjedt el igazán, mint önálló mûvelet, pedig a gyakorlatban igen sokszor használjuk. Ezért célunk, hogy most megérdemelt helyére emeljük a többi mûvelettel egyenrangú szintre. Ezen új mûvelet létrehozásának indíttatása az volt, hogy egyes lekérdezéseknél nem mindig csak a mezôértékekre, hanem azokból képzett valamilyen kifejezések értékeire vagyunk kíváncsiak.

Például ha egy relációban van egységár és mennyiség mezô, akkor bizonyos esetekben érdekelhet minket az összár értéke is mely e két mezô szorzatából adódik ki. Ezt úgy érhetjük el, hogy létrehozunk egy összár mezôt, melybe az egységár és a mennyiség mezôk szorzatát helyezzük el. Így tehát egy új relációt kaptunk, mely a régi mezôk mellett tartalmaz egy összár mezôt is.

A kiterjesztésre példaként vegyük azt az esetet, amikor az autó táblánál a Forint-ban megadott árat átszámoljuk más pénznemre.

 

 

 

A megvalósított RDBMS rendszerekben is találkozhatunk hasonló reláció kiterjesztésekkel, igaz az eredményreláció rendszerint csak egy ideiglenes, eredmény tábla lesz, amely nem tárolódik le az adatbázisba. Ekkor rendszerint nem is adunk külön azonosító nevet az újonnan létrehozott mezônek, ehelyett a rendszer a kiszámítási formulájával azonosítja ezt az oszlopot.

 

 

A másik ilyen jellegû mûvelet a csoportosítás. Bizonyos esetekben ugyanis nem magára a konkrét rekord-elôfordulásokra vagyunk kíváncsiak, hanem a rekord-elôfordulások valamilyen összesítô adataira. A statisztikai adatok sokszor elegendô információt nyújtanak és jobban is kezelhetôk, mint a részletes adatlisták. A dolgozók anyagi helyzetét egy adott vállalatnál jól jellemezheti, ha lekérdezzük pl. az átlagfizetést, illetve ha részletesebb információkra van szükségünk, akkor lekérdezhetjük hogy hány dolgozó esik az egyes fizetési osztályokba. Az eredménybôl nem fogjuk megtudni, hogy ki mennyit keres, de a dolgozók csoportjára már értékelhetô eredményt kapunk.

A relációs mûveletek egységessége értelmében az ilyen kérdésekre adott válaszoknak is relációban kell tárolódnia. Az eredményreláció viszont nem részhalmaza az induló relációnak, tehát nem szelekciót végeztünk, az eredményreláció minden egyes rekordja ugyanis összesítô adatokat tartalmaz az induló relációk megadott rekord-elôfordulásainak egy csoportjára.

 

A csoportképzés mûvelete tehát három bemenõ paramétert is igényel. Az elsõ annak a relációnak az azonosító neve, amelyre a csoportképzés vonatkozik. A második paraméter a csoportképzés alapjául szolgáló kifejezés. A csoportképzés értelmezése alapján a rendszer minden alaptáblabeli rekordra kiértékeli a megadott kifejezést, s azokat a rekordokat, melyekre a kifejezés ugyanazon értéket szolgáltatja, egyazon csoportba osztja be. Így tehát annyi különbözõ csoport jön létre, ahány különbözõ értéket ad a kifejezés a tábla rekordjainál. A harmadik paraméter az egyes csoportokra kiszámítandó kifejezéseket hatrározza meg. Ezeknek az értékeknek is egyértelmûeknek, egyértékûeknek kell lenniük. Mivel egy csoporton belül több rekord is elhelyezkedhet, az alaptábla mezõinek is több értéke lehet, így ezek a mezõk csak akkor maradhatnak meg az eredményrelációban, ha azok csoportképzés alapjául is szolgáltak, mert csak ebben az esetben biztosítható az értékek elemisége. A csoportképzés alapjául szolgáló mezõk mellett e csoportokra a csoport egyes elemeibõl képzett összesítõ értékeket szokták még szerepeltetni az eredményrelációban. Minden egyes csoportra lehet összesített adatokat képezni, mint pl.

- count, az elôfordulások darabszáma

- sum, elôfordulások valamely mezôjének összege

- max, elôfordulások valamely mezôjének maximuma

- min, elôfordulások valamely mezôjének minimuma

- avg, elôfordulások valamely mezôjének átlaga

 

Az eredménytábla állhat egy sorból is lehet üres is, attól függôen, mennyi csoportot képeztünk a rekord-elôfordulásokból.

 

Példaként vegyük azt a mûveletet, amikor az AUTÓ tábla alapján az egyes autótipusok átlagárait szeretnénk lekérdezni. Az eredményt úgy kaphatjuk meg, hogy elõbb csoportokat képzünk az autókra az autótipus alapján. Egy csoportba az azonos tipusú autók vognak kerülni. Ezután minden csoportra meghatározzuk a hozzá tartozó autók átlagárát. A csoportképzés három paramétere tehát a következõk lesznek: alaptábla: AUTÓ, csoportképzés kifejezése: tipus mezõ értéke, s a kírandó adatok: tipus mezõ és az ár értékek átlaga.

 

A csoportképzés során a csoportképzés kifejezése maradhat üresen is. Ekkor, vagyisha semmilyen feltételt nem adunk meg, akkor az összes rekordelôfordulás egy csoportba kerül.

 

Az autók darabszámát is csoportképzéssel lehet meghatározni:

 

 

Az elôbbiekben felsorolt mûveletek a megszabott kereteken belül tetszôlegesen kombinálhatók egymással, azaz valamely mûvelettel elôállított eredmény reláció felhasználható egy következô mûvelet induló relációjaként. Ilyenkor egy kifejezésbe is összevonhatók a mûveletek, mint ahogy azt már az összekapcsolás mûveleténél is láttuk:

 

 

A relációs algebra formális leírása

 

 

Mint ahogy a relációs adatmodell struktúrális része is egy formális nyelven adható meg a legtömörebben és legegyértelmûbben, úgy a mûveleti rész, a relációs algebra is megfogalmazható formális, matematikai szimbólumokkal. A mûveletek felírásánál a korábban bevezetett struktúrális jelölésekre fogunk támaszkodni.

 

A konstans szelekció, vagyis a relációból egy megadott feltételnek eleget tévõ rekordok kiválagotása egy eredmény relációba, szimbóluma a s jel, melynek paraméterei egy r alapreláció és egy szelekciós feltétel. A mûvelet formális felírása:

s XQ x(r) = { t | t Î r Ù t(X) Q x}

ahol X egy attributum csoport az r reláción belül, x egy az X tipusához illeszkedõ konstans és Q egy relációs operátor.

 

Az attributum szelekció, vagyis a relációból egy megadott feltételnek eleget tévõ rekordok kiválagotása egy eredmény relációba, ahol a feltételben két atributum összehasonlítása szerepel, szimbóluma szintén a s jel, melynek paraméterei egy r alapreláció és egy szelekciós feltétel. A mûvelet formális felírása:

s XQ Y(r) = { t | t Î r Ù t(X) Q t(Y)}

ahol X és Y is egy-egy attributum csoport az r reláción belül, s Q egy relációs operátor.

 

A projekciónál, vagyis a relációnak bizonyos attributumaira való leszûkítésénél, az alapreláció azonosítóját és a kiválasztott mezõk azonosítóit kell megadni paraméterként. A projekció szimbóluma a p jel. A paraméterezett mûvelet formális felírása:

p X(r) = { t(X) | t Î r}

ahol r az alaprelációt és X az r egy attributumcsoportját jelöli.

 

Az összekapcsolás, a relációk Descartes szorzata, olyan relációt eredményez, melyben a két bemenõ reláció rekordjainak minden lehetséges párosítása benne foglaltatik. Az összekapcsolás mûveletének jele a ´ szimbólum. Az összekapcsolás mûveleténél a két alaprelációt kell megadni paraméterként, s a mûvelet értelmezése a következõ:

r1 ´ r2 = { t | t Î r(R1+R2) Ù t(R1) Î r1 Ù t(R2) Î r2}

ahol r1(R1) és r2(R2) teljesül a két alaprelációra.

 

Mint említettük, az összekapcsolást legtöbbször egy szelekciós feltétellel kapcsoljuk össze, azaz azon rekordok kerülnek bele az eredményrelációba a Descartes szorzatból, melyek kielígítik a megadott feltételt. A mûvelet értelmezése:

r1 ´ expr r2 = { t | t Î r(R1+R2) Ù t(R1) Î r1 Ù t(R2) Î r2

Ù expr(t) = igaz }

ahol r1(R1) és r2(R2) teljesül a két alaprelációra. Az expr az összekapcsolt rekordokon értelmezett logikai értékû kifejezést takar.

 

Két reláció uniója a szokásos halmazalgebrai unió mûveletére épül, így szimbóluma is a szoksásos unió jel. A mûvelet értelmezése:

r1 È r2 = { t | t Î r1 Ú t Î r2}

ahol r1 és r2 a két alapreláció. Az unió végrehajthatóságához a két alaprelációnak ekvivalens domainekkel kell rendelkeznie.

 

Két reláció metszete is a hagyományos halmazmûveletre épül, értelmezése:

r1 Ç r2 = { t | t Î r1 Ù t Î r2}

ahol r1 és r2 a két alapreláció. A metszet végrehajthatóságához a két alaprelációnak ekvivalens domainekkel kell rendelkeznie.

 

Két reláció különbsége is ismert értelmezésen alapul:

r1 - r2 = { t | t Î r1 Ù t Ï r2}

ahol r1 és r2 a két alapreláció. A metszet végrehajthatóságához a két alaprelációnak ekvivalens domainekkel kell rendelkeznie.

 

Az osztás mûvelete viszont már csak egy bonyolultabb formában írható fel. Az osztás paramétereként két alaprelációt kell megadni, s eredménye az osztandó nem az osztóhoz tartozó attributumaira vett projekciójának azon legnagyobb részhalmaza lesz, melynek az osztóval vett összekapcsolása az osztandó egy részhalmaza lesz. A mûvelet formális felírása:

r1 / r2 = { t | t Î p A1(r1) Ù {t} ´ r2 Ì r1 }

ahol r1(A) és r2(A2) a két alapreláció úgy, hogy A = A1 + A2 is teljesül, azaz az r1 attributumai magukba foglalják r2 attributumait. Az A1 attributumcsoport tehát r1 azon attributumainak összességét jelenti, amelyek benne vannak r1-ben, de nincsennek benne r2-ben.

 

A kibõvítésnél egy újabb attributummal növeljük meg a reláció sémáját. Az attributumhoz tartozó mezõértéket a rekord meglévõ mezõinek értékébõl határozzuk meg. A bõvítésnél tehát az alapreláció mellett az új attributum azonosító nevét és a hozzá tartozó mezõérték kiszámítási függvényt kell megadni paraméterként. A mûvelet értelmezése:

ext(r, a, exp) = { t | t Î r'(A + a) Ù t(a) = exp(t(A)) Ù t(A) Î r }

ahol r(A) az alapreláció, A jelöli e reláció sémáját, az a szimbólum pedig az új attributum azonosító neve.

 

A csoportképzés esetén több elemi tevékenységet kell elvégeznie a rendszernek. Elõbb egy csoportképzési feltétel alapján diszjunkt csoportokba osztja a reláció rekordjait, majd minden csoportra kiszámol egy érték n-est, amely bekerül az eredményrelációba rekordként. A mûvelet értelmezése:

group(r, gexp, a1, exp1, a2, exp2, ...) =

{ t | t Î r'(a1,a2,...) Ù $ e : (e Î {gexp(t') | t' Î r} Ù " i: t(ai) =

expi({t" | t" Î r Ù gexp (t") = e})) }

ahol r az alaphalmaz, gexp a csoportosítási feltétel, ai az eredménytáblába kerülõ attributumok és expi az attributumok kiszámítására szolgáló kifejezések szimbóluma.

 

A bemutatott relációs algebrai kifejezések szemléltetésére vegyünk két alaptáblát, melyre sorra bemutatjuk az ismertetett mûveletek eredményét. Az alaptáblák egy borkereskedõ információs rendszerébõl származnak, s lesz egy BOROK és egy TERMELÕK reláció az ábrában megadott struktúrával és alapadatokkal:

 

 

A következõkben sorra vesszük a mûveleteket és a hozzájuk tartozó eredménytáblát.

 

- konstans szelekció: a 2-es fajtához tartozó borok adatai

s fajta=2(BOROK)

 

 

- attributum szelekció: a fajtakód megegyezik a termelõkóddal

s fajta=termelõ(BOROK)

 

 

- projekció: a termelõk nevei:

p név(TERMELOK)

 

 

- összekapcsolás: a borok és a termelõjük adatainak kiírása:

BOROK ´ termelõ = tid TERMELOK

 

 

- kibõvítés: a BOROK reláció kibõvítése egy kategóra mezõvel, amely a fajta mezõtõl függ:

ext(BOROK, kategória, fajta < 3 ? 'A':'B')

 

 

- csoportképzés: hány fajta bort szállítanak az egyes termelõk. Ehhez a borokat termelõ alapján csoportosítjuk, s minden csoportra kiszámítjuk a benne található rekordok darabszámát:

group(BOROK, termelõ, termelõ, termelõ, darab, count(*))

 

 

A többi mûvelet bemutatása elõtt vegyünk fel egy újabb táblát, amely szerkezetében a TERMELÕK táblához hasonlít. A reláció neve legyen ISMERÕSÖK. A tábla felépítése a következõ:

 

 

unió: az ismerõsõk és termelõk együttese

TERMELÕK È ISMERÕSÖK

 

 

- metszet: azon termelõk, akik ismerõsök is egyben

TERMELÕK Ç ISMERÕSÖK

 

 

- különbség: azon termelõk, akik nem ismerõsök

TERMELÕK - ISMERÕSÖK

 

 

- osztás: a mûvelet bemutatásához egy újabb relációt veszünk fel, amely az ismerõs városokat tartalmazza, s felépítése a következõ:

 

A lekérdezés azon nevekre irányul, amelyek minden ismerõs városban elõfordul az ismerõsök között.

p név, cím (ISMERÕSÖK) / VÁROSOK

 

 

A bemutatott mûveletek tetszõlegesen láncolhatók egymásba a relációs algebra zártáságának köszönhetõen. Néhány összetett példa bemutatására vegyünk fel két újabb relációt, a vevõk és rendelések relációit. A két tábla szerkezete és tartalma a következõ:

 

 

Az elsõ mintalekérdezés azon vevõk cégneveit adja vissza, akik rendeltek bikavért:

p cég(s bid = termék AND vevõ = vid AND megn = 'Bikavér'(BOROK

´ RENDELÉS ´ VEVÕK)

 

A kövekezõ lekérdezésnél a vevõk cégneveit és a rendelt mennyiség összértékét iratjuk ki:

group (s vevõ = vid (VEVÕK ´ RENDELÉS), cég, 'cég', cég, 'osszrendelés', sum(menny))

 

A legnagyobb rendelési összérték meghatározása:

group (group (s vevõ = vid (VEVÕK ´ RENDELÉS), cég, 'cég', cég, 'osszrendelés', sum(menny)), , 'max', max(osszrendelés))

 

Mivel a külsõ csoportképzésben nem szerepel csoportképzési feltétel, így az alaptábla minden rekordja egyetlen egy csoportba kerül

 

Az utólsó példában még további mûveleteket adunk az elõzõ kifejezés köré. A végrehajtandó feladat most azon vevõ cégek nevének megadása, akik osszrendelése a maximális összrendeléssel egyezik meg:

p cég(s osszrendelés = p max(group (group (s vevõ = vid (VEVÕK ´ RENDELÉS), cég, 'cég', cég, 'osszrendelés', sum(menny)), , 'max', max(osszrendelés)))(group (s vevõ = vid (VEVÕK ´ RENDELÉS), cég, 'cég', cég, 'osszrendelés', sum(menny))))

 

Igen, ez a kifejzés már elsõ pillantásra is elrettentõnek tûnik. Valóban áttekinthetetlen ez a mûvelet. Szerencsére a gyakorlatban nézeti táblák, a view-k segítségével sokkal áttekinthetõbb alakra lehet majd hozni a fenti kifejezést. A mintapéldát ugyanis az tette kuszává, hogy nem léteznek olyan alaptáblák, amelyekbõl közvetlenül, egyszerûbb módon származtathatók lennének a kívánt mennyiségek. Ha beveztünk egy új szimbólumot a vevõk összrendeléseit tartalmazó táblára, akkor máris sokkal áttekinthetõbb lesz a mûvelet felírása is.

 

X = group (s vevõ = vid (VEVÕK ´ RENDELÉS), cég, 'cég', cég, 'osszrendelés', sum(menny))

 

p cég(s osszrendelés = p max(group (X, , 'max', max(osszrendelés))) (X))

 

A relációs algebrai kifejezéseink azt írták le, hogy milyen lépéseken, mûveleteken keresztül állíthatjuk elô a kívánt eredményt a megadott alaphalmazokból. A kifejezéseink felírásakor tehát tudnunk kellett, hogy mely relációs algebrai mûveletek együttese szolgáltatja a kívánt eredményt a lekérdezésnél. Ezért a relációs algebrát egy elôíró, utasító (prescriptiv) nyelvnek tekinthetjük, hiszen elôírjuk, hogy hogyan jutunk el az eredményhez. Ha például meg szeretnénk tudni azon dolgozók neveit, akik többet keresnek mint egy X összeg, akkor a lekérdezés leírása a következôkkel adható meg:

 

- szelektáljuk a dolgozók relációt azon rekordokra, ahol a fizetés nagyobb mint X

- végezzünk projekciót a részeredményrelációban a név mezôre

 

A megadott mûveleteket elvégezve, megkapjuk az eredményt, tehát a relációs

algebra egyben le is írja a megoldás lépéseit.

 

 

A relációs kalkulkulus

 

A relációs algebra azonban nem az egyedüli megadási formalizmusa a relációs lekérdezési mûveleteknek. Létezik olyan megközelítése is a relációs mûveleteknek, mely nem részletezi a megoldás lépéseit, csak a kívánt eredményt fogalmazza meg. Ezen leírási módot nevezik relációs kalkulusnak.

 

A relációs kalkulus a logikai kalkulushoz hasonló formalizmus, amely egy formulával jellemzi a kívánt végeredményt. Ebben a megközelítésben azon rekordok lesznek a lekérdezés eredményei, melyek kielégítik a formulát, vagyis a formulára igaz helyettesítési értéket adnak vissza. A relációs kalkulusnál a felhasználónak csak az eredményt jellemzõ formulát, kifejezést kell megadnia, s nem kell törõdnie a formulát kielégítõ rekordok meghatározásának módjával. Ebbõl a megközelítésbõl nézve a relációs kalkulus könnyebben használahtónak tûnik, mint a relációs algebra. A legutólsó minta a relációs kalkulusban a következõ alakot ölti:

 

- kérem azon név értékeket a dolgozók táblában, ahol fizetés nagyobb mint X

 

Látható, hogy ez a leírás nem mond semmit arról, hogy hogyan tudom elôállítani az eredményrelációt. Ezért a relációs kalkulust descriptív, leíró nyelvnek nevezik, hiszen itt csak leírom, hogy mire van szükségem, de nem adom meg a megoldást. A relációs algebra ezzel szemben elôírta a szükséges lépéseket is.

 

A relációs kalkulus alapja a matematikai logikában megsimert prédikátum kalkulusok elmélete, a relációs kalkulus a prédikátum kalkulusok területének egy részhalmazát foglalja magába. Ennek megfelelõen a relációs kalkulus a predikátum kalkulosoknál megismert jelölésrendszert alkalmazza a kifejezések megadásánál. A következõkben áttekintjük e terület legfontosabb alapfogalmait és alkalmazását.

 

A relációs kalkulusban a felhasználó egy megfelelõ struktúrájú kifejezéssel adja meg az eredményrekordokat jellemzõ tulajdonságot. A rendszer e kifejezést kielégítõ rekordokat vesz be az eredményrelációba. A kifejezés nem lehet tetszõleges formátumú, bizonyos struktúrális megkötöttségeket kell teljesíteni, hogy értelmezhetõ legyen. A formális feltételeket teljesítõ kifejezéseket well formed formulas (wff) -nek nevezik.

 

A wff-ek a következõ nyelvtani elemeket tartalmazhatják:

- csoportosító zárójelek

- változó szimbólumok (pl. x, y, z,..)

- konstans szimbólumok (pl. 24, 12, 'Peter')

- predikátum szimbólumok (pl. Szeret, Rendel)

- logikai operátorok (Ù , Ú , Ø )

- logikai kvantorok (" , $ )

- reláció operátorok (=,>,<,£ , ³ , ¹ ,...)

 

A kifejezéseknek tehát a fenti elemekbõl kell felépülnie, hogy szintaktikailag helyesek legyenek. Az épíkezés módjára, vagyis arra nézve, hogy hogyan lehet e elemekbõl megfelelõ kifejezéseket formálni, a következõ szabályok adnak utmutatást. A wff kifejezések lehetnek elemiek és összetettek.

 

Az elemi kifejezésekmek az alábbi alakú kifejezéseket tekintjük:

- P(t1,...,tn), ahol P egy n paraméterû predikátum szimbólum, ti pedig lehet változó vagy konstans szimbólum

- t1 Q t2, ahol Q egy reláció operátort jelöl, ti pedig lehet változó vagy konstans szimbólum

 

Az elemi kifejezésekbõl az alábbi szabályok alapján képezhetünk összetett kifejezéseket:

- Ha F1 és F2 helyes kifejezések, akkor

F1 Ú F2

F1 Ù F2

Ø F1

(F1)

is helyes kifejezések.

- Ha F egy helyes kifejezés, melyben elõfordul az x változó szimbólum, akkor a

$ x (F)

" x (F)

is helyes kifejezések.

A helyes formulák csak a fenti lépések sorozatával képezhetõ, más módon nem állítható elõ helyes formula.

 

Azon változókat, amelyekhez nem kapcsolódik kvantor, szabad változóknak nevezzük. A kvantorhoz kötõdõ változók alkotják a kötött változókat. Az

" x (Ø P(x,y)) Ú (Q(y) Ù R(x,y))

kifejezésben egyetlen kötött változó van, mégpedig az x változó az " x (Ø P(x,y)) tagban. Az y változó viszont szabad az " x (Ø P(x,y)) tagban, ugyanúgy mint az ugyancsak x és y szimbólummal jelölt változók az Q(y) és R(x,y) tagokban.

 

A logikában minden kifejezéshez logikai igaz vagy hamis igazságértéket lehet rendelni. A logikai érték meghatározása az formulában lévõ elemi kifejezések logikai értékétõl függ. Az elemei kifejezések miníg rendelkeznek logikai értékkel. A predikátum ugyanis egy logikai állítást jelent, s a relációs operátorok is logikai értéket határoznak meg. Ha ismerjük tehát az elemi kifejezések logikai értékét, akkor az összetett formulák logikai értéke az alábbi szabályok révén határozható meg:

- W(F1 Ú F2) = W(F1) Ú W(F2)

- W(F1 Ù F2) = W(F1) Ù W(F2)

- W(Ø F) = Ø W(F)

- W($ x(F)) = W(F|x=c1) Ú ... Ú W(F|x=cn)

- W(" x(F)) = W(F|x=c1) Ù ... Ù W(F|x=cn)

ahol az utólsó két kifejezésben a helyettesítés végigfut a változószibólum összes lehetséges helyettesítési értékén.

 

A relációs algebra esetén a predikátumok az egyes relációknak feleltethetõk meg. Vagyis minden reláció egy predikátumot reprezentál. A reláció ettributumai jelentik a predikátum paramétereit. Egy predikátum tehát annyi paraméterrel rendelkezik, ahány attributuma van a mögötte lévõ relációnak. A reláció megvalósulása, a tábla az igaz értékû állításokat fogja össze.

 

Vegyük példaként az alábbi reláiót:

 

A reláció szemantikailag az ismerõsõket tartalmazza. A fenti tábla alapján igaznak tekinthetõ az az állítás, hogy

Péter az egyik ismerõsõm neve, aki Eger-ben lakik.

Hasonlóan igaz, az is, hogy

Lajos az egyik ismerõsõm neve, aki Dorog-on lakik.

A fenti állítást tehát a reláció minden rekordjában szereplõ adatokra megismételhetnénk. Így a fenti reláció tulajdonképpen azon konstans változókat fogja össze, amelyekre a

x az egyik ismerõsöm neve, aki y-ban lakik

ahol x és y két változó szimbólum volt. Az x szimbólum a név domainhez, míg az y szimbólum a cím domainhez kapcsolódik. Így az ISM reláció mögött egy

x az egyik ismerõsöm neve, aki y-ban lakik

predikátum kapcsolható, s maga a tábla pedig azon helyettesítéseket foglalja magába, amelyekre a predikátum igaz értéket ad.

 

Gyakorlásképpen nézzünk néhány formula logikai értékének kiszámítását. A példák továbbra is az ISM relációra vonatkoznak. A kifejezésekben a változó szimbólumok neve megegyezik a mögöttük álló attributum nevével, s a predikátumok neve is azonos a hozzá tartozó reláció nevével.

 

Az alábbi példa a 'Létezik olyan nevû ismerõs, akiknek a lakhelye Dorog' állítást fogalmazza meg:

W ($ név (ISM(név,'Dorog'))) = T (igaz)

Mivel találhatunk olyan behelyettesítést (Lajos), ahol az ISM predikátum igaz értéket ad, így a kifejezés értéke is igaz.

 

A következõ formula által megfogalmazott állítás: Minden városra igaz, hogy nem lakik ott Zoltán nevû ismerõs és lakik ott Tibor nevû ismerõs.

W(" város (Ø ISM ('Zoltán',város) Ù ISM('Tibor', város)) = F (hamis)

A kiértékelésnél, minden lehetséges városnevet be kell helyettesíteni a domain-bõl (ami nagyobb halmaz lehet, mint a táblában szereplõ mezõ értékek köre). A kifejezés értéke hamis, hiszen pl. az Eger érték behelyettesítése is hamis értéket ad.

 

A formulákat azonbannemcsak egy állítás igaz értékének eldöntésére lehet alkalamzni, hanem lekérdezések megfogalmazásra is. A lekérdezéshez szabad változókat használunk fel, s a lekérdezés eredménye a szabad változók azon összetartozó helyettesítési értékei, mely mellett a megadott formulák igaz értéket adnak.

 

Egy lekérdezés tehát

x1,...,xn F(x1,...,xn)

alakú kifejezés, melyet

{x1,...,xn | F(x1,...,xn)}

alakban is szokás jelölni. A lekérdezés eredménye azon

{e1,...,en}

helyettesítési értékek n-esek, melyeket rendre behelyettesítve az x1,...,xn változókba, W (F(x1,...,xn)) igaz értéket szolgáltat.

 

Az elõzõ példánál maradva a

{ név | $ város (ISM (név, város)) }

lekárdezés azon neveket adja vissza, melyekhez létezik városnév az ISM relációban. Az eredmény reláció a következõ lesz:

 

 

A lekérdezés természtesen lehet összetettebb is, s vonatkozhat több relációra is. Térjünk vissza egy korábbi példához, melyben VEVÕK és RENDELÉS relációk szerepeltek. A feladat az egyes rendelések darabszámát és a kapcsolódó vevõ cégnevét kiiratni. A lekérdezés formátuma:

{ menny, cég | $ vid,cím, vevõ,termék, dátum (VEVÕK(vid,cég,cím) Ù RENDELÉS(vevõ, termék, menny, dátum) Ù vevõ = vid) }

Az eredményreláció:

 

 

Ez utóbbi lekérdezésnél kicsit zavaróan hatott, hogy milyen bõbeszésúen kellett fogalmazni, hiszen meg kellett adni pontosan mindkét reláció szerkezetét, azaz szerepeltetni kellett a relációkban szereplõ öszzes attributumot. Sokkal egyszerûbb lenne a kifejezés, ha elegendõ lenne a relációkra hivatkozni. A relációs kalkulusnak vanis változata.

 

A relációs kalkulus eddig ismertetett formátumát domain kalkulusnak nevezik. Az elnevezés azon alapul, hogy a kifejezésekben szereplõ változók attributumokat helyettesítettek, így azok helyettesítési értékei egy domainhez kapcsolódtak. Ebben az esetben a lekérdezések az attributumok szintjén kellett megfogalmazni. A relációs kalkulus másik változata a tuple kalkulus, amelyben a kifejezés változói teljes rekordokat reprezentálnak. Így helyettesítési értékeik rekordok lesznek. Mivel a feltétel megfogalamzásában továbbra is szükség van az attribitumokra vonatkozó megkötésekre, ezért a tuple kalkulus változóit rekordváltozóknak tekintik, amelyeknek lehetnek attributumai. Egy t tuple változónak pontosan megegyezik a szerkezete az általa reprzentált reláció szerkezetével.

 

A tuple kalkulus használata esetén egyszerûsíthetõk a kifejezések, hiszen csak az explicite hivatkozott attributumokat szükséges szerepeltetni a kifejezésben. A tuple kalkulus használatának szemléltetetésére vegyük a legutólsó lekérdezés tuple kalkulusbeli alakját:

x IN RENDELÉS, y IN VEVÕK

{x.menny, y.cég | x.vevõ = y.vid }

Ebben a formalizmusban viszont meg kell még azt is adni, hogy a változók mely relációhoz kapcsolódnak. A tuple kalkulus összetett formula képzési szabályai megegyeznek a domain kalkulusnál ismeretett szabályokkal, így azok részletesésére most nem térünk ki.

 

 

Adatkezelõ mûveletek

 

A relációk elõfordulásai az adatbázis élete során folytonosan változhatnak, azaz új rekordok kerülhetnek be a relációba, létezõ rekordok kerülhetnek ki a relációból. Emiatt a kezelõ nyelvnek a rekordok beszúrásáról, kitörlésérõl illetve módosításáról is gondoskodnia kell.

 

A módosítás során a relációban tárolt adatértékek módosulnak, azaz egy új reláció-elôfordulás fog szerepelni az adatbázisban a régi reláció-elôfordulás helyett. A módosításnál meg kell adni paraméterként, hogy mely relációban, mely rekordokat, milyen értékre kell módosítani. A módosításnál nem szabda tehát elfelejteni, hogy egy relációra vonatkozik, de ott egyszerre több rekordot is érinthet. A módosítás jele:

update (r, felt, a1=kif1, ..., an=kifn)

ahol r a reláció azonosítója, felt egy feltétel, mely kijelöli a módosítandó rekordokat, ai a módosítandó attributumok értékei, s kifi az új attributum értékeket adják meg.

Példaként az ISM táblában változtassuk meg a nevet Lali-ra ott ahol korábban Lajos volt. Az utasítás formátuma:

update(ISM; név = 'Lajos', név = 'Lali')

Az eredmény reláció:

Mint látható, mindkét Lajos érték átíródott a táblában.

 

A törlés során a relációból kikerül egy rekordelôfordulás, azaz egy új reláció-elôfordulás fog szerepelni az adatbázisban a régi reláció-elôfordulás helyett. A törléshez meg kell adni a reláció azonosítóját, s egy kitörlési feltételt. A reláció minden olyan rekordja kikerül a táblából, amelyek teljesítik a megadott feltételt. A törlés jele:

delete (r, felt)

ahol r a reláció azonosítója, felt egy feltétel, mely kijelöli a törlendõ rekordokat.

Példaként az ISM táblában töröljük ki a Lajos nevet tartalmazó rekordokat. Az utasítás formátuma:

delete (ISM; név = 'Lajos')

Az eredmény reláció:

 

A beszúrás során a reláció bôvül egy rekordelôfordulással, azaz egy új reláció-elôfordulás fog szerepelni a táblában. A beszúrás során meg kell adni a reláció azonosító nevét, s az új rekord adatait. A beszúrás egy relációba tesz be egy új rekordot. A beszúrás szimbóluma:

insert (r, a1=kif1, ..., an=kifn)

ahol r a reláció azonosítója, ai az új rekord attributumok értékei, s kifi az egyes attributum értékeket jelölik.

Példaként az ISM táblába vegyünk fel egy új rekordot, amelyben a név Béla, s a város Gyula. Az utasítás formátuma:

insert (ISM; név = 'Béla', cím = 'Gyula')

Az eredmény reláció:

 

Az elõzõekben bemutatott mûveleti résszel lezártuk a relációs adatmodell alapjainak az ismertetését. A relációs modell, mint a legelterjedtebb adatmodell megvalósulásai, az egyes RDBMS rendszerek ismertetése és kezelésének bemutatása elõtt, még egy elméleti problémára térnénk ki. Ez a probléma a relációs adatbázisok tervezésének a kérdését érinti.

 

 

A relációs adatstruktúra helyességének vizsgálata

 

A relációs adatmodell eddigi ismertetésében a modell formai követelményeit, a modell felípítését adtuk meg. A megadott struktúra elemekkel, mint láttuk, egyazon problémakörre, számos egymástól lényegesen vagy árnyalatokban különbözõ modell készíthetõ. Ezek a modellek nem lesznek egyformán hatékonya, egyes elkészült modellek tartalmazhatnak bizonyos szépséghibákat,

amelyek a mûködés hatékonyságát csökkenthetik.

 

Mint már említettük, a relációs modell megalkotásánál már a fizikai megvalósítás hatékonyságára illetve a kezelés hatékonyságára is gondolni kell. Most elsôsorban a kezelés hatékonyságára koncentrálunk, s ebbôl a szempontból vizsgáljuk meg az elkészült modelleket.

Vegyük példaként az alábbi relációs modellt, amely egy vállalat struktáráját tárolja, megadva, hogy kik és és milyen beosztásban és mely projekten dolgoznak. A tábla az osztályok fontosabb adatait is magába foglalja:

 

 

Mint látható, az alkalmazott reláció tartalmazza azon osztály nevét, címét és osztályvezetô nevét, ahol most dolgozik. Ez a megvalósítás viszont azt is jelenti, hogy annyiszor kell letárolni az osztály nevét, ahány dolgozója van az osztálynak. Mindez a felesleges adatletárolást jelent, hiszen ugyanaz az információ sokszorozva foglal helyet. A rossz adatmodell tehát redundanciához vezethet.

A redundancia mellett számos egyéb mûveleti nehézséget is okozhatnak a modell hiányosságai. A nem megfelelô relációs modellbôl eredô problémákat szokás anomáliáknak is nevezni. Az alábbi anomáliákat szokták kiemelni:

 

- beszúrási anomália: amikor egy rekord felvitelekor, felesleges, már letárolt információkat is újra fel kell vinni. Pl. minden új dolgozó felvitelénél újra fel kell vinni az osztály adatait is.

 

- módosítási anomália: amikor egy információegység módosításához több helyen is módosítani kell az adatbázisban. Ha például megváltozik az osztály címe, akkor mindenegyes dolgozó rekordban el kell végezni a módosítást is. Ez nem csak többletmunkát jelent, de megnöveli az inkonzisztens állapot valószínûségét is, ha valahol elmaradna a módosítás.

 

- törlési anomália: a törlési anomália azt jelenti, hogy egy információelem megszûnésekor más, hozzá nem tartozó információk is elvesznek. Ha pl. máshol nem lenne letárolva az osztály címe, akkor a dolgozók kitörlésével az osztályra vonatkozó adatok is törlôdnek.

 

A felsorolt anomáliák láthatóan mindabból származtak, hogy nem az igazán összetartozó adatokat vettük be egy relációba. Hogy mely mezôk tartoznak igazán egy relációba, az a mezôk közötti összetartozási viszony, a mezôk közötti függôségek határozzák meg. A legfontosabb függôségi típus a funkcionális függôség, mely megközelítôleg megfogalmazva azt jelenti, hogy az egyik mezô minden értékéhez a másik mezô egy értéke kapcsolható.

Pl. az ember egyednél minden személyi szám értékhez egyetlen egy név rendelhetô. Ilyenkor azt mondjuk, hogy a név mezô funkcionálisan függ a személyi szám mezôtôl. Két adatelem között a funkcionális függõséget egy nyílla jelöljük. A név és személyi szám között fenálló funkcionális függõség jelölése:

 

 

A

 

függõségi viszony ezzel szemben nem teljesül, hiszen egy név értékhez több különbözõ személy és személyi szám is rendelhetõ.

 

A dolgozó egyednél több ilyen függôsséget is felfedezhetünk. Pl. az osztály neve és címe is funkcionálisan függ az osztály kódjától, az osztály kódja pedig funkcionálisan függ a dolgozó kódjától. A reláció attributumait számba véve felrajzolható az attributumok közötti funkcionális függõségi viszony. Az ábrában minden attributum és minden közöttük fenálló függõségi viszony szerepel.

 

 

A modellben sok kis független adatelem látható. Tehát nincs olyan adatelem, amely egyértelmûen meghatározná a többit. Ez a séma tehát már az egyed integritási feltételnek sem tesz eleget, s emelett több más probléma is van bele. A funkcionális függõségek felderítése, mint látható, nagy segítséget nyujt tehát a helyes séma kialakításában. Mik is tehát a helyes séma kialakításának irányelvei az adatbázis tervezése során.

 

A helyes modell megtervezésére irányuló irányelvek, s módszertan az irodalomban normalizálás néven vált közismerté. A normalizálás tehát egy tervezési metódika, amely segítséget nyújt a helyes, anomália mentes relációs sémák és adatbázis sémák kialakításában. A normalizálás néhány rögzített irányelven alapszik, amelyek iránymutatást adnak a tervezéshez, helyes mederbe terelve a modellezés irányát.

 

A felállított tervezési irányelveket követelmények formájában adják meg, méghozzá több, egymásra épülô követelmény alakjában. A egyes követelményeket szokás normálformáknak is nevezni. A normalizálás errõl az oldalról nézve nem más, mint a megadott normálformák teljesülésének ellenõrzése, illetve az adatsémák átalakítása olyan alakra, hogy azok már kielígítség a megadott normálformákat.

 

A normalizálás a sémák helyességét az adatmodellben fennálló függôségeken keresztül méri, ellenõrzi. A normalizáció elengedhetetlen elõfeltétele tehát, hogy pontosan ismerjük a séma elemei között fennálló funkcionális függõségi viszonyokat. Az egyes normalizációs lépések célja a függõségi viszonyok különbözõ szempontok szerinti ellenõrzése, vizsgálata.

Az egyes normálformáknak megfelelõ ellenõrzéseket, vizsgálatokat és módosítási lépéseket normalizációs lépéseknek nevezzük. Minden normálforma egy követelményrendszer alakjában jelenik meg. E normálformák egymásra épülése azt jelenti, hogy egyes normálformák megkövetelik más normálformák teljesülését. A normálformák egy egyre szigorodó követelményrendszert reprezentálnak. Az egyes normálformák egy egyre szigorodó feltételrendszert jelentenek. A feltételek egymásra épülésé alapján az egyes normálformákat rangsorba lehet helyezni.

A rangsor alján elhelyezkedõ, leglazább feltételt nevezzük elsõ normálformának. Az õt követõ feltételt, amely csak az elsõ normálforma teljesülését követeli meg, második normálformának nevezik. Ezt további, egyre növekvõ sorszámú normálformák követhetik.

Szerencsére azért nem annyira terebélyes ez a rendszer, az irodalomban öt-hat szintet szoktak megemlíteni, a gyakorlat szempontjából azonban még ettõl is kevesebb, csak az elsõ három normálformának van jelentõsége. Mi most, csak e három normálformát fogjuk bemutatni.

 

Az egyes normálformák a következõ alakban fogalmazhatók meg:

 

- Elsõ normálformában van a relációs séme, ha minden mezõje funkcionálisan függ a kulcsmezõcsoporttól. E szerint a függõségi rendszerben léteznie kell egy kulcsnak, s minden más mezõnek ettõl fühggenie kell. Ez a megkötés láthatóan több feltételt is magába foglal. Egyrészt megkívánja az egyed integritási feltétel teljesülését, azaz, hogy legyen kulcsa relációnak. Másrészt megköveteli, hogy minden mezôje atomi értéket hordozzon. Ez a megkötés egyben a relációs modellünk egyik alappillére is volt. Az indulásként felvett séma nem teljesíti ezt a feltételt. A feltétel teljesüléséhez két módosítást is el kell végezni: egyrészt be kell hozni egy kulcsmezõt, ami minden dolgozót egyértelmûen azonosít, másrészt a többértékû beosztott attributumot ki kell elemni a relációsémából. Az elsõ módosítás utáni függõségi viszonyokat mutatja az alábbi ábra:

 

 

A második módosítánál a beosztott mezõt kiemeljük egy új relációba, ahol már nem mint nem-kulcs mezõ szerepel:

 

 

Ha a (név, osztály) páros egyedisége is teljesül, akkor nem szükséges új mezõt behozni, helyette e mezõpárost választhatjuk kulcsnak. Ekkor a fügõségi viszony az alábbi szerkezetû lesz a módosítás után:

 

 

Ekkor is két relációba kellett szétbontani az adatokat a többértékû mezõ miatt.

 

- Második normálformában van a reláció, ha elsõ normálformát teljesíti és ezen felül minden nem kulcs mezô a teljes kulcstól függ, de nem függ a kulcs bármely valódi részhalmazától. Ezzel azt fejezzük ki, hogy a kulcs központi szerepet játszik a relációban, minden mezônek a teljes kulcstól, s nem annak egy részétõl kell függnie. Ha rátekintünk az elõzõ ábrára, látható, hogy a felvázolt séma megsérti a második normálformát, mivel az osztvez és cím egyrészkulcstól, az osztály mezõtõl függ.

A második normálformát ekkor a reláció feldarabolásával lehet elérni. A példában célszerû egy osztály relációt létrehozni, s ebbe letárolni a csak az osztálytól függõ adatokat. Az eredményül kapott függõségi viszonyokat mutatja be az alábbi ábra:

 

 

Az ábra három relációt mutat, mindegyiknl teljesül a második normálforma. Ha nem végezzük el ezt a felbontást, akkor újra szembe találjuk magunkat a módosítási, beszúrási anomáliákkal. A mesterséges did mezõt bevezetõ megoldásnál nincs összetett kulcs, így az automatikusan teljesíti a második normálformát.

 

- Harmadik normálformában van a reláció, ha teljesíti a második normálformát és ezenkívül igaz, hogy nem áll fenn tranzitív függôség, azaz nem áll fenn az egyik nem kulcs mezôbôl egy másik nemkulcs mezôbe irányuló függôség. Ekkor ugyanis a kulcs a köztes mezôn keresztül, tranzitíven határozza meg a másik mezô értékét. Ezért a köztes mezõ egyfajta kulcs szerepet játszik a másik mezõnél. Erre látunk példát a mesterséges did mezõt bevezetõ megoldásnál. Itt az osztály mezõ játsza a közvetítõ szerepet.

A tranzitív függõség feloldása szintén a reláció feldarabolásával történik. Ehhez kiemeljük a tranzitív függést egy külön relációba. Példánkban az osztály mezõt kell kiemelni a hozzá tartozó adatokkal együtt. Az eredeti táblában csak akpcsolatot biztosító osztály mezõ marad meg. Az eredményül kapott három relációhoz tartozó függõségi viszony látható az alábbi ábrán:

 

 

Látható, hogy itt a másik variánshoz hasonló megoldást kaptunk.

 

A normalizálás eredményeképpen tehát olyan függõségi rendszert kaptunk, amely tiszta és egyértelmû. Minden táblánál kell létenie egy függõségi centrumnak, a kulcsnak, s minden más mezõhöz léteznie kell függõségi kapcsolatnak a kulcsból. Ezen függõségeken kívül a relációséma nem tartalmazhat más függõségeket.

 

Az elkészült, úgymond normalizált modell már mentes azon alapvetô tervezési hibáktól, melyek az anomáliákat okozzák. Ezzel sikerülhet egy a szemantikai tartalmat is a lehetôségek szerint megôrzô és a hatékonysági szempontokat is figyelembe vevô relációs adatmodellt alkotni, melyet felhasználhatunk az adatbázis megvalósításához. A teljesség kedvéért megemlíhetõ, hogy bizonyos mûveletek hatékonyabb végrehajtása érdekében egyes esetekben a tervezõk inkább lemondanak a tisztaságrõl, áttekinthetõségrõl, s összevonnak egy relációba olyan adatokat is, amelyek a normalizálás elmélete szerint külön relációüókban kellene helyet foglalniuk.