- Digitális kultúra 11. (NAT2020) Adatbázis-kezelés - digitális tankönyv
- Saját forrás
- melyek az adatbázis-kezelés alapfogalmai
- hogyan kell egy adatbázist megtervezni
- hogyan lehet egy adatbázist létrehozni, az adatokat importálni
- milyen lehetőségek vannak az adatok kinyerésére
- mikor használunk logikai műveleteket a lekérdezésben
- milyen mezőtípusokat különböztetünk meg
- hogyan lehet az adatokat rendezni és több táblából kinyerni
- mik azok a számított értékek
- mire jók az aggregáló függvények
- mikor használunk segédlekérdezéseket
- hogyan készíthetünk jelentéseket és űrlapokat
- Az adatok biztonságos tárolása
- A tárolt adatokból különféle információk kinyerése
- A feladat megfogalmazása
- Az adatbázis megtervezése, ésszerűsítése
- Az adatbázis létrehozása
- Lekérdezések segítségével információ kigyűjtése
1. A feladat megfogalmazása:
A mintapéldában diákokról szeretnénk a következő adatokat tárolni: a nevét, hány éves, hol született, milyen nyelvet tanul, melyik iskolába jár, illetve hány diák jár abba a suliba?
A feladat általános megfogalmazásban - három diákra kivetítve - valahogy így néz ki:
" Nóra 13 éves, Budapesten született, angolul és németül tanul, a Piros iskolába jár, amely Budapesten található, és 652 diákja van. Pista a neve annak az angol nyelvet tanuló, 11 éves diáknak, akinek születési helye Sopron, a Piros iskolába jár, amely Budapest városában található, és amelynek 652 diákja van. A Szolnokon született Bea 12 éves, a Kék iskolába jár, amely Szegeden található, és 541 diákja van. "
A feladatot olvasva magunk is érezzük, hogy ez rendben is lenne, de ezekből a mondatokból igen-igen nehezen lehetne gyorsan kigyűjteni az információkat például, hogy:
(A kérdések színei az oldal alján lévő következtetésekben szerepük lesz!)
- hány diák született Budapesten,
- kik vidékiek,
- vagy azt, hogy az adott pillanatban melyik diák hány éves,
- melyik iskolában tanítanak német nyelvet is, stb...
Nos, nézzük meg, hogyan oldjuk meg mindezt adatbázis-kezeléssel!
2. Az adatbázis megtervezése, ésszerűsítése:
Vegyük észre, hogy vannak olyan szavak, szópárok, esetleg létrehozhatunk olyan szókapcsolatokat, amelyek a feladat megoldása szempontjából kiemelkedően fontosak. Az átláthatóság érdekében először csak az egyik diák (Pista) esetében nézzük meg ezeket a szópárokat ill. szavakat:
" Pista a neve annak az angol nyelvet tanuló, 11 éves diáknak, akinek születési helye Sopron, a Piros iskolába jár, amely Budapest városában található, és amelynek 652 diákja van."
A szópárok tehát a következők:
Tulajdonság | Érték | |
név | ⟼ | Pista |
nyelv | ⟼ | angol |
év | ⟼ | 11 |
születési hely | ⟼ | Sopron |
iskola | ⟼ | Piros |
város | ⟼ | Budapest |
diák(száma) | ⟼ | 652 |
Nézzük ezeket táblázatba foglalva úgy, hogy a táblázat első sorába írjuk a tulajdonságok nevét, míg a többi sorban felsoroljuk a hozzájuk tartozó értékeket (a táblázatos kialakítás azért hasznos, mert az emberi agy könnyebben "emészti" ezt a megjelenítési formát!):
név | éves | nyelvek | születési hely | iskolanév | város | diák(száma) |
Nóra | 13 | angol, német | Budapest | Piros | Budapest | 652 |
Pista | 11 | angol | Sopron | Piros | Budapest | 652 |
Bea | 12 | Szolnok | Kék | Szeged | 541 | |
... | ... | ... | ... | ... | ... | ... |
A táblázatos forma logikus és áttekinthető. Azonban ebben a formában tartogathat számunkra néhány problémát.
Például:
- Nórából és Pistából még a Piros iskolában is sok lehet, hát még az országban máshol. Segítene, de teljes mértékben még
az sem oldaná meg a gondot, ha a vezetéknevüket ismernénk. (Gondoljunk bele, hány Kovács István lehet egy iskolában.)
Megoldás: tároljuk le egy új oszlopban a diákigazolvány számot, mert az minden diáknak különböző. Így az azonos nevű diákokat is meg tudjuk különböztetni egymástól. - Az idő múlásával változik az életkor, így szinte napról-napra követnünk - és javítanunk! -
kellene a táblázatot
Megoldás: nem az életkort, hanem a születési dátumot tartjuk nyilván, így ebből az adatból bármely pillanatban ki tudjuk számítani az aktuális életkort - Az iskolaváltoztatások megváltoztatják a létszámot, ezért ha Pistáék Szegedre költöznek, és ő a budapesti Piros iskola
helyett a szegedi Kék iskolában folytatja a tanulmányait, akkor a táblázatunk máris módosítást igényel.
Megoldás: az egyes iskolákhoz tartozó diákok számát nem rögzítjük, mert a táblázatban meg tudjuk "számlálni", hányszor szerepel mondjuk a budapesti Piros iskola neve
oktatási azonosító | név | nyelvek | születési dátum | születési hely | iskolanév | város |
85697436581 | Nóra | angol, német | 2008.05.01. | Budapest | Piros | Budapest |
65823478915 | Pista | angol | 2010.03.16. | Sopron | Piros | Budapest |
34875651245 | Bea | 2009.06.12. | Szolnok | Kék | Szeged | |
... | ... | ... | ... | ... | ... |
Három problémát is megoldottunk, de vajon tökéletes-e így?
Korántsem, hiszen ha például megváltoztatják az iskola nevét, akkor az összes diáknál meg kellene változatni ezt a tulajdonságot. (Máris érzékelhetjük, hogy ez a táblázat nem csk a diákokról, haenm az iskolákról is tartalmazhat információkat!)
Megoldás: az iskolák adatait emeljük ki a táblázatból és helyezzük át egy másik táblázatba úgy, hogy abban rögzítjük majd az adott iskola OM azonosítóját.
Így a diáktáblázatban az iskola neve helyett az OM azonosító fog szerepelni, tehát, ha az iskola táblában megváltoztatjuk az iskola nevét, az automatikusan azt jelenti, hogy a diák táblában is megváltozik majd az értéke.
Hasonló jellegű problémát érezhetünk még a nyelvek esetében, hiszen Nóra két nyelvet is tanul, Beánál meg egy sem szerepel. Ha a diákokat a tanult nyelvek alapján keresnénk, akkor az ilyen több értékű mező problémát okozhat, vagy ha az adott mező üres mező, akkor szintén. Ezért ezeket az adatokat szintén külön táblákba fogjuk letárolni.
Ezek után nézzük a javított táblázatokat:
Diák táblázat:
oktatási azonosító | név | születési dátum | születési hely | iskola OM azonosítója |
85697436581 | Nóra | 2008.05.01. | Budapest | 789123 |
65823478915 | Pista | 2010.03.16. | Sopron | 789123 |
34875651245 | Bea | 2009.06.12. | Szolnok | 789125 |
... | ... | ... | ... | ... |
Iskola táblázat:
iskola OM azonosítója | iskolanév | város |
789123 | Piros | Budapest |
789125 | Kék | Szeged |
... | ... | ... |
Nyelv táblázat:
|
Nyelvtanulás táblázat:
|
- Hány diák született Budapesten? Ez egy remek példa arra nézve, hogy miért nem kell minden adatot tárolni egy táblázatban. A kérdésre az információt úgy kapjuk meg, hogy a Diák táblázat Születési hely oszlopában megszámláljuk, hányszor szerepel a "Budapest" szó!
- Kik vidékiek? Az előző válaszból logikus magyarázat: ha megszámláljuk, Diák táblázat Születési hely oszlopában hány helyen NEM szerepel a "Budapest" szó,akkor megkapjuk a vidéki tanulók számát!
- Melyik diák, hány éves? Ha az eredeti táblázati formátumot alkalmaztuk volna, akkor naponta át kellene írni azt annak megfelelően, hogy az adott tanuló hány éves azon az aktuális napon. Viszont a javított szerkezet alapján nincs más teendőnk, mint a kérdés feltételekori adott pillanatból kivonjuk a születési dátumot, így megkapjuk a diák éveinek számát!
- Melyik iskolában tanítanak német nyelvet? Itt már egy kicsit nehezebb dolgunk van, mivel látható, hogy a Nyelv táblázat és az Iskola táblázat között nincs közvetlen kapcsolati lehetőség. Azonban, ha követjük a nyíllal jelzett gondolatmenetet, akkor pillanatok alatt megtudjuk a kérdésre a választ:
- Tudjuk a német nyelv azonosítóját a Nyelv táblázatból (3),
- a Nyelvtanulás táblázatban megkeressük, melyik diák oktatási azonosítójához tartozik hozzá a 3-as érték,
- a kapott oktatási azonosítókat megkeressük a Diák táblázat<,/span>ban
- ahol is az adott diáknál megtudhatjuk, melyik iskolai OM azonosítóval rendelkezik,
- és innen már csak egy ugrás, hogy az Iskola táblázatban megnézzük az iskola nevét.
Hogyan alakítsuk ki ezeket a táblázatokat?
A fenti példából általános szabályként az alábbiakat tudjuk ajánlani:
- Minden táblában legyen egy olyan oszlop, melynek segítségével minden sort külön-külön egyértelműen azonosítani tudunk. Ezt nevezik kulcsnak.
(Az ábrán ezt az oszlopnevet jelölik "sárga színű kulccal")
Például egy iskolában sok Kovács János járhat, mivel ez egy igen gyakori név. Amennyiben nem azonosítjuk valamilyen egyedi kulcsazonosítóval, akkor hogyan tudjuk eldönteni, melyik Kovács János adatát gyűjtjük ki a táblázatból? Ilyen kulcsazonosító bármi lehet, akár diákigazolvány szám, szem.ig. szám,...de lehet ez akár egy sorszám is. - Az adattáblák között a kulcsok segítségével teremtjük meg a kapcsolatot. Az alábbi rajzban a mintapélda adatbázis-kapcsolatát mutatja be.
Egy adattáblában azonban nem csak a saját kulcsa látható, hanem a másik tábla kulcsmezője is. Ennek segítségével teremtjük meg a kapcsolatot a két tábla között. (Az Iskola tábla iskola OM azonositója bekerül a Diáktáblába is. Ekkor azonban a neve: idegen kulcs. Azt, hogy mi a szerepe ilyenkor, az ábra alatt tisztázzuk!
Vegyük észre, hogy az adattáblák kapcsolatának meghatározásánál azt kell eldöntenünk, hogy melyik azonosítóját kell beírnunk a másik táblába tulajdonságként.
Iskola-diák: Egy iskolába járhat-e több diák? Egy diák járhat-e több iskolába? Az első kérdésre "igen" a válasz, a másodikra "nem". Ezért a Diák táblába kell felvennünk tulajdonságként az iskola tábla azonosítóját (iskola OM azonositó).
Az 1-es és a ∞ magyarázata: 1 iskolába járhat több (∞), de "visszafelé" már nem igaz: egy diák nem járhat több iskolába.
Diák-Nyelv: Egy diák tanulhat-e több nyelvet? Egy nyelvet tanulhat-e több diák? Mindkét kérdésre "igen"-nel válaszolunk. Ilyen, "több a többhöz kapcsolat" a relációs adatbázisban nem szerepelhet, ezért egy új táblát kell készítenünk (Nyelvtanulás), amelybe a két másik tábla azonosítóiból alkotott párokat írjuk be. Az ilyen típusú táblákat nevezzük kapcsoló táblának.
Ha valaki a fenti gondolatmenet szerint alakítja át a táblázatát, akkor egy több táblából álló, jól használható szerkezethez jut, amelyet relációs adatmodellnek neveznek.
Azt a folyamatot pedig, amíg az "egy táblából" eljutunk a kapcsolatokkal kialakított "több tábláig", normalizálásnak nevezünk.
A normalizálás folyamatában arra kell törekednünk, hogy
- Minden adattáblában legyen olyan adat, amely azonosító tulajdonsággal rendelkezik (pld.: oktatási azonosító, személyi igazolványszám, adóigazolvány szám, vagy akár egy sorszám, stb...)
- Ne tároljunk olyan értéket, amely a többi adat alapján meghatározható! (pld.: diákok száma)
- Ne tároljunk olyan értéket, amely minden beavatkozás nélkül, automatikusan változik! (pld.: diákok életkora -> cseréljük át olyanra, ami állandó, és ebből számítás útján megkaphatjuk a kívánt eredményt
- Ne legyen olyan oszlop, ahol egy cellában több érték is szerepelhet! (pld.: nyelv)
Gyakorló feladatok
Tartsd be a normalizálásra vonatkozó utasításokat!
- Közösen alakítsuk ki annak az adatbázisnak a relációs adatmodelljét, amiben személyeknek a nevét és email-címét tároljuk! Rajzoljuk le! Ne feledkezzünk meg a táblák közötti kapcsolatok kiépítéséről!
- Készítsük el közösen annak az adatbázisnak a relációs adatmodelljét (kapcsolatokkal együtt), amiben egy könyvtár könyveit tároljuk le. Az adatbázisban a következő elemeket szeretnénk tárolni:
- szerző neve (családi és utónév külön)
- könyv címe
- témakör (pl. szépirodalom, ismeretterjesztő, gyerekirodalom, stb...)
- Önálló feladat: készítsd el és töltsd is fel azt az adatbázist, amelyik a magyarországi királyok és egyenesági leszármazottaik nevét tárolja 1000 és 1500 között. Tárolandó adatok:
- uralkodó neve
- mettől meddig volt a trónon
- fiú gyemek neve
- leány gyermek neve
- Önállóan alakítsd ki azt a relációs adatmodellt, amelyben egy borpincészet termékeit tárolod. Tárolandó adatok:
- bor neve
- évjárat
- hány éves a bor?
- ára (külön literre és hektoliterre)
- típus: vörös, fehér, rosé
- a szőlészet melyik sorából származik a szőlő?