Normalisointi
- Pyritään vähentämään tietojen ylimäärää ja tästä aiheutuvia
ongelmia tietojen lisäämisessä, poistamisessa ja
päivityksessä.
- Lisätään rakenteiden selkeyttä, yhtenäisyyttä ja
laajennettavuutta
- Normaalimuotoja on viisi varsinaista ja Boyce-Coddin
normaalimuoto
- Käytännössä vain kolme ensimmäista normaalimuotoa ovat
merkityksellisiä
- Normaalimuodot suosivat ympäristöjä, joissa tietoja
päivitetään usein.
- Hakeminen vaatii enemmän tehoa kuin normalisoimattomassa
ratkaisussa koska tiedot joudutaan hakemaan useammasta
relaatiosta
- Normaalimuodot syntyvät suht automaattisesti jos
noudatetaan seuraavia sääntöjä:
- Kohteen yhteyteen tallennetaan vain kohteeseen
välittömästi liittyviä tietoja
- Kunkin tiedon päivitys tapahtuu vain yhteen
paikkaan
Ei normaalimuotoinen tietokanta
Myynti
| Piiri |
Myyja |
Tuote |
| P1 Länsi |
M1 Pirkko Puoti |
T1 23500, T2 17200, T4 12300 |
| P1 Länsi |
M2 Heikki Helppo |
T1 26800, T4 19300 |
| P2 Itä |
M3 Kaija Kauppa |
T1 16200, T3 39200 |
| P2 Itä |
M4 Rauno Ratsu |
T3 16500, T4 17200, T5 19100 |
Virheet
- Kenttien arvot eivät ole jakamattomia
Myynti
| PiiriID |
Piiri |
MyyjaID |
Myyja |
Tuote1ID |
Tuote1myynti |
Tuote2ID |
Tuote2myynti |
Tuote3ID |
Tuote3myynti |
| P1 |
Länsi |
M1 |
Pirkko Puoti |
T1 |
23500 |
T2 |
17200 |
T4 |
12300 |
| P1 |
Länsi |
M2 |
Heikki Helppo |
T1 |
26800 |
T4 |
19300 |
| P2 |
Itä |
M3 |
Kaija Kauppa |
T1 |
16200 |
T3 |
39200 |
| P2 |
Itä |
M4 |
Rauno Ratsu |
T3 |
16500 |
T4 |
17200 |
T5 |
19100 |
Virheet
- Riveillä on eri määrä tietoa. Ei voida tietää etukäteen montaako
tuotetta kukin myyjä tulee myymään.
Myynti
| PiiriID |
Piiri |
MyyjaID |
Myyja |
TuoteID |
Myynti |
| P1 |
Länsi |
M1 |
Pirkko Puoti |
T1 |
23500 |
| P1 |
Länsi |
M1 |
Pirkko Puoti |
T2 |
17200 |
| P1 |
Länsi |
M1 |
Pirkko Puoti |
T4 |
12300 |
| P1 |
Länsi |
M2 |
Heikki Helppo |
T1 |
26800 |
| P1 |
Länsi |
M2 |
Heikki Helppo |
T4 |
19300 |
| P2 |
Itä |
M3 |
Kaija Kauppa |
T1 |
16200 |
| P2 |
Itä |
M3 |
Kaija Kauppa |
T3 |
39200 |
| P2 |
Itä |
M4 |
Rauno Ratsu |
T3 |
16500 |
| P2 |
Itä |
M4 |
Rauno Ratsu |
T4 |
17200 |
| P2 |
Itä |
M4 |
Rauno Ratsu |
T5 |
19100 |
Virheet
- Taulun perusavaimeksi muodostuu yhdistetty avain PiiriID, MyyjaID ja
TuoteID -kentistä. Kaikkien muiden kenttien pitäisi riippua taulun
avaimesta. Piiri-kenttä riippuu kuitenkin vain PiiriID-kentästä eikä koko perusavaimesta.
Myyja-kenttä riippuu vain MyyjaID-kentästä eikä koko perusavaimesta.
-
Taulussa on myös havaittavissa aivan turhaa toistoa josta pitää päästä eroon.
- Mitä jos tulee uusi myyjä, joka ei ole vielä myynyt mitään? Miten hänen tietonsa
tallennetaan järjestelmään? (insertion anomaly)
- Mitä jos Pirkko Puoti ja Heikki Helppo saavat potkut? Poistamalla heidän
tietonsa järjestelmästä menetetään myös Länsi-piiri. (deletion anomaly)
- Mitä jos Pirkko Puoti siirretään uuteen piiriin? Täytyy muistaa
päivittää useiden rivien tiedot samalla kertaa. (modification anomaly)
Myynti
| MyyjaID |
Myyja |
TuoteID |
Myynti |
| M1 |
Pirkko Puoti |
T1 |
23500 |
| M1 |
Pirkko Puoti |
T2 |
17200 |
| M1 |
Pirkko Puoti |
T4 |
12300 |
| M2 |
Heikko Helppo |
T2 |
26800 |
| M2 |
Heikko Helppo |
T4 |
19300 |
| M3 |
Kaija Kauppa |
T1 |
16200 |
| M3 |
Kaija Kauppa |
T3 |
39200 |
| M4 |
Rauno Ratsu |
T3 |
16500 |
| M4 |
Rauno Ratsu |
T4 |
17200 |
| M4 |
Rauno Ratsu |
T5 |
19100 |
Piiri
| PiiriID |
Piiri |
MyyjaID |
Myyja |
| P1 |
Länsi |
M1 |
Pirkko Puoti |
| P1 |
Länsi |
M2 |
Heikki Helppo |
| P2 |
Itä |
M3 |
Kaija Kauppa |
| P2 |
Itä |
M4 |
Rauno Ratsu |
Virheet
- Edelleen jää epäselväksi, että minne pitäisi uuden myyjän tiedot lisätä.
Edelleen ongelmia myös päivittämisessä ja poistamisessa.
- Edelleen turhaa toistoa
Myynti
| MyyjaID |
TuoteID |
Myynti |
| M1 |
T1 |
23500 |
| M1 |
T2 |
17200 |
| M1 |
T4 |
12300 |
| M2 |
T2 |
26800 |
| M2 |
T4 |
19300 |
| M3 |
T1 |
16200 |
| M3 |
T3 |
39200 |
| M4 |
T3 |
16500 |
| M4 |
T4 |
17200 |
| M4 |
T5 |
19100 |
Piiri
| PiiriID |
Piiri |
| P1 |
Länsi |
| P2 |
Itä |
Myyja
| MyyjaID |
Myyja |
PiiriID |
| M1 |
Pirkko Puoti |
P1 |
| M2 |
Heikki Helppo |
P1 |
| M3 |
Kaija Kauppa |
P2 |
| M4 |
Rauno Ratsu |
P2 |
- Nyt jokaisen asian päivittäminen, poistaminen tai lisääminen tapahtuu
vain yhteen paikkaan.
- Jokaisessa taulussa (kohteessa) on vain siihen liittyviä tietoja.
Mitä jos jokaisesta tuotteesta olisi tallennettuna myös tuotteen nimi?
Myynti
| MyyjaID |
TuoteID |
TuoteNimi |
Myynti |
| M1 |
T1 |
Pölynimuri |
23500 |
| M1 |
T2 |
Linkkuveitsi |
17200 |
| M1 |
T4 |
Tietokone |
12300 |
| M2 |
T2 |
Linkkuveitsi |
26800 |
| M2 |
T4 |
Tietokone |
19300 |
| M3 |
T1 |
Pölynimuri |
16200 |
| M3 |
T3 |
Kirjahylly |
39200 |
| M4 |
T3 |
Kirjahylly |
16500 |
| M4 |
T4 |
Tietokone |
17200 |
| M4 |
T5 |
Mopo |
19100 |
Virheet
- Taas on havaittavissa toistoa.
- Mitä jos tuotetta ei ole myyty ollenkaan? Missä sen tiedot ovat silloin?
Vastaavanlaiset ongelmat ilmenevät myös poistamisen ja päivittämisen kanssa.
Myynti
| MyyjaID |
TuoteID |
Myynti |
| M1 |
T1 |
23500 |
| M1 |
T2 |
17200 |
| M1 |
T4 |
12300 |
| M2 |
T2 |
26800 |
| M2 |
T4 |
19300 |
| M3 |
T1 |
16200 |
| M3 |
T3 |
39200 |
| M4 |
T3 |
16500 |
| M4 |
T4 |
17200 |
| M4 |
T5 |
19100 |
Tuote
| TuoteID |
TuoteNimi |
| T1 |
Pölynimuri |
| T2 |
Linkkuveitsi |
| T3 |
Kirjahylly |
| T4 |
Tietokone |
| T5 |
Mopo |
Ensimmäinen normaalimuoto (1NM)
- Relaatio on ensimmäisessä normaalimuodossa (1NM), jos sen
jokaisen attribuutin arvojoukko koostuu vain atomisista
arvoista eli yksinkertaisista, jakamattomista, arvoista.
- Jokaisella rivillä ja jokaisessa sarakkeessa pitää olla sama määrä tietoa
Toinen normaalimuoto (2NM)
- Relaatio on toisessa, jos se on ensimmäisessä
normaalimuodossa ja sen jokainen attribuutti, joka ei esiinny
avainehdokkaassa, on funktionaalisesti täysin riippuva tästä
avainehdokkaasta.
Kolmas normaalimuoto (3NM)
- Relaatio on kolmannessa normaalimuodossa, jos se on toisessa
normaalimuodossa ja mikään sen muuttuja-attribuutti ei ole
transitiivisesti riippuva mistään relaation avainehdokkaasta
Boyce-Codd normaalimuoto
- Määräävän ominaisuuden esiintyminen taulussa on kielletty
jollei kyseessä ole avain
Neljäs normaalimuoto (4NM)
- Koskee pelkästään tunnistetietoja sisältäviä tauluja joilla
esitetään eri ominaisuuksien välisiä riippuvuuksia.
- Taulukossa ei saa esiintyä kahden tai useamman ominaisuuden
moniarvoista riippuvuutta, jos nämä ominaisuudet ovat keskenään
riippumattomia.
Viides normaalimuoto (5NM)
Jos sama informaatio voidaan esittää tauluilla, joiden
asteluku on alempi, on käytettävä näitä tauluja.
- Asteluku tarkoittaa sarakkeiden lukumäärää
Kolmesta viimeisestä normaalimuodosta
- Tilanteet, joissa ongelmien oletetaan esiintyvän, ovat hieman
keinotekoisia
- Normaalimuotojen vastainen toiminta on vaikeasti
ymmärrettävää. Normalisoidut muodot syntyvät luonnostaan
- Mahdolliset ongelmat johtuvat sovellusalueen tuntemisen ja
ymmärtämisen vaikeudesta, ei normalisoinnista
- Jos ongelmia kaikesta huolimatta syntyy, niistä selviää
terveellä järjellä eikä normalisointisäännöillä.
- Kolme viimeistä normaalimuotoa voidaan yleensä unohtaa.
KOHTEEN YHTEYTEEN TALLENNETAAN VAIN KOHTEESEEN
VÄLITTÖMÄSTI LIITTYVIÄ TIETOJA
KUNKIN TIEDON PÄIVITYS TAPAHTUU VAIN YHTEEN PAIKKAAN
Tietokannanhallintajärjestelmien perusominaisuuksia
Tietoturva
- taulun omistajan (owner) määrittely (authorization)
- tietokantakäsittelyn valtuuksien myöntäminen (grant)
oikeuksin delegoida valtuus edelleen (with grant option)
- valtuuksien epääminen (revoke)
- myös näkymien käsittelyyn voidaan myöntää oikeudet
Elvytys
- varmuuskopio (backup copy)
kopio koko tietokannasta tiettynä ajanhetkenä.
pystytään palauttamaan (restore) tietty aikaisempi tietokannan
tilanne
- lokitiedosto (log file)
voidaan siirtyä tietokannan tilasta toiseen, ajallisesti eteen
tai taaksepäin
Jokaisen tietokantaan tehtävän muutoksen yhteydessä kirjoitetaan
lokitiedostoon tietueen esi- ja jälkivedokset
- esivedos on kopio tietueesta ennen päivitystä
- jälkivedos on kopio tietueesta päivityksen jälkeen
- lisäyksen yhteydessä syntyy vain jälkivedos
- poiston yhteydessä syntyy vain esivedos
Tapahtumat (transaktio)
- lokitiedostoa käytetään mahdollistamaan palautuminen
keskeytyneestä transaktiosta
- transaktio toteutetaan kokonaisuudessaan tai ei
ollenkaan (atomicity).
- tietokanta on ennen ja jälkeen transaktion ristiriidattomassa
(consistent) tilassa
- eristyvyys (isolation)
transaktion aiheuttamat muutokset eivät saa näkyä muille ennen
kuin koko transaktio on hyväksytty (commit)
- pysyvyys (durability)
Kun tapahtuma on vahvistettu (commit), tapahtuman tulokset eivät häviä
missään olosuhteissa.
- keskeytyneen (aborted) transaktion tietokantaan tekemät
muutokset pitää peruuttaa (rollback)
- samanaikaisuuden käsittely (concurrency control)
samanaikaiset transaktiot eivät saa sekoittua keskenään
Yhteiskäyttö
- useampi ihminen käyttää tietokantaa samanaikaisesti josta voi
seurata ongelmia jos yhteiskäyttöön ei ole varauduttu.
kadonneet päivitykset
| Aika | Matti | Maija | Tilin saldo |
| 1 | Lukee tilin saldon | | 1000 |
| 2 | | | 1000 |
| 3 | | Lukee tilin saldon | 1000 |
| 4 | Nostaa 200 euroa | | 1000 |
| 5 | | | 1000 |
| 6 | | Nostaa 300 euroa | 1000 |
| 7 | Kirjoittaa uuden saldon | | 1000 |
| 8 | | | 800 |
| 9 | | Kirjoittaa uuden saldon | 800 |
| 10 | | | 700 |
- rajoitetaan muiden käyttäjien mahdollisuuksia jonkin
resurssin käytössä
- pessimistinen tapa eli lukitukset
tietue lukitaan koko toimintoketjun ajaksi
muilta käyttäjiltä
| Aika | Matti | Maija | Tilin saldo |
| 1 | Pyytää tilitietoja | | 1000 |
| 2 | Lukitsee tilin | | 1000 |
| 3 | Lukee tilin saldon | Pyytää tilitietoja, ei saa | 1000 |
| 4 | Nostaa 200 euroa | | 1000 |
| 5 | | | 1000 |
| 6 | | | 1000 |
| 7 | Kirjoittaa uuden saldon | | 800 |
| 8 | | | 800 |
| 9 | Poistaa lukituksen | | 800 |
| 10 | | Lukitsee tilin | 800 |
| 11 | | Lukee tilin saldon | 800 |
| 12 | | | 800 |
| 13 | | Nostaa 300 euroa | 800 |
| 14 | | | 800 |
| 15 | | | 800 |
| 16 | | Kirjoittaa uuden saldon | 500 |
| 17 | | Poistaa lukituksen | 500 |
Pessimistisessä lukituksessa käytetään eritasoisia lukituksia
- S-lukitus eli jaettu lukitus (shared)
lukon omistaja ja muut voivat lukea sivun tietoja, mutta eivät
päivittää niitä. Muut saavat S- ja U-lukituksia tälle
sivulle.
- U-lukitus eli päivityslukitus (update)
lukituksen omistaja voi lukea tietoa ja aikoo päivittää sitä.
Kukaan muu ei voi saada U- eikä X-lukitusta. Ennen päivitystä
lukon omistaja odottaa, ettei muilla ole sivulle S-lukitusta.
Sitten hän pyytää X-lukituksen ja suorittaa päivityksen.
- X-lukitus eli poissulkeva (exclusive)
lukituksen omistaja voi lukea tai päivittää lukittua dataa.
Kukaan muu ei voi saada lukitusta.
- lukkiumat (deadlocks)
| Aika | Matti | Maija | Tilin saldo |
| 1 | Pyytää tilitietoja | | 1000 |
| 2 | Lukitsee tilin (jaettu) | | 1000 |
| 3 | Lukee tilin saldon | Pyytää tilitietoja | 1000 |
| 4 | Yrittää ottaa kirjoituslukituksen | Lukitsee tilin (jaettu) | 1000 |
| 5 | | Lukee tilin saldon | 1000 |
| 6 | | Yrittää ottaa kirjoituslukituksen | 1000 |
| 7 | | | 1000 |
| 8 | | | 1000 |
- Ennaltaehkäisy
- Aikavalvonta
- optimistinen tapa eli aikaleimat
tietuetta päivitettäessä tutkitaan onko tietueessa "käyty" sen
jälkeen kun se otettiin muutettavaksi (aikaleimat)
| Aika | Matti | Maija | Tilin saldo |
| 1 | Lukee tilin saldon | | 1000 |
| 2 | | | 1000 |
| 3 | | | 1000 |
| 4 | Nostaa 200 euroa | | 1000 |
| 5 | | Lukee tilin saldon | 1000 |
| 6 | | | 1000 |
| 7 | Kirjoittaa uuden saldon | | 1000 |
| 8 | | Yrittää nostaa 200 euroa | 800 |
| 9 | | Ei onnistu. Palaa alkuun | 800 |