Normalisointi

Normalisoinnilla pyritään vähentämään tietojen toistamista ja tästä aiheutuvia ongelmia tietojen lisäämisessä, poistamisessa ja päivityksessä. Normalisoinnilla myös lisätään rakenteiden selkeyttä, yhtenäisyyttä ja laajennettavuutta. Normalisoinnin teoreettisempi tarkastelu jätetään käsiteltäväksi tietokantakursseille.

Normaalimuodot suosivat ympäristöjä, joissa tietoja päivitetään usein. Tämä johtuu siitä, että normalisointi tapahtuu jakamalla relaatioita useampaan relaatioon, ja tietojen hakeminen useammasta relaatiosta on raskaampaa kuin yhdestä. Useampaan relaatioon jakaminen tapahtuu ilman, että mitään informaatiota hävitetään. Useampaan tauluun jakamisen jälkeen täytyy siis pystyä näiden uusien taulujen pohjalta yhdistelemään sama informaatio, joka löytyi alkuperäisestä taulusta. Jakaminen edellyttää aina viiteavaimien luomista yhdistämään tauluja.

Normalisointi tapahtuu suhteellisen automaattisesti, jos noudatetaan kahta sääntöä:

Atomisella arvolla tarkoitetaan, että jokainen attribuutti sisältää vain yhden arvon eikä listoja tms. Jokaisen kentän pitää sisältää puhtaasti tekstimuotoista tietoa, numeraalista tietoa tai muiden perustietotyyppien mukaista tietoa mutta ei näitä sekaisin. Normalisointi kieltää myös toistuvat ryhmät.

TilausNro

AsiakasNro

Pvm

Tilaus

1

1

1.1.2000

1 kiintolevy, 1 prosessori, 3 hiirtä

2

2

2.1.2000

1 tietokone

3

3

3.1.2000

5 näyttöä, 3 koteloa

4

4

4.1.2000

2 näytönohjainta, 3 muistikampaa (128MB)

5

3

5.1.2000

1 digitaalikamera, 1 skanneri

Esimerkkitaulu ei ole normalisoitu, koska tilaus-kentässä on listattu useita eri tietoja. Tuotekohtaisten myyntiraporttien luominen tällaisen taulun pohjalta olisi äärimmäisen hankalaa. Taulua voidaan korjata lisäämällä siihen sarakkeita mutta silloinkaan ei saada aikaan hyvää lopputulosta.

TilausNro

AsiakasNro

Pvm

Lkm1 Tuote1

Lkm2 Tuote2

Lkm Tuote3

1

1

1.1.2000

1 Kiintolevy
1 prosessori
3 hiiri

2

2

2.1.2000

1 Tietokone

3

3

3.1.2000

5 Näyttö
3 kotelo

4

4

4.1.2000

2 Näytönohjain
3 muistikampa

5

3

5.1.2000

1 Digitaalikamera
1 skanneri

Riveillä on nyt eri määrä tietoja, mikä sotii suoraan vastaan relaatiomallin periaatteita. Etukäteen ei pysty mitenkään päättelemään, kuinka monta tuotetta kukakin asiakas haluaa tilata. Pitäisi siis varautua pahimpaan mahdolliseen tilanteeseen ja tämäkään ei välttämättä jonain päivänä riitä. Joka tapauksessa useimmissa tapauksissa monta kenttää jäisi aivan turhaan tyhjäksi. Rakenne hukkaa siis paljon tilaa. Raporttien muodostaminen on myös hyvin hankalaa, koska kaikki sarakkeet pitäisi osata erikseen käsitellä ja yhdistää, jotta saataisiin selvitettyä, kuinka paljon jotakin tiettyä tuotetta on myyty.

Ongelmat saadaan korjattua, jos tyydymme käsittelemään vain yhden tuotteen tilauksen jokaisella rivillä. Jos asiakas tilaa useampia tuotteita, hänen tilaustaan kohti tulee vain useampia rivejä.

TilausNro

TilausTuote

AsiakasNro

Pvm

Lkm Tuote

1

1

1

1.1.2000

1 kiintolevy

1

2

1

1.1.2000

1 prosessori

1

3

1

1.1.2000

3 hiiri

2

1

2

2.1.2000

1 tietokone

3

1

3

3.1.2000

5 näyttö

3

2

3

3.1.2000

3 kotelo

4

1

4

4.1.2000

2 näytönohjain

4

2

4

4.1.2000

3 muistikampa

5

1

3

5.1.2000

1 digitaalikamera

5

2

3

5.1.2000

1 skanneri

Tauluun täytyi lisätä yksi uusi kenttä, tilaustuote, joka kertoo, monesko kuhunkin tilaukseen liittyvä tuote on kyseessä kussakin tietueessa (rivillä). Tilausnumero- ja tilaustuote-kentät muodostavat yhdessä taulun perusavaimen.

Jokaisen taulussa olevan kentän, joka ei ole avainehdokas, täytyy suoraan liittyä taulun avaimeen, joka taas muodostuu yhdestä tai useammasta kentästä.Tauluun pitää siis tallentaa vain sellaista tietoa, joka liittyy yhteen asiaan tai kohteeseen. Perusavain määrittelee tämän yhden kohteen. Lisätään edelliseen esimerkkiin vielä tuotetta kuvaava tuoteID-kenttä.

TilausNro

TilausTuote

AsiakasNro

Pvm

Lkm

TuoteID

Tuote

1

1

1

1.1.2000

1

1

Kiintolevy

1

2

1

1.1.2000

1

2

Prosessori

1

3

1

1.1.2000

3

3

Hiiri

2

1

2

2.1.2000

1

4

Tietokone

3

1

3

3.1.2000

5

5

Näyttö

3

2

3

3.1.2000

3

6

kotelo

4

1

4

4.1.2000

2

7

näytönohjain

4

2

4

4.1.2000

3

8

muistikampa

5

1

3

5.1.2000

1

9

digitaalikamera

5

2

3

5.1.2000

1

10

skanneri

Taulun avaimen muodostavat tilausnro- ja tilaustuote-kentät. Kaikkien taulun muiden kenttien pitäisi siis liittyä suoraan tähän avaimeen. AsiakasNro- ja Pvm-kentät riippuvat kuitenkin vain Tilausnro-kentästä eivätkä koko avaimesta.

Jaetaan taulu kahdeksi tauluksi. Ensimmäiseen tauluun sijoitetaan kaikki yhteen tilaukseen liittyvät tiedot eli TilausNro, AsiakasNro ja Pvm. Toiseen tauluun sijoitetaan kaikki tilattavaan tuotteeseen liittyvät tiedot eli TilausTuote, Lkm, TuoteID ja Tuote. Taulua jakamalla ei kuitenkaan saa hukata informaatiota, joten TilausNro-kenttä jää myös tilattavia tuotteita koskevaan tauluun viiteavaimeksi yhdistämään tietty tilattu tuote aina tiettyyn tilaukseen.

TilausNro

AsiakasNro

Pvm

1

1

1.1.2000

2

2

2.1.2000

3

3

3.1.2000

4

4

4.1.2000

5

3

5.1.2000

TilausNro

Tilaustuote

Lkm

TuoteID

Tuote

1

1

1

1

kiintolevy

1

2

1

2

prosessori

1

3

3

3

hiiri

2

1

1

4

tietokone

3

1

5

5

näyttö

3

2

3

6

kotelo

4

1

2

7

näytönohjain

4

2

3

8

muistikampa

5

1

1

9

digitaalikamera

5

2

1

10

skanneri

Kaikkien kenttien, jotka eivät kuulu avaimeen, täytyy olla yhtä lailla itsenäisiä ja riippumattomia muista kentistä. Esimerkkitauluissamme TuoteID- ja Tuote-kenttien välillä on selkeä riippuvuus. Taulu täytyy taas jakaa osiin.

TuoteID

Tuote

1

Kiintolevy

2

Prosessori

3

Hiiri

4

Tietokone

5

Näyttö

6

Kotelo

7

Näytönohjain

8

Muistikampa

9

Digitaalikamera

10

Skanneri

TilausNro

Tilaustuote

Lkm

TuoteID

1

1

1

1

1

2

1

2

1

3

3

3

2

1

1

4

3

1

5

5

3

2

3

6

4

1

2

7

4

2

3

8

5

1

1

9

5

2

1

10

Riippuvuudet poistamalla päästään eroon monesta mahdollisesta ongelmasta, joita esiintyy tietoja lisätessä, päivitettäessä ja poistettaessa. Esimerkiksi jos täytyisi lisätä 50 tilausta, joista kaikki koskevat hiiriä, niin jakamattomassa tapauksessa täytyisi jokaisen tilauksen kohdalle lisätä tieto tuoteID:stä (3) sekä tuotteen nimestä (“hiiri”). Tästä aiheutuisi siis aivan turhaa toistoa. Jos myöhemmin täytyisi päivittää hiiri-tuotteen nimeksi esim. “Logitech hiiri”, täytyisi päivittää jokainen tilausrivi, joka kohdistuu tähän tuotteeseen. Normalisoidussa versiossa riittäisi vain yhden rivin muutos. Edelleen jos täytyisi poistaa kaikki tietyn vuoden tilaukset ja sattumalta hiiriä ei olisi tilattu kuin tänä kyseisenä vuotena, niin samalla, kun tilaukset poistuisivat, häviäisi myös kokonaan tieto tästä hiiri-tuotteesta.

Normaalimuotojen vastainen toiminta on vaikeasti ymmärrettävää, joten normalisoidut muodot syntyvät luonnostaan. Mahdolliset ongelmat johtuvat sovellusalueen tuntemisen ja ymmärtämisen vaikeudesta, eivät normalisoinnista. Jos ongelmia kaikesta huolimatta syntyy, niistä selviää terveellä järjellä. Pääasia on muistaa aiemmin mainitut kaksi sääntöä tietokantatauluja muovaillessa:

Kurssimateriaalien käyttäminen kaupallisiin tarkoituksiin tai opetusmateriaalina ilman lupaa on ehdottomasti kielletty!
http://appro.mit.jyu.fi/doc/tiedonhallinta/normalisointi/index0.html
© Petri Heinonen (peheinon@mit.jyu.fi)<URL: http://www.mit.jyu.fi/peheinon/>
2003-11-06 13:55:41