Professional Documents
Culture Documents
Adat
Adat
Metaadatok
Az adatbázis fogalmi vázának (séma/struktúra) megteremtésére vonatkozó adatok a technikai
metaadatok, melyek egy különösen védett helyen kerülnek tárolásra, hiszen ezek
elvesztése/sérülése az adatbázis hozzá-férhetetlenségét is eredményezhetik.
Strukturált adatok
Olyan adatok, ahol az adatok ábrázolása (szintaxisa) megfelel az adatok alkalmazása során
felhasznált je-lentésüknek (szemantika). Mivel a szemantikát a feldolgozás előtt ismernünk kell,
lehetőség van stabil, az adatszerkezetet jól tükröző sémák előzetes definíciójára. Ez az összes
rendelkezésre álló, jövőben megjelenő adat szintaktikáját leírja. Hatékonyan jellemezhetők a
relációs és objektumorientált adatmodelleken.
Szemistrukturált adatok
Olyan adatok, amelyek az aktuális alkalmazás szempontjából hordoznak értékes szemantikus
információkat, de reprezentációjuk eltér a hasznos szemantikus jelentés által meghatározottól.
Példa a szemistrukturált tulajdonságokra:
Szabálytalan struktúra
Implicit struktúra (az adatstruktúra nem vagy nem teljesen található meg az adatforrásban.)
A struktúra nem azonos a hagyományos (relációs/objektumorientált) adatbáziskezelő
rendszerekben használt sémával.
Gyakori, hogy csak böngészni szeretnék az adatokat.
Szemistrukturált adatokra példa: XML, RDF (forrásleíró rendszer, feladata, hogy bármilyen
forrásból, tehát azonosítóval rendelkező dolgokról egyszerű állításokat tesz.)
Adatbázis-kezelő fogalma
A mai adatbázis-kezelő rendszerek bonyolult hardver-szoftver rendszerek, melyek
bonyolultsága/ komplexitása az operációs rendszerekkel mérhetőek össze, gyakran nagyobbak is
annál. A megtervezése/implementálása bonyolult feladat, amelyre kifinomult rendszerek
léteznek.
Az adatbázis-kezelő felépítése
A felépítéskor eredményesnek bizonyult a rétegzési koncepció, vagyis a rétegmodell. Ennek
alapgondolata, hogy az eredeti problémát több részre kell szedni úgy, hogy ezek egymásra
épüljenek, de minél kisebb felületen érintkezzenek.
3 rétegű modell:
Legalsó réteg:
fizikai adatbázis (adatok fizikai tárolón való
elhelyezkedése)
Középső réget:
Fogalmi adatbázis (A való világ egy
darabjának leképzelése, sajátos modell a valóság tükrözésére)
Felső réteg:
Nézetek (amit és ahogy a felhasználó lát az adatbázisból)
Megjegyzés: a nézetekhez tartozó sémákat gyakran külső sémának is nevezik.
i. Lekérdezés feldolgozó: alkalmazástól, felhasználótól kapott kéréseket fordítja az
adatbázis-menedzser által értelmezhető nyelvre + optimalizálás.
ii. Sémafeldolgozó: az adatbázis logikai leírását értelmezi és fordítja le, a sémának
mindig rendelkezésre kell állnia.
iii. Adatbázis-menedzser: kezeli a felhasználó lekérdezéseit és emellett járulékos
feladatokat lát el.
1. Járulékos feladatok:
a. Adatvédelem
b. Adatbiztonság
c. Integritás
i. Formális: adott mező értékkészlete.
ii. Referenciális: egy adat több helyen van, meg kell egyeznie.
iii. Strukturális: sémákra való előzetes feltételek ellenőrzése.
d. Szinkronitás: bővebben tranzakciókezelés.
iv. Állománykezelő: biztosítja a hozzáférést az adatbázishoz. (Adatbázis alatt
általában csak fizikai adatbázist értünk.)
Tevékenységi szintek: Képzetlen felhasználó, Alkalmazás programozó, Adatbázis
adminisztrátor, DBMS tervező.
Adatfüggetlenségek
Kétféle adatfüggetlenségről beszélhetünk:
Fizikai: a fizikai működés sémáiban véghezvitt változások nem érintik a fogalmi adatbázist.
Ha teljesül, a fizikai adathordozó egy teljesen eltérő paraméterekkel rendelekező
adathordozóra is kicserélhető.
Logikai: akkor beszélünk, ha a logikai adatbázis megváltozása nem jár az egyes
felhasználásokhoz-felhasználókhoz tartozó nézetek megváltozásával.
(Ez az elvárás nem teljesül minden esetben.)
3. Heap szervezés
Alapötlet
Itt a legegyszerűbb a megoldás ötlete: Az adatokat legalább annyi blokkban tároljuk, amennyit a
rekordok száma megkövetel, de nem rendelünk hozzá kiegészítő struktúrát.
Keresés
Ha egyetlen rekordot kell azonosítani, akkor a háttértárról betöltjük a memóriába az
adatállomány blokkjait, majd végigolvassuk, míg meg nem találjuk az keresett rekordot (lineáris
keresés). Szerencsés esetben ez az első, szerencsétlen esetben az utolsó.
Átlagos keresési idő:
Törlés
A törlendő rekordot megkeressük (ismert időigény), majd a rekord fejlécében jelezzük, hogy
felszabadult, vagyis felülírható a terület. Ezt követően a megváltozott blokkot még vissza kell
írni.
Beszúrás
Ügyelni kell arra, hogy a rekordok egyediséget biztosító mezőinek értéke egyedi maradjon a
beszúrás után.
Először a törlés által felszabadított területeken próbálkozunk, ha ott nincs hely, akkor az
állomány végén. Ha itt sincs elég hely, akkor tárhelybővítést kell kérni.
Módosítás
Egyszerű, ha az egyediséget biztosító mezők értéke nem változik. Ekkor meg kell keresni a
rekordot, felülírni, majd visszaírni a háttértárra. Egyéb esetekben gondoskodni kell az
egyediségről.
4. Hash-állományok
Alapötlet
A legegyszerűbb változatában minden rekordhoz
egy értéket rendelünk egy optimálisan megválasztott
hash függvénnyel. Ezt egyértelműen képezi le.
Keresés
1. Meghatározzuk a rekord kulcsát,
2. Kiszámoljuk a h(K)-t,
3. Kiolvassuk a vödör katalógus h(K)-adik bejegyzését, majd a blokkokban keressük a rekordot.
Vödrön belül lineáris keresést végzünk. Ha nem találjuk a kiolvasott vödörben, a keresett elem
nem található az adatbázisban. Ha van találat, elég az állomány részét kiolvasni.
Törlés
Hash tárolás esetében kikeressük a kívánt elemet, onnantól hasonló a heap-hez.
Beszúrás
Itt is ügyelni kell az egyediségre. Kiszámítjuk a h(K) függvény értékét, és kiolvassuk a megfelelő
bejegyzést. Végigolvassuk a vödör tartalmát, ha nem lenne egyedi, hibajelzést küldünk. Egyéb
esetben szabad vagy törölt helyre beírjuk az adatot. Ha minden hely foglalt, akkor új rekordot
kell elhelyezni.
Módosítás
Ha nem érint kulcsmezőt, akkor kikeressük, és módosítjuk. Ha kulcsmezőt érint, akkor egy törlés
és egy beszúrás egymás utáni végrehajtása kell, hiszen a módosított rekord feltehetően egy másik
vödörbe fog kerülni.
Megjegyzések
1. Törekedni kell a keresés gyorsítására, mert a diszkterület könnyen bővíthető erőforrás
2. Nem támogatja az intervallumkeresést
5. Indexelt állományok
Ritka index
Ritka indexek esetén az indexrekordok azt határozzák meg, hogy az adatállomány rekordjai mely
blokkban találhatóak. Ennek következtében a egy blokkon bleül az adatrekordok szabad
rekordoknak tekinthetők. Ritka index esetén az adatállomány is rendezetten kell tárolni olyan
értelemben, hogy a blokkokban egy megadott intervallumba eső adatok legyenek
Keresés
T.f.h. a k1 kulcsú rekordra van szükségünk. Az indexállományban megkeressük azt a rekordot,
amelynek k2 kulcsa nagyobb azok közül, amelyek még kisebbek k1-nél (vagy egyenlőek).
A keresés lehet bináris, hiszen az indexállomány kulcs szerint rendezett. A k2 kulcsú indexrekord
mutatója megcímzi a blokkot, amelyen belül kell megkeresni a k1 kulcsú adatrekordot.
Ez a keresés lehet lineáris, de rendezett tárolás esetén lehet bináris.
Törlés
Megkeressük a törölni kívánt rekordot. Amennyiben nem a legkisebb a blokkban, töröljük.
Ellenkező esetben az indexállományt is korrigálni kell az új legkisebb kulcsnak megfelelően.
Ha a keresett rekord volt az egyetlen a blokkban, akkor a rá mutató indexrekordot is törölni kell.
Beszúrás
T.f.h. a k1 kulcsú rekordot akarjuk eltárolni. Először megkeressük azt a blokkot, amelyben a
rekordnak lennie kell (Bi blokk). Ha van elegendő hely, beírjuk a blokkba. Ha nincs, helyet kell
csinálni. Pl.: kérünk egy üres blokkot, majd a Bi blokk rekodjainak számát megfelezzük. Bi és Bn
között. Meghatározzuk a két blokkban a legkisebb elemeket, majd szükséges esetben Bi
indexrekorban korrigáljuk az értéket, a Bn-hez pedig új indexrekordot képezünk, amit
elhelyezünk az indexállományban. (Ehhez lehet, hogy az indexállományt is újra kell szervezni).
Módosítás
Ha nem érint kulcsot, a módosítás egyszerű (eddigiekhez hasonló.)
Ha érint kulcsot, akkor egy törlést követő beszúrás valósítja meg a rekord módosítását.
B* fák
Indexelt szervezésnél log2bi-vel arányos keresési idő érhető el. (kisebb, mint a heap, de nagyobb,
mint a hash.) A háttértár kihasználtsága kézben tartható. Ha bonyolítjuk a szervezést, lehetőség
van a blokkelérések számát csökkenteni logkbi-re (bizonyos esetekben, pl. nagyméretű
adatállományok vagy elég nagy k), jelentős a nyereség, viszont az indexeket egy k ágú fában kell
tárolni és ezt változáskor karban kell tartani.
A B* fák alapgondolata, hogy addig építünk egymásra ritka indexeket, ameddig az utolsó
index egyetlen blokkba bele nem fér. Tehát az i −1. index egyidejűleg ritka indexe az i. indexnek
és adatállománya az i −2. indexnek. A legalsó szint mutatói pedig az adatállomány egy-egy
blokkjára mutatnak. A B* fák ezen belül is olyan változatai ezen fáknak, ahol minden levele és
csomópontja pontosan blokkméretű és a gyökértől a levelekig vezető út mindig ugyan olyan
hosszú.
Elágazási tényező (blocking factor):
Keresés
Hasonló az egyszintű ritkaindexhez.
Beszúrás
Hasonló az egyszintű ritkaindexhez, annyi különbséggel, hogy van, amikor ügyelni kell a
fastruktúra kiegyen-lítettségét karban kell tartani.
Törlés
Megkeressük a kívánt adatot és töröljük, illetve az adatblokkban ha van lehetőség, összevonunk.
Módosítás
Hasonló az egyszintű ritkaindexhez.
7. Sűrű indexek
Megjegyzés: a sűrű indexelés önmagában nem egy állományszervezési módszer, erre mindig
épül egy másik módszer is (ritka index, hash, stb.). Ez a módszer elsősorban a fő állomány
kezelését könnyíti meg.
Hátrányok
eggyel több indirekció kell,
plusz adminisztráció.
Előnyök
nem kell rendezetten tárolni, helytakarékos,
gyorsítja a keresést,
Több kulcs szerinti keresés.
az adatállomány rekordjai szabaddá tehetőek, ha minden további hivatkozás a sűrű indexen
keresztül történik.
Keresés
Bináris kereséssel.
Törlés
Megkeressük a törölni kívánt rekordot, a törölt bitet szabadra állítjuk, a kulcsot pedig kivesszük
az indexál-lományból (ezt időnként tömörítjük).
Beszúrás
Hasonló a heap vagy hash-hez. Helyet keresünk, beállítjuk a foglaltsági jelzést, beírjuk az adatot.
A kulcsot és a tárolás helyére hivatkozó mutatót a kulcs szerint berendezzük az
indexállományba.
Módosítás
Megkeressük és módosítjuk. Ha kulcsmező is érintett, akkor az indexállományt újrarendezzük.
Megoldás
Egy rekord változó hosszúságú részeit a rekord mezőlistájának végén helyezünk el, így a rekord
eleje fix hosszúságú marad.
Az első esetben a leggyakoribb megoldás, hogy a változó hosszúságú mező helyett egy fix
hosszúságú mutató van a rekordban, a mező tényleges tartalma egy külön állományban tárolódik.
(biztosítja, hogy az állomány egyféle rekordot tartalmaz, könnyebb karbantartás).
Gyakori, hogy egy rekord több mezőjének értékét ismerjük, és keressük azon rekordokat,
amelyek ugyanezeket az értékeket tartalmazzák ugyanezen mezőikben. Feltételezzük, hogy
egyik sem kulcs.
Használata
Az ismert mezők értékei alapján meghatározhatjuk az N hosszúságú bitmintának az ismert értékű
mezőhöz tartozó darabjait, a többi nyilván tetszőleges lehet. Mindazon vödröket végig kell
néznünk illeszkedő rekordok után, melyeknek sorszáma illeszkedik a kapott mintára.
Gyakori az igény, hogy nem kulcsmezők alapján készítsünk lekérdezéseket, keressünk vagy
listázzunk. Általában több mező szerint is támogatni kell az adatrekordok megtalálását. Gyakran
beszélnek ilyenkor is kulcsokról, azonban fontos hangsúlyozni, ha csak a fizikai keresés során
tekintünk egy mezőt kulcsnak. (Keresési kulcs: bármely mező lehet, nem csak kulcs)
Több mód is létezik arra, hogy több kulcs alapján lehessen keresni, pár példa:
1. Több indexállomány, minden keresési kulcshoz egyet.
2. Invertált állomány (def.: Az az indexállomány, amely nem kulcsmezőre tartalmaz
indexeket.)
Az 1.(a) esetben az adatállomány rekordjai kötöttek és csak egyetlen invertált állomány esetén
használ-ható.
Az 1.(b) esetben eggyel több indirekción keresztül érhetjük el a keresett rekordot, de változáskor
csak az érintett mező(ke)t tartalmazó invertált állományt és indexállományt kell módosítani.
Ha a 2. megoldást választjuk, akkor az adatállomány rekordjai szabadok lehetnek, viszont nem
ismerjük még a keresett rekord címét. Ennek megtalálását hasheléssel vagy valamilyen indexes
módszerrel támogat-hatjuk.
Adatbázis létrehozásakor a cél, hogy a való világ adatait tároljuk, információt szerezve belőle
ahelyett, hogy a világból tennénk. Nincs mód egy adott problémakörrel kapcsolatos minden adat
eltárolására, egy meghatározott, szűk kört kezelünk. Az adatoknak egy meghatározott szűk
körét használjuk fel. Tehát egy leegyszerűsített képet alkotunk világunkról.
Az adatbázis így a világ egy leegyszerűsített képét adja vissza.
A kialakításkor követhetünk bizonyos konvenciókat, ami számos előnnyel járhat (de
természetesen hátrányokkal is). Ezek egy része arra vonatkozik, hogy milyen formában, milyen
kapcsolatok kialakítását támogatjuk, illetve, hogy milyen műveleteket engedélyezünk az
adatainkon. Így adatmodelleket hozunk létre.
Az ER modellek elemei
Egyedtípusok,
Attribútumtípusok,
Kapcsolattípusok.
Természetesen a típusokhoz tartoznak konkrét
példányok is, de a modellezés típus szinten
történik. Az egyedek bizonyos közös jegyek
alapján halmazokba rendeződnek. Egy-egy
halmaz neve az egyed típusa, elemei a
példányok.
Entitások
Egyed:
a valós világban létező, logikai/fizikai szempontból saját léttel rendelkező dolog, amelyről
adatokat tárolunk.
Tulajdonság:
az entitásokat jellemzi, amelye(ke)n keresztül az entitások megkülönböztethetők.
Egyedhalmaz:
az azonos attribútumtípusokkal jellemzett egyedek összessége.
Kapcsolatok
Az egyedek ritkán léteznek elszigetelten, valamilyen kapcsolatban állnak egymással. Ezeket
fejezzük ki a kapcsolattípusokkal. Tehát Kapcsolat: entitások névvel ellátott viszonya.
(Kapcsolattípus: entitás típusok névvel ellátott sorozata.)
Funkcionalitás (kardinalitás)
A kapcsolatok különbözhetnek abban is, hogy egy entitáshalmaz egy eleméhez egy másik
entitáshalmaz hány elemét kötik
1. Egy-egy kapcsolat
Olyan (bináris) kapcsolat, amelyben a résztvevő entitáshalmazok példányaival
egy másik entitáshalmaznak legfeljebb egy példánya van kapcsolatban.
2. Több-egy kapcsolat
Egy K: E1, E2 kapcsolat több-egy, ha E1 példányaihoz legfeljebb egy E2-beli
példány tartozik, míg E2 példányai tetszőleges számú E1-beli példányhoz
tartoznak.
3. Több-több kapcsolat
Egy kapcsolat több-több funkcionalitású, ha nem több-egy egyik irányban sem.
Kulcs
Az ER modellezésnél az attribútumnak azt a halmazát, amely az entitás példányait egyértelműen
azonosítja, kulcsnak nevezzük. Legalább egy kulcsnak kell lennie.
13. Az ER diagram, ISA kapcsolatok, gyenge egyedhalmazok
ISA kapcsolat
Gyakori, hogy egy entitáshalmaznak minden eleme rendelkezik egy másik, általánosabb
entitáshalmaz attri-bútumaival, de azokon kívül még továbbiakkal is. Ez a sajátos viszony az
"ISA" kapcsolat. (Az objektum-orientált modelleknél kitüntetett szerepe van).
Gyenge egyedhalmazok
Szintén gyakori, hogy a modellezés során egy entitáshalmaznak nem tudunk kulcsot
meghatározni, hanem ahhoz valamely kapcsolódó egyedekre is szükség van. Ebben az esetben
beszélünk gyenge egyedhalmazról. Ennek egyediségét egy vagy több tulajdonos egyedhalmaz
biztosítja, ami a gyenge egyedhalmazzal több-egy kapcsolatban áll. A kapcsolat neve
determináló kapcsolat. A gyenge egyedhalmaz példányait egyértelműen megkülönböztető
attribútumokat aláhúzással jelöljük.
Az adatok strukturáltsága
A relációs adatmodell mögött a halmazelméleti relációk elmélete húzódik meg.
Reláció: Halmazok Descartes-szorzatának részhalmaza.
Adott n halmaz, azonos elemeket nem tartalmazhatnak. A halmazokban található értékek egy-
egy domainből (tartomány) kerülnek ki. (D1, D2, ..., Dn).
A tartományok D1 ×D2 ×...×Dn Descartes-szorzatában megtalálhatók mindazon n-elem, amelyre
igaz, hogy vi ∈ Di, ∀i = 1, 2, ..., n-re.
A sorrendnek érdemi jelentősége sehol sincs.
További elnevezések:
Adatbázis séma: több relációs sémát tartalmazó adatbázis estén, a sémák összessége,
Reláció foka: a relációban lévő oszlopok száma,
Reláció számossága: a relációban lévő sorok száma.
Szabályok:
A reláció nem tartalmazhat két azonos sort,
Az sorok sorrendje nem számít,
Az oszlopoknak egyértelmű nevük van.
Műveletek
1. Egyesítés, unió (r1 ∪ r2),
2. Különbségképzés (r1 \ r2),
3. Descartes-szorzat (r1 × r2, mindent mindennel szorozni),
4. Vetítés, projekció (π, oszlopok elhagyása),
5. Kiválasztás, szelekció (σ, sorok elhagyása),
6. Természetes illesztés (r1 r2, azonos attribútum alapján illesztjük),
7. Θ illesztés (feltétellel történő natural join)
8. Hányados (r1 ÷ r2, az a reláció, amelyre igaz, hogy az r2-vel alkotott Descartes-szorzata a
lehető legbővebb részhalmaza r1-nek).
A relációs algebra és annak lehetőségei már ismertek fent. Célszerű hangsúlyozni, hogy az ily
módon megfogalmazott adatbázis-lekérdezéseknél explicit módon elő kell írnunk, hogy mely
relációkon vagy reláción milyen műveleteket milyen sorrendben fogunk elvégezni, hogy a kívánt
eredményt kapjuk. A relációs lekérdezéseknek ez az egyik legjelentősebb tényezője a relációs
adatbáziskezelők sikerének.
A relációalgebra műveletei az előzőekben voltak definiálva.
Relációs sorkalkulus
Szimbólumai(8):
1. zárójelek, aritmetikai relációk, logikai műveletek, sorváltozók, sorváltozók
komponensei, relációk, konstansok, kvantorok.
Atomok
1. R(m)(s(m)): (ahol R alapreláció), akkor igaz, ha s ∈ R, azaz a sor benne van a
relációban
2. s(n)[i] θ s(k)[j], ahol 1 ≤ i ≤ n, 1 ≤ j ≤ k és θ aritmetikai relációjel
3. s(n)[i] θ c
4. R(m)(c1, c2, …, cn)
Formulák
1. minden atom formula
2. ha Ψ1 és Ψ2 formulák, akkor Ψ1 ⋀ Ψ2, Ψ1 ⋁ Ψ2, ¬Ψ1 is formulák
3. ha Ψ formula és s(n) egy szabad sorváltozója, akkor (∃s(n)) Ψ és (∀s(n)) Ψ is
formulák, amelyekben s(n) már kötött sorváltozó
Kifejezések
felépítése: { s(m)| Ψ (s(m))}, ahol s(m) a Ψ (s(m)) formula egyetlen szabad sorváltozója
Relációs oszlopkalkulus
A relációs oszlopkalkulus elsősorban abban különbözik a sorkalkulustól, hogy sorváltozók
helyett egyszerű változók szerepelnek benne. Tapasztalat szerint bizonyos lekérdezések
egyszerűbben fogalmazhatóak meg ebben az esetben. Felépítése a sorkalkuluséhoz hasonló.
17. Biztonságosság
Ha betartjuk a szabályokat, akkor több relációs algebrait fát kapunk. Ezek csomópontjánál újabb
heurisztikák alapján algoritmusokat és pipeline-okat alkalmazunk.
Ezeknek meghatározható a költsége, melyek közül a legolcsóbbat választjuk.
Egy adott lekérdezéshez formális úton több, egymással ekvivalens relációs algebrai alakot is
konstruálhatunk, amelyek általában különböző költségekkel hajtható végre.
Ekvivalens kifejezések
Példaként az alábbi lekérdezés (add meg azon betétesek nevét, akiknek a számlája Bázelben
van):
Ennek a formának a költsége nagyon nagy lenne, hiszen három reláció illesztése után végezné
csak el a szelekciót. Sokkal hatékonyabb lenne így:
Ez takarékosabb, mert először végrehajt egy szelekciót, majd ezt követően illeszti a maradék
kifejezéssel.
A legkisebb költségű végrehajtási terv megtalálása az optimalizáló feladata. Első teendője, hogy
az adott lekérdezésekhez ekvivalens algebrai alakokat találjon meg, majd ezekhez alternatív
végrehajtási terveket kell készítenie.
Ekvivalencia szabályok
(V (A, r) = |πA(r)|.
Spec.: Ha A kulcs, akkor V (A, r) = nr),
SC(A,r): azon rekordok várható száma, amelyek kielégítenek egy egyenlőségi feltételt A
attribútumra. (Selection Cardinality).
A lekérdezés költsége
Join operáció
Egymásba ágyazott ciklus illesztés (Nested loop join)
Költséges eljárás, legrosszabb esetben br + nr · bs.
Ha a két reláció befér a memóriába, akkor br + bs.
Blokk alapú egymásba ágyazott ciklus illesztés (block nested loop join)
Okosabb, mint a Nested loop join, mert kihasználja a tárolás fizikai sajátosságait. Azáltal lesz
gyorsabb, hogy blokk alapú összehasonlítást végez.
Legrosszabb esetben br + br · bs, legjobb esetben br + bs.
Index alapú egymásba ágyazott ciklus illesztés (indexed nested loop join)
Ez az algoritmus kihasználja, hogy az egyik relációhoz van indexünk. Ha a Nested loop join
belső ciklusába az indexelt relációt tesszük, akkor nem szükséges minden s beli rekordot
végigvizsgálnunk, mert a keresés index alapján kisebb költséggel is elvégezhető.
Költség: br + nr · c, ahol c a szelekció költsége s-en.
Egyéb műveletek
Ismétlődés szűrése:
először rendezni kell, majd utána törölni. Költség: a rendezés költsége,
Vetítés:
minden rekordra végrehajtjuk, aztán töröljük az ismétlődéseket.
Ha rendezett, a költség br, általánosan br + rendezés,
Egyesítés:
Mindkét relációt rendezzük, majd összefésülésnél kiszűrjük a duplikációkat,
Metszetképzés:
Rendezés, majd összefésülés (csak a közös rekordokat figyelembe véve),
Különbségképzés:
Mindkét relációt rendezzük, összefésülésnél csak azok maradnak, amik az első relációban
szerepeltek.
A stratégia minden relációt kiszámít a fában, miközben létrejönnek közbülső relációk is.
A materializáció költsége tehát a végrehajtott operációk költségének összege, plusz a közbülső
relációk tárolásának és visszaolvasásának költsége.
Pipelining
A kiértékelés hatékonysága növelhető, ha redukáljuk az ideiglenesen tárolásra kerülő rekordok
számát. A pipeline lényege, hogy a részegységek az előttük álló elemből kapott
részeredményekből a sorban következő számára állít elő részeredményeket, így kiküszöbölhetjük
a tárolás szükségességét.
Előnye, hogy kicsi a memóriakövetelmény, mert az eredményeket nem tároljuk sokáig, egyből
továbbadjuk.
Hátránya az, hogy hogyha nincs közbülső reláció, akkor nem tudunk rendezni sem.
Megjegyzés: Egy több-egy kapcsolat két relációs sémába történő leképezésekor a "több" oldalon
álló egyedhalmaznak megfelelő relációban az idegen kulcsnak megfelelő attribútumok NULL
értéket vehetnek fel. Két relációs sémába szervezéskor az eredeti információ kinyeréséhez eggyel
kevesebb natural join művelet szükséges.
Észrevehető, hogy az ER diagram relációs sémákba szervezésekor az egyedek és a kapcsolatok
formális megkülönböztethetősége elveszik.
Módosítási anomália
T.f.h. címeket tárolunk és az egyik lakos címe megváltozik. A változást elvileg annyi helyen kell
átvezetni, ahány helyen az említett lakos címe szerepel. Ha csak egy helyen elmarad, később
különböző helyekről többféle címet is kiolvashatunk. Ez nem csak többletmunka, hanem logikai
ellentmondás is keletkezhet.
Beszúrási anomália
Ennek lényege, hogy nem tudunk tetszőleges adatokat nyilvántartásba venni, ha nem ismert egy
másik adat, amivel a tárolandó adat meghatározott kapcsolatban áll. (Nem szúrható be olyan
elem, amelynek azon mezője kitöltetlen, vagyis NULL, amely a reláció definíciója szerint nem
lehet kitöltetlen.) Illetve, ha már létező egyedhalmazt akarunk felvenni, melynek legalább az
egyik attribútuma időközben megváltozott, úgy nem dönthető el, hogy melyik a helyes.
Törlési anomália
Ha csak egy attribútum értékét szeretnénk törölni, akkor előfordulhat, hogy ez valamiért nem
lehetséges. Ilyenkor ettől az attribútumtól úgy szabadulhatunk meg, ha az egész sort töröljük, de
ilyenkor elveszhetnek szükséges információk is. Ezt megoldhatja a felációk függőségének
felbontása.
Azokat a szabályokat értjük ezalatt, amelyek segítségével az adatbázisunk tartalmát olyan módon
lehet jellemezni/korlátozni, hogy az valamely tervezésnek, illetve elképzelt/elvárt feltételnek
megfeleljen.
1. Egy n-est több sorban is fel kell használnunk más n-es(ek) azonosításához,
2. Ha feltételezzük, hogy nincs két ugyan olyan tulajdonságú n-es, akkor minden sorban, ahol
megjelent egy attribútuma, törvényszerűen megjelent egy másik attribútuma is, ami
felesleges.
Definíció: Legyen adott az R(A1, A2, ..., An) relációs séma, ahol Ai-k, i = 1, 2, ..., n alap
attribútumok. Legyen X és Y a reláció attribútumainak két részhalmaza: X ⊆ R és Y ⊆ R. Ha
bármely, az R sémára illeszkedő r reláció bármely két t, t0∃r(R) sorára fennáll az, hogy ha t[X] =
t0[X], akkor t[Y ] = t0[Y ], akkor azt mondjuk, hogy az Y attribútumok funkcionálisan függenek az
X attribútumoktól. Vagyis X értékei meghatározzák Y értékeit. Jelölés: X −→ Y .
Az ER modelleknél is használtuk a kulcs fogalmát, illetve a fizikai szervezésnél is, azonban itt
egy újabb értelmében használjuk majd.
Definíció (Relációs séma kulcsa ): X-et pontosan akkor nevezzük kulcsnak az R relációs sémán,
ha
Szuperkulcs, kulcs
Ha egy kulcs csak egy attribútumból áll, akkor egyszerű kulcs, egyébként összetett kulcs a neve.
Elsődleges kulcs
Ezek közül kiválasztunk egyet, amelyet elsődleges kulcsnak nevezünk, a többi kulcsot pedig
kulcsjelöltnek.
Ha X → Y és Y → Z, akkor X → Z, (tranzitivitás),
Ha X → Y, akkor XZ → Y Z (bővíthetőség).
Igazságtétel
Az Armstrong axiómák igazak, alkalmazásukkal csak igaz függőségek állíthatóak elő adott
függéshalmazból.
Teljesség tétel
Az Armstrong axiómák teljesek, azaz belőlük minden igaz függőség levezethető.
Következmények
Ha X → Y és X → Z, akkor X → Y Z (egyesítési szabály),
Ha X → Y és W Y → Z, akkor XW → Z (pszeudotranzitivitás),
Az első normálforma
Definíció Egy relációs séma 1NF alakú (vagy normalizált), ha csak atomi attribútum-értékek
szerepelnek benne.
Tehát egy relációs séma kulcsai az attribútumokat két diszjunkt halmazba sorolják.
Definíció (2NF): Egy 1NF relációs séma 2NF alakú, ha benne minden másodlagos attribútum a
séma bármely kulcsától teljesen függ. (Másodlagos attribútum nem függ egyetlen kulcs egyetlen
valódi részhal-mazától sem.)
Definíció (3NF, 1. definíció): Egy 1NF R séma 3NF alakú, ha egyetlen másodlagos attribútuma
sem függ tranzitívan (∃Y ⊂ R hogy X → Y, ¬(Y → X), Y → A, tehát X → A) egyetlen kulcstól
sem.
Megjegyzendő, hogy minden olyan séma, amely legfeljebb két attribútumot tartalmaz,
törvényszerűen BCNF.
Tétel: Ahhoz, hogy egy (R, F) sémáról eldöntsük, hogy BCNF-e, elég az F-beli funkcionális
függőségek vizsgálata.
A két definíció közvetlen következménye, hogyha egy séma BNCF alakú, akkor 3NF is.
ACID tulajdonságok
Ahhoz, hogy egy tranzakció egy DBMS konkurens környezetben is értelmezhető legyen,
hagyományosan további tulajdonságokat is, illetve minél többet ezek közül elvárják, hogy
teljesüljenek. Ezek az ún. ACID tulajdonságok.
Isolation (izoláció): minden tranzakció úgy fut le, mintha közben más tranzakció nem
futna.
Durability (tartósság): ha egy tranzakció már sikeresen lefutott, akkor annak a hatása "nem
veszhet el".
Tegyük fel, van T1, T2 tranzakciónk. Ezeket a további négy példában fogjuk használni majd.
Lost update
T.f.h. előbb T1 majd T2 tranzakció is kiolvassa a táblában szereplő A értéket. Majd előbb T1 végzi
el ezen az A = A + 1 műveletet, utána pedig T2. Ezt követően T2 "WRITE"-olja A értékét, végül
ugyan ezt megteszi T1-is. Ezzel T1 felülírta T2 eredményét, így az elveszett.
Általánosítva: több tranzakció ugyanazon adategységen végez módosításokat úgy, hogy egy T1
tranzakció felülírja a másik, T2 tranzakció által végzett művelet eredményét.
Non-repetable read
T.f.h. ∃A, B, C adategység. T1 tranzakció kiolvassa A-t és B-t, majd elvégzi a B = A + B
műveletet, majd ezt visszaírja B-be. Ezt követően T2 elvégzi az A = A + 1 műveletet, és visszaírja
A-ba. Végül T1 kiolvassa A-t és C-t, elvégzi a C = A + C műveletet és visszaírja C-t. Azonban
ekkor már A-nak a megváltozott értékét olvassa ki.
Általánosítva: egy olyan T1 tranzakció különböző eredményeket kap egy adategység többszöri
olvasásakor, mert egy másik, T2 tranzakció időközben módosított azt.
Phantom read
T.f.h. T1 tranzakció végrehajt egy lekérdezést. Ezt követően T2 töröl/beszúr olyan értékeket, mely
a lekér-dezés feltételeinek megfelelnek. Majd T1 újra végrehajtja az előző lekérdezést, azonban
eltérő eredményeket kap.
Általánosítva: T1 tranzakció többször is végrehajtja ugyan azt a lekérdezést, miközben egy másik
tranz-akció olyan rekordokat szúr be vagy töröl, amelyek kielégítik a T1 lekérdezés szelekciós
feltételét. Így a korábbi lekérdezés más rekordhalmazt adhat vissza, mint az utána következő(k).
Dirty read
T.f.h. előbb T1 kiolvassa a táblában szereplő A értéket, majd elvégzi ezen az A = A + 1 műveletet.
Azonban azelőtt, hogy ez sikeresen befejeződött volna, T2 is elvégzi ezt a műveletsort, és végül
lezárja. Ha T1 végül sikertelennek bizonyul, küld egy "ABORT" utasítást.
Általánosítva: egy T2 tranzakció olyan adatot olvas, melyet egy másik T1 tranzakció azelőtt írt az
adat-bázisba, hogy sikeresen befejeződött volna. Ha a T1 tranzakció végül valóban sikertelennek
bizonyul, akkor a piszkos adat az adatbázisból mihamarabb eltávolítandó.
Izolációs elv
Feltételezzük, hogy egy tranzakció elvárt, korrekt eredménye az, amit akkor kapunk, ha a
tranzakció futása közben más tranzakció nem fut.
Sorosíthatóság
Egy ütemezés pontosan akkor sorosítható, ha létezik olyan soros ütemezés (soros ekvivalens
ütemezés), amelynek minden hatása a módosított adatokra azonos az adott ütemezésével.
A patt
Tegyük fel, egy Tm tranzakció azért nem tud továbblépni, mert egy olyan A adategység
felszabadulására vár, amin egy olyan Tn 6= Tm tranzakció tart fenn zárat, ami viszont azért nem
tud továbblépni és zárat felsza-badítani, mert ehhez olyan adategységnek kell felszabadulnia,
amit Tm tart zárva, akkor pattról, holtpontról (deadlock) beszélünk.
Természetesen elképzelhető ez kettőnél több tranzakció esetén is.
Várakozási gráf
Olyan irányított gráf, ahol a gráf csomópontjai a tranzakciók, egy élt pedig akkor rajzolunk a Ti
csomópont-ból a Tj csomópontba, ha Ti tranzakció bármely okból várakoztatja Tj tranzakciót úgy,
hogy az nem tud továbbmenni.
Tétel: Adott időpillanatban kizárólag akkor nincs patt, ha a várakozási gráf körmentes (DAG).
Éhezés
Ha egy tranzakció egy adategység lockolására vár, de közben más tranzakciók mindig lockolják
előtte a kérdéses adategységet, akkor éhezésről beszélünk. Egy lehetőség az éhezés elkerülésére,
ha feljegyezzük a sikertelen zárkéréseket, és ha egy adategység felszabadul, akkor a zárat csak a
zárkérések sorrendjében ítélünk oda (FIFO stratégia).
Definíció (Sorosítható ütemezés): egy ütemezés pontosan akkor sorosítható, ha létezik olyan
soros ütemezés (soros ekvivalens) amelynek minden hatása a módosított adatokra azonos az
adott ütemezésével.
Olyan irányított gráf, amelynek a csomópontjai a tranzakciók, egy élt pedig akkor rajzolunk a Ti
csomópontból a Tj csomópont felé, ha van olyan A adategység, amelyen egy adott S ütemezésben
a Ti tranzakció zárat helyezett el, majd a zár felszabadítása után a Tj tranzakció helyez el zárat A-
n.
A sorosítási gráf segítségével tehát a sorosíthatóság eldöntése visszavezethető kör keresésére egy
irányított gráfban. Ez minden zárkeresési művelet előtt elvégzendő, így az egyidejűleg futó
tranzakciókés az általuk közösen használt adatelemek számának függvényében az ütemező
működése jelentősen lassulhat.
Tétel: Ha egy legális ütemezés minden tranzakciója a 2PL protokollt követi, akkor az ütemezés
sorosít-ható.
Zárpont
Az az időpont, amikor a 2PL szerinti tranzakció az utolsó zárját is megkapja.
RLOCK-WLOCK modell
Kétfjata zár létezik
RLOCK: Ha a T:
RLOCK A érvényes, akkor más tranzakció is olvashatja A-t, de senki sem írhatja.
(megosztható)
WLOCK: Ha a T:
W LOCK A érvényes, akkor más tranzakció nem férhet hozzá A-hoz. (nem megosztható)
Az UNLOCK művelet után minden zár felszabadul, ami legális ütemezések esetén a tranzakció
végetérte előtt bekövetkezik.
Itt is van lehetőség sorosítási gráffal eldönteni, hogy egy ütemezés sorosíthatóságát.
Megyjegyzés: A hatékonyság amiatt növekedik, mert a READ . . . READ szekvenciák esetén nem
kell élet húzni két tranzakció közé.
41. A fa protokoll
Hierarchikus adategységek
Eddig a mechanizmusok függetlenek voltak attól, hogy az adategységek milyen struktúrába
vannak szervez-ve, illetve szervezettek-e egyáltalán. Belátható, hogy ezen információk
felhasználásával tovább növelhető a hatékonyság.
Kihasználva a hierarchikus szerkezetet, lehetőség van arra, hogy egy adategység zárolása esetén
minden alacsonyabban lévő adategységet egyidejűleg zároljunk.
A fa protokoll
Az egyszerű tranzakció modellt követjük és egy csomópont zárolása nem jelenti a gyerekek
zárolását is.
Szabályok
1. egy tranzakció az első LOCK-ot akárhova teheti,
2. további LOCK-ok csak akkor helyezhetők el, ha az adategység szülőjére ugyanaz a
tranzakció már rakott zárat,
3. egyazon tranzakció kétszer ugyanazt az adategységet nem zárolhatja.
Vegyük észre, hogy az UNLOCK-ra nincs megkötés, emiatt a fa protokoll nem feltétlenül
kétfázisú.
Zárműveletek
LOCK A: zárolja A-t és az összes leszármazott csomópontot is. Két különböző tranzakció
nem tarthat fenn egyidejűleg zárat ugyanazon az adategységen.
WARN A: figyelmeztetést rak A-ra. Ekkor azt más tranzakció nem zárolhatja.
UNLOCK A: eltávolítja a zárat vagy a figyelmeztetést.
Nem foglalkoztunk azokkal az esetekkel, amikor a tranzakció nem fut le teljesen. Ahhoz, hogy
hatékonyan kezelhessük ezeket, gyűjtsük össze az okokat:
1. A tranzakció félbeszakad,
2. Az ütemező patt miatt kilövi,
3. A sorosítás biztosítása miatt lövi ki,
4. Rendszerhiba lép fel, az adatbázis hibásan működik,
5. A háttértár tartalma (is) megsérül.
Az 1-3 esetben memória- vagy háttértár-struktúra érintetlen a 4-5 hibákkal szemben (ilyenkor a
tartalom is sérül, érdemes a backup).
Definíció (konzisztens állapot): Az adatbázisnak olyan állapota, amely csak teljesen lefutott
tranzakciók hatását tükrözi (l. ACID tulajdonságok).
Definíció (készpont): Az az időpillanat, amikor egy tranzakció futása során már minden
befejeződött, ami a tranzakció 1-3. okok miatti abortját eredményezheti.
Piszkos adat
Olyan adat, amit az előtt írt valamely tranzakció az adatbázisba, mielőtt committálták volna.
Mindez csak akkor igaz, ha nem kell rendszerhibával számolni. Ez ellen más módszerekkel kell
védekezni.
Tétel: A szigorú kétfázisú protokollt követő tranzakciókból álló legális ütemezések sorosíthatók
(kétfázisú) és lavinamentesek (nincs piszkos adat olvasás).
Agresszív protokoll
(Optimista konkurenciakezelés):
Egy protokoll agresszív, ha megpróbál olyan gyorsan lefutni, amennyire csak lehetséges, nem
törődve azzal, hogy ez esetleg aborthoz is vezethet (keveset foglalkozik a zárakkal).
Konzervatív protokoll
(Pesszimista konkurenciakezelés):
Egy protokoll konzervatív, ha megkísérli elkerülni olyan tranzakciók futtatását, amelyek nem
biztos, hogy eredményesek lesznek.
A rendszerhibák elleni védekezés általános módszere a naplózás. Számos módja lehet, a alább a
leggyakori-abbak.
Alapszabály, hogy a naplót azelőtt írjuk, mielőtt a naplózott műveletre sor kerülne (kiv.: abort
művelet naplózása).
A helyreállítás képességének igénye miatt a napló stabil tárban (háttértáron, diszken) tárolandó.
Ennek költ-sége a háttértárra írt naplóblokkok számával arányos.
A gyakorlatban a naplóblokkokat valamilyen lapozási stratégiával kezelik. Számos napló oldal
lehet egyidejűleg a memóriában és egy lapmenedzser gondoskodik a háttértárra kiírásról,
meghatározott stratégia és feltételek szerint.
Tipikus, hogy ugyanez igaz az adatbázis blokkokra is.
Az adatbázis oldalakat lehet a naplótól függetlenül is, egy másik lapozási stratégia szerint
cserélni.
Nevét onnan kapta, hogy olyan tranzakciókezclést valósít meg, amely rendszerhiba (és
tranzakcióidba) után szükségtelenné teszi az undo műveletet, csak redo kell.
A redo naplózás
A szigorú 2PL finomítása. Lépései:
1. (T, begin) naplóba
2. (T, A t (A új értéke)) naplóba, ha T változtatja A adategység értékét,
3. (T, commit) naplóba, ha T elérte a commit pontját,
4. napló stabil tárba írása, ha még nem történt meg (végleges, ami eddig eljutott),
5. Az értékének tényleges beírása,
6. piszkos DB blokkok diszkre írása,
7. zárak elengedése.
A redo helyreállítás
A redo helyreállításnál könnyen előfordulhat, hogy igen régi időpontra kell a naplóban visszafelé
menni ahhoz, hogy alkalmas időpontot találjunk a helyreállítás megkezdésére. Ezen a problémán
segítenek az ellenőrzési pontok, amikor kikényszerítik az adatbázisnak egy konzisztens állapotát:
Előnyök
redo helyreállításnál csak a legutóbbi ellenőrzési pontig kell a naplóban visszamenni,
emiatt a napló korábbi részei eldobhatók,
csökkenti a lavinák számát.
Hátrány
Csökkenti a tranzakciós teljesítményt.
Ütemezés
Adott idő eltelte után,
adott számú tranzakció után,
a kettő kombináltja.
Definíció (időbélyeg): Olyan érték, amelyet minden tranzakcióhoz szigorú egyediséget biztosítva
rendelünk hozzá, és amely arányos a tranzakció kezdőidejével. Jele: t(Tranzakció).
Működés
1. Megvizsgálja minden írás-olvasás előtt a hivatkozott adategység időbélyegét,
2. ha ez a sorosítási szabályokkal összhangban van (ld. később), akkor az adategység
időbélyegét felülírja a műveletet végrehajtó tranzakció időbélyegével,
3. ha nincs összhangban, akkor pedig abortálja a tranzakciót.
Összefoglalva
Tanulság: sem a zárakkal, sem az időbélyegekkel való sorosítás nem jobb egyértelműen a
másiknál.
Megoldási ötletek
1. elfogadjuk a lavinákat, hiszen az időbélyeges tranzakciókezelést tipikusan olyan
környezetben használ-juk, ahol kevés az abort, tehát a lavina még kevesebb, vagy
2. megakadályozzuk a piszkos adat olvasását pl. azzal, hogy nem írunk az adatbázisba, amíg a
tranzakció el nem érte a készpontját.
Lépések
1. Módosítások csak munkaterületen elvégezve,
2. Tranzakció eléri a készpontját,
3. írások véglegesítése az adatbázison.
Az írásokkal azonban baj van. Az időbélyeg ellenőrzése a készpont előtt kell, hogy történjen,
hiszen utána már a tranzakció akkor sem abortálhat, ha az időbélyegek vizsgálatából ez
következne, így azután egy írandó adatelem időbélyegének ellenőrzése és tényleges írása között
jelentős idő telhet el, ami problémát okozhat. Pl.: Elvégeztünk egy írást A-n, ennek megfelelően
beállítottuk az írási időbélyegét, de A megváltozott értékét más tranzakciók mégsem látják, mert
csak munkaterületen történt az írás.
Megoldás
A tényleges írásig A-ra zárat kell tenni. Ha T közben abortál, akkor a zárat el kell engedni és
IV(.A) értékét helyreállítani.
További alternatívák
akkor ellenőrizzük az időbélyegeket, amikor az írási/olvasási igény megjelenik,
közvetlenül a készpont előtt ellenőrizzük az időbélyegeket.
Az első esetben (pesszimista stratégia) a zárak hosszabbak, de az abort valószínűsége kisebb,
míg a másik esetben (optimista stratégia) éppen fordítva van.
53. Verziókezelés időbélyegek mellett (MVCC)
Kézenfekvő megoldás, ha idősor jellegű adatokat kívánunk tárolni (betegek adatai, tőzsdei
árfolyamváltozások, szoftver projektek verziói stb.).
Fizikai megoldás: pl. egyszer írható optikai diszkek.
Előny
Segít az időbélyeges tranzakciókezelés mellett az abortok számát is csökkenteni, ha a verzió
keletkezési idejét (értsd: időbélyegét) is tároljuk.
Hátrány
Ha a T tranzakció írni akarja A-t, akkor abort T kell t(T ) < R(A) esetén.
Verziók esetén csak akkor kell abort, ha van egy Ai változat, amelyre W (Ai) < t(T ) < R(Ai)
(hiszen annak a tranzakciónak, amely Ai-t olvasta, valójában azt az értéket kellett volna olvasnia,
amit T hozna létre).
Összefoglalva
alapvetően konzervatív módszer (pesszimista stratégia),
hatékonyan támogatja a sok/hosszú olvasási tranzakciókat,
több háttértárat igényel,
bonyolultabb adat visszakeresési algoritmus,
a DBMS-nek kell felderítenie, ha egy verzió a futó tranzakciók számára már közömbös,
így törölhető