Sok tárolási kérdésben kell az adatbázis-adminisztrátornak döntenie, mielőtt egy adatbázist létrehoz. Az egyik legfontosabb kérdés, hogy mennyi helyet ad az adatbázisnak. Ennek becsléséhez szükséges azt tudnia, hogy mennyi adat kerül az adatbázisba, illetve azt, hogy az adatbázis-kezelő rendszernek ezen felül még milyen és mennyi járulékos információt szükséges tárolnia. Ehhez az adatbázis-adminisztrátornak ismernie kell az adatbázis-kezelő rendszer pontos működését.
A relációs adatokat a felhasználók logikailag táblákba szervezetten tudják kezelni. Azonban ezeknek az adatoknak állományokban kell megjelenniük a háttértárolón. A fizikai tervezéskor az adatbázis-adminisztrátor a táblákhoz egy olyan logikai struktúrát rendel, amely azt fogja meghatározni, hogy a tábla adatai milyen fizikai állományokban lesznek tárolva. Ezeket a logikai struktúrákat általában táblatereknek hívjuk, és ezek az adatbázisnak objektumai. A 4-1. ábra azt mutatja, hogy egy adatbázis egy vagy több táblateret foglal magában és az egyes táblaterek egy vagy több táblát tartalmaznak. Az adatbázis-kezelő rendszertől függ az, hogy egy tábla adatai több táblatérbe is kerülhetnek-e. Általában az adatbázis-adminisztrátor egy táblát egy táblatérbe helyez el. Az adatbázis-adminisztrátor dönti el, hogy a táblákat hogyan rendeli a táblaterekhez, amely függ az adatok használatától, a táblatér típusától, és az adatbázis-kezelő rendszer tulajdonságaitól.
4-1. ábra – Állományok, táblaterek, és a táblák kapcsolata
A táblaterekhez nem csak a táblákat kell hozzárendelni, hanem minden olyan adatbázis-objektumot, amelynek tárigénye van. Az adatbázis-objektumok a táblatereken keresztül vannak az állományokhoz rendelve, azaz a táblaterekkel határozhatjuk meg, hogy melyik adatbázis-objektum milyen lemezen és hol van tárolva. A táblán kívül az index az a másik nagyon fontos adatbázis-objektum, amely sok adatot tárol és táblatérhez kell rendelni.
A táblatér az adatbázisban ugyancsak egy adatbázis-objektumként jelenik meg. Az adatbázis-adminisztrátor feladata hozzárendelni a szükséges operációs rendszerbeli vagy állomány-rendszerbeli állományokat, amelyekhez az adatbázis-kezelő rendszer biztosítja a szükséges utasításokat. Egy táblatérhez lehet egy vagy több állományt is rendelni. Kezdetben általában az adatbázis-adminisztrátor egy állományt rendel hozzá, de az adatbázis növekedésével a tárigény kielégítésére új állományokat lehet hozzá rendelni.
A táblatérhez meg lehet adni a tárolásra vonatkozó paramétereket is, mint például azt, hogy a táblatérnek mekkorák legyenek az adatlapjai, vagy esetleg a mérete dinamikusan változhat-e.
A lemez tárolási egysége az operációs rendszerbeli blokk. A blokkok mérete fix. A lemezről az adatokat az adatbázis-kezelő rendszer a memóriába olvassa fel. Ennek a beolvasásnak az egysége az adatlap, amelynek a mérete a lemezblokk méretével egyezik meg, vagy annak az egész számú többszöröse. Vagyis az adatbázis-kezelő rendszer egyszerre egy adatlapnyi adatot tud a memóriába beolvasni.
A táblaterekhez rendelt állományok felépítésének alapja az adatlap. Azaz az adatállományok szerkezeti egységeként ugyancsak az adatlapot tekinthetjük.
Az adatbázis tábláiban lévő adatok azonban sorokba és oszlopokba vannak szervezve. Kérdés az, hogy hogyan kerülnek a tábla adatai az adatlapokra, milyen formában. A tábla egy-egy sorát az adatbázis-kezelő rendszer adatrekordba szervezi. A rekord mezőiben az adatok lehetnek fix vagy változó hosszúságúak, a tábla oszloptípusainak megfelelően. Ahhoz, hogy tudjuk, hogy az adott adatrekord melyik táblának az adatait vagy milyen felépítésű rekordot tárol, szükség van a rekord szerkezetét leíró információkra is. Ez azért is szükséges, mert az egy táblában lévő adatrekordok hossza is különböző lehet. Mégpedig úgy, hogy változó hosszúságú vagy opcionális mezőket tartalmaznak.
Az adatrekord pontos felépítése adatbázis-kezelő rendszerről adatbázis-kezelő rendszerre változhat. Azonban általánosan elmondhatjuk, hogy az adatrekord a következő részekből áll:
fejléc: Egy rekord általában néhány bájtnyi adminisztrációs információval kezdődik, amely a rekord adattartalmának szerkezetét és elrendezését határozza meg. Ez tartalmazhat hosszúságot, információt a változó hosszúságú adatokról és más ellenőrző szerkezetet.
adatok: A tábla egy sorának aktuális adattartalmát tartalmazzák az oszlopdefiníció sorrendjében. Az adatbázis-kezelő rendszertől függően a változó és a fix hosszúságú oszlopok elkülönítve lehetnek.
opcionális offset tábla: a rekord tartalmazhat mutatókat, hogy a rekordban tárolt változó hosszúságú mezőket kezelje és felügyelje.
A 4-2-es ábrán az adatrekord szerkezetét figyelhetjük meg.
4-2. ábra – Adatrekord-szerkezet
Az adatrekordokat azonban egyaránt el kell helyezni a memóriában és az állományokban is. A memória és az állományok felépítésének az alapegysége az adatlap. Azaz az adatrekord bele kell, hogy kerüljön az adatlapba. A legalapvetőbb kérdés az, hogy a kettő közül melyik a nagyobb. Az esetek nagy részében egy adatlapra több adatrekord kerülhet, de nagyméretű adatrekordnál előfordulhat, hogy az nem fér rá egy adatlapra. Nagyméretű adatrekord akkor fordulhat elő, ha egy táblában olyan adattípusú adatokat tárolunk, mint szövegek, képek, vagy más bináris nagyméretű objektumok. Ha más típusú rekordoknál is előfordul az, hogy az adatrekord nagyobb, mint az adatlap, akkor az adatbázis-adminisztrátor a telepítésnél, vagy a táblatér létrehozásánál nem jól választotta meg az adatlap méretét. Ez pedig teljesítményproblémákhoz vezethet. A teljesítményprobléma megoldására ilyenkor újra lehet szervezni a problémás táblateret. Vannak azonban olyan adatbázis-kezelő rendszerek is, amelyek nem engedik meg az adatlap méretének a változtatását.
Nézzük meg, mi van akkor, ha az adatlap mérete nagyobb, mint az adatrekord mérete. Tegyük fel, hogy az adatlap mérete L bájt, az adatrekord mérete R bájt. Vegyük L/R egészrészét, ami megadja, hogy egy adatlapra mennyi adatrekord kerülhet. Természetesen ekkor marad az adatlapon kihasználatlan terület. Ez nagy problémát nem okoz. Ha mégis ki akarná az adatbázis-kezelő rendszer használni ezt a kis területet, akkor ide elhelyezheti egy rekordnak egy részét. A rekordok részeit azonban mutatókkal kell összekapcsolni. Általában a teljesítmény szempontjából hatékonyabb, ha az a kis adatlaprész inkább kihasználatlan marad, minthogy a mutatók mentén kelljen összeszedni az adatrekordot. Ezért az adatbázis-kezelő rendszerek általában inkább kihasználatlanul hagyják azt az adatlaprészt.
Ha az adatrekord mérete nagyobb, mint az adatlap mérete, akkor a rekordot részekre vágja az adatbázis-kezelő rendszer és több adatlapon helyezi el. A szétvágott rekordokat mutatók segítségével kapcsolja össze.
A különböző adatbázis-kezelő rendszerek más-más felépítésű adatlapot használhatnak, de általában elmondhatjuk, hogy egy adatlap 3 alapkomponenst tartalmaz:
adatlapfejléc: néhány bájtnyi fizikai gazdálkodási információ. Az adatlaplapfejléc tartalmazhat egy adatlap-azonosítót, mutatókat a megelőző és következő adatlapra, egy azonosítót, amely megmutatja, hogy az adatlap melyik táblához tartozik és szabad tár mutatókat.
adatrekordok: a sorok adattartalmát tartalmazza.
opcionális offset tábla: mutatókat tartalmaz, melyek az adatlap egyes adatrekordjait címzik. Néhány adatbázis-kezelő rendszer mindig használ offset táblát, mások csak akkor, ha változó hosszúságú rekordok vannak az adatlapon.
Az adatlapszerkezet és a komponensek hossza adatbázis-kezelő rendszerről adatbázis-kezelő rendszerre változhat.
A 4-3. ábrán az adatlap felépítésének vázlatát láthatjuk.
4-3. ábra – Az adatlap felépítése
Az indexrekord leírása előtt tisztáznunk kell, hogy egy adatbázis-kezelő rendszerben mi is az az index, miért olyan fontos.
Tekintsünk ehhez egy egyszerű lekérdezést:
SELECT VEZETEKNEV, KERESZTNEV
FROM DOLGOZO
WHERE VEZETEKNEV='Kovács';
Ha a táblánkon nincs index, akkor az adatbázis-kezelő rendszernek a DOLGOZO táblához tartozó összes sorhoz tartozó adatlapot fel kell olvasnia, hogy megtalálja a lekérdezésnek megfelelő értékeket. Ha még ráadásul a WHERE feltételben az elsődleges kulcsra vonatkozó feltételt írnánk, akkor ugyan tudjuk, hogy csak egy sort kell megtalálnunk, de ugyanúgy végig kell nézni a tábla összes sorát. Az ilyen típusú keresések megkönnyítésére hozhatunk létre egy táblához egy vagy több indexet.
Az index segítségével az adatbázis-kezelő rendszernek nem kell a tábla minden sorát végignéznie, hanem annak csak egy töredék részét. Az index alapjául szolgáló oszlopokat indexkulcsoknak nevezzük.
Az indexekre legegyszerűbb módon úgy tekinthetünk, mint kulcs-mutató párok halmazára. A kulcs a keresési kulcs lesz, amelynek az értékei az indexelt tábla oszlopértékeinek vagy transzformált oszlopértékeinek felelnek meg, a mutató pedig egyedi index esetén arra az adatrekordra mutat, amely tartalmazza a keresési kulcsot, egyébként pedig rekordcsoportot címez.
Az indexek lehetnek a kulcsérték szerint rendezettek, lehetnek összetettek, ebben az esetben a kulcs összetett, több oszlopból tartalmaz adatokat.
Mindenesetre az adatbázis-kezelő rendszernek sokkal könnyebb dolga van akkor, ha az indexbejegyzések között kell megkeresnie egy adott értéket, majd a mutató alapján megtalálni a keresett adatrekordot.
A 4-4-es ábrán a DOLGOZOK tábla adatai alapján felépített rendezett indexet láthatunk.
4-4. ábra – Index
A jegyzetnek nem témája az index fogalmát jobban leírni. A különböző indextípusok alapjául szolgáló adatszerkezeteket előismereteinkből ismerjük, a pontos megvalósításukat pedig az adott adatbázis-kezelő rendszer dokumentációja leírja.
Az indexeket a táblákhoz hasonlóan táblaterekhez kell rendelnünk. Ezek a táblaterek lehetnek ugyanazok, mint a táblákhoz rendelt táblaterek. Elképzelhető például, hogy egy táblatérbe van elhelyezve a DOLGOZO, és a RESZLEG tábla, illetve a MUNKAKOR táblának az adataira felépített MUNKAKOR_PK index. Ennek megfelelően a táblaterekhez tartozó állományok ugyanazok, azaz a felépítésük alapegysége továbbra is az adatlap.
Az adatlapokra indexrekordokat helyezünk el. Ezt hasonló módon tehetjük meg, mint azt az adatrekordoknál láttuk. Azonban az indexrekordok szerkezete más, mint az adatrekord felépítése. Egy általános indexrekord a következőket tartalmazza:
fejléc: mint az adatlapoknál, az indexrekordok is általában néhány bájtnyi fizikai adminisztrációs információval kezdődnek, részletezve az indexrekord struktúráját és elrendezését.
indexkulcsértékek: az indexkulcsokhoz tartozó aktuális adatértékek vannak felsorolva a definíció sorrendjében.
adatlapmutató: ez mutatja azon táblához tartozó adatlap fizikai helyét, amelyben az indexelt adat jelenleg található.
opcionális offset tábla: az indexrekordban tárolt változó hosszúságú mezők pozíciójának kezeléséhez és felügyeletéhez.
A 4-5-ös ábrán az indexrekord szerkezetét figyelhetjük meg.
4-5. ábra – Indexrekord-szerkezet
Alapvetően az operációs rendszerben az egy állományhoz tartozó blokkok nem folyamatosan helyezkednek el a lemezen. Az operációs rendszer az állomány blokkjait egymással mutatókkal kapcsolja össze. Azonban mégis szokott lenni valamennyi blokk, amely folyamatosan helyezkedik el a lemezen. Az adatbázis-kezelő rendszer általában az operációs rendszerben egyszerre nem csak egy adatlapnak megfelelő darabszámú blokkot foglal le, hanem többet. A több adatlaphoz tartozó, a lemezen folyamatosan elhelyezkedő blokkokat nevezzük együtt kiterjesztésnek (extent).
Alapvetően egy adatbázis-objektumhoz az adatbázis-kezelő rendszer először csak egy kiterjesztést használ. Később, ahogy az adatbázis-objektum nő, egyre több tárterületre van szüksége, ezért újabb és újabb kiterjesztéseket foglal le az adatbázis-kezelő rendszer. Ezeket az újonnan lefoglalt kiterjesztéseket nevezzük másodlagos kiterjesztéseknek.
A táblatér tulajdonságaként adható meg, hogy mekkora legyen a táblatérbe létrehozott adatbázis-objektumhoz az elsődleges és a másodlagos kiterjesztések mérete.
Előfordulhat, hogy egy állomány eléri az adatbázis-kezelő rendszerben megadott maximális méretét, azonban az állományba még újabb adatokat szeretnénk beszúrni. Ekkor állománykiterjesztést hozhat létre az adatbázis-adminisztrátor. Ez egy új állomány, amely az eredeti állományhoz van kötve és csak az eredeti állománnyal együtt lehet használni.
Az adatbázisbeli táblákban lévő adatokat a felhasználók bővíthetik, törölhetik vagy módosíthatják. Ami azt jelenti, hogy a lemezen lévő állományok tartalmát módosítja az adatbázis-kezelő rendszer.
A táblába egy új sor beszúrása nagyon egyszerű: az adatbázis-kezelő rendszer a táblát tartalmazó táblatérhez rendelt megfelelő állományban keres egy olyan adatlapot, amelyen van hely és oda teszi be az új rekordot. Ha nem talál ilyen adatlapot, akkor keres az állományba egy új adatlapot és oda szúrja be az új rekordot. Új adatlap vagy létezik az előző kiterjesztés lefoglalása miatt, vagy új kiterjesztésre van szükség.
Egy táblabeli sor törlése esetén az kézenfekvő lenne, hogy az adott hely egyszerűen felszabadul. Azonban ez sem ilyen egyszerű, hiszen egy adatlapon több rekord van. Ha nem az utolsót töröljük, akkor ahhoz, hogy a szabad helyet a törlés után jól ki lehessen használni, az adatlapot újra kell szervezni vagy esetleg több adatlap összevonásával egy adatlapot meg lehet szüntetni.
A táblabeli módosítás esete pedig jelentheti azt, hogy az adatrekord mérete ugyanakkora marad, nő vagy éppen csökken. Ha ugyanakkora marad, akkor nincs vele gond, a megfelelő értékeket kicseréli az adatbázis-kezelő rendszer. A rekord mérete attól függően nő vagy csökken, hogy a rekordban lévő változó hosszúságú mezők hogyan változnak. Ha a rekord mérete nő, akkor keresni kell neki új helyet. Ha az adatbázis-kezelő rendszer nem talál ugyanazon az adatlapon szabad helyet, mint amelyiken a rekord van, akkor adatbázis-kezelő rendszertől függően vagy a teljes rekordot áthelyezi, vagy a rekordnak csak egy részét helyezi át új adatlapra. A második esetben mutatókat használ, hogy a rekord részeit összekapcsolja. Ha a rekord mérete csökken, akkor az ugyanolyan problémákat vet fel, mint egy sor törlése.
Ha az adatbázis-adminisztrátor egy táblához a szükséges tárterületet számolja, akkor természetesen a rekordhosszúsággal és nem a sorhosszúsággal kell számolnia. A rekord hossza tartalmazza a fejlécet és az offset táblát is. A sor hossza a tábla oszlophosszainak az összege. Az adatbázis-adminisztrátornak ki kell tudnia számolni a pontos sorhosszat is, mivel a sorhossz az egyik része a rekord hosszának. Ez sem könnyű feladat, hiszen az oszlopok lehetnek változó hosszúságúak is.
A sor adatrészhosszának a kiszámításához az adatbázis-adminisztrátornak dokumentációra van szüksége, amely leírja az adatbázis-kezelő rendszer által támogatott adattípusok aktuális fizikai hosszának a meghatározását. Ezen adattípusok tárolásához szükséges hosszak adatbázis-kezelő rendszerről adatbázis-kezelő rendszerre változnak.
Ha az adatbázis-adminisztrátor ismeri az adatlap szerkezetét és ki tudja számolni a rekord hosszát, akkor egy tábla méretének a kiszámítása már könnyű. A rekordhossz kiszámítása után a következő lépés meghatározni, hogy mennyi sor fér el egy adatlapra. Egy adatlap mérete adatbázis-kezelő rendszerről adatbázis-kezelő rendszerre változik, és a legtöbb adatbázis-kezelő rendszer esetén az adatbázis-adminisztrátor határozhatja meg a különböző adatlapméreteket.
Például tegyük fel, hogy egy adatlap mérete 2 KB, de ebből 32 bájt szükséges az adatlap fejléc-információinak. Marad 2016 bájt, amelyen adatsorokat lehet tárolni. Ha elosztjuk a 2016 bájtot egy adatsorhoz tartozó rekord méretével, akkor megkapjuk azt, hogy mennyi sor fér rá egy adatlapra.
A táblaméretet úgy kaphatjuk meg, hogy kiszámoljuk, hogy mennyi adatlap szükséges a táblában tárolt sorok számához és megszorozzuk az adatlapmérettel. A példánk alapján: a sorok számát elosztjuk az adatlaponkénti sorok számával és ezt az értéket megszorozzuk 2 KB-tal, ami az adatlapnak a mérete.
Természetesen az adatbázis-adminisztrátornak számolnia kell a táblához meghatározott szabad területtel is, hiszen a tábla adatait frissíthetik, törölhetik, vagy lehet, hogy új adatok kerülnek a táblába. Ehhez azt is meg kell tudnia becsülnie, hogy a tábla tartalma milyen gyakran fog módosulni és azok milyen típusúak lesznek (frissítés, törlés, beszúrás). Azt se feledjük, hogy vannak olyan adatok, amelyek a táblán kívül, de az adatbázison belül tárolódnak, mint a szövegoszlopok, vagy a LOB oszlopok. Sőt megjelenhetnek adatok külső, operációs rendszerbeli állományokban is.
Egy index tárolásához szükséges hely kiszámításának első lépése az, hogy kiszámítjuk az index sorméretét. Ez a sorméret függ az index típusától. Azonban hasonlóan, mint a táblabeli sor méretének a kiszámításához nemcsak az indexnek a sorméretét, hanem az indexrekord méretét is ki kell számolni. A rekordok hossza a sorok hossza plusz a sor tárolásához szükséges egyéb hosszúságok. A rekordméret kiszámolásához szükség van az általunk használt adatbázis-kezelő rendszerben az indexekhez szükséges egyéb hosszúságokra.
Ha kiszámoltuk a rekordméretet, mehetünk a következő lépésre, az indexhez szükséges tárhely összegének a kiszámítására. Amely teljesen ugyanaz, mint a táblánál alkalmazott módszer.
Természetesen idővel az index is változik, ezért az adatbázis-adminisztrátornak az indexeknek is kell olyan helyet fenntartani, ahová tud bővülni, ha szükséges.