HAAGA-HELIA Heti-09 1 (27) Normalisointi Normalisointi... 2 Tavoitteet... 2 Attribuuttien väliset riippuvuudet... 4 1) Funktionaalinen vai Moniarvoinen riippuvuus?... 4 2) Täydellinen vai Osittainen riippuvuus?... 6 3) Suora vai Epäsuora riippuvuus?... 7 1. Normaalimuoto... 9 Miksi 1NF?... 12 2. Normaalimuoto... 13 Miksi 2NF?... 16 3. Normaalimuoto... 17 Miksi 3NF?... 20 Normalisointiprosessi... 21 3NF = Normalisoinnin tavoitetaso!... 22 Normalisointiesimerkki: Kurssihallinto... 23
HAAGA-HELIA Heti-09 2 (27) Normalisointi (Normalization) Tavoitteet Relaatiotietokannasta saadaan relaatiomallin mukainen Relaatioiden ja kohdealueen objektien välille pyritään saamaan läheinen rakenteellinen vastaavuus Minimoidaan tietokantaan sisältyvää toistoa Tietokannan päivitysten (lisäys, muutos, poisto) yhteydessä mahdollisten ristiriitaisuuksien välttäminen Relaatioiden riveistä pyritään saamaan lisäysten, poistojen ja muutosten kannalta mahdollisimman itsenäisiä kokonaisuuksia Tietokannan mahdollisimman suuri rakenteellinen joustavuus tulevien muutosten mahdollistamiseksi
HAAGA-HELIA Heti-09 3 (27) Normalisointi perustuu normaalimuotoihin (normal form) Normaalimuodot ovat asteittain tiukkenevia ehtoja, jotka relaatioiden on täytettävä Relaatio on tietyssä normaalimuodossa, mikäli se täyttää tietyt rajoitusehdot Kaikki relaatiot 1NF 2NF 3NF BCNF 4NF 5NF 3.normaalimuoto on normalisoinnin 'minimitaso' / tavoitetaso Ylempiä normaalimuotoja käsitellään syventävillä kursseilla
HAAGA-HELIA Heti-09 4 (27) Attribuuttien väliset riippuvuudet 1) Funktionaalinen vai Moniarvoinen riippuvuus? Vastaako tiettyä attribuuttin a arvoa yksi vai useampi attribuutin b arvo Esim. vastaako attribuutin opiskelijanumero arvoa 1234 yksi vai useampi attribuutin sukunimi arvo? Funktionaalinen riippuvuus Jos attribuutin A arvo määrää yksikäsitteisesti attribuutin B arvon niin voidaan sanoa että B on funktionaalisesti riippuva A:sta A määrää B:n funktionaalisesti A -> B Vrt. Funktion käsite: funktio palauttaa aina yhden arvon Esim: Henkilötunnus -> hlo_nimi Rekisterinumero -> auton merkki Yleistys: A, B -> C Esim: Tilausno, tuoteno -> tilausmäärä Projektino, henkilono, kk, vuosi -> työajankäyttö
HAAGA-HELIA Heti-09 5 (27) Moniarvoinen riippuvuus Jos attribuutin A arvoon voi liittyä useita attribuutin B arvoja A ->> B Esim. projektino ->> henkilono osastono ->> projektino Yhteenveto: funktionaalinen / moniarvoinen riippuvuus Funktionaalinen riippuvuuden X -> Y voimassaolo ei merkitse funktionaalisen riippuvuuden Y -> X voimassaoloa Riippuvuus voi olla (ja yleensä on) Toisesta suunnasta funktionaalinen Toisesta suunnasta moniarvoinen Esim: Henkilötunnus <<--> hlön nimi Rekisterinumero <<--> auton merkki
HAAGA-HELIA Heti-09 6 (27) 2) Täydellinen vai Osittainen riippuvuus? Onko jokainen pääavaimen attribuutti mukana riippuvuudessa? Osittainen riippuvuus Pääavaimen osa riittää identifioiman osan relaation avaimeen kuulumattomista attribuuteista Esim. Tilausno, tuoteno --> tuotenimi, tilaus_maara Täydellinen riippuvuus Kaikki relaation avaimeen kuulumattomat attribuutit määräytyvät koko pääavaimen perusteella Esim. Tuoteno --> tuotenimi Tilausno, tuoteno --> tilaus_maara Huom! Osittaista riippuuvuutta on tarpeen tutkia vain, kun pääavain koostuu useammasta kuin yhdestä attribuutista!
HAAGA-HELIA Heti-09 7 (27) 3) Suora vai Epäsuora riippuvuus? Määrääkö attribuutti A attribuutin C suoraan vai välillisesti attribuutin B kautta Epäsuora eli Transitiivinen riippuvuus attribuutti C on transitiivisesti riippuva attribuutista A, jos ja vain jos A -> B ja B -> C Esim. Henkilötunnus -> hlo_nimi, os_tunnus, os_nimi Suora riippuvuus Attribuutti A määrää attribuutin C suoraan, (ilman välittäviä attribuutteja) Esim. Henkilötunnus -> hlo_nimi, os_tunnus Os_tunnus -> os_nimi
HAAGA-HELIA Heti-09 8 (27) Normalisoinnissa tavoitellaan riippuvuuksia, jotka ovat Funktionaalisia Täydellisiä Suoria
HAAGA-HELIA Heti-09 9 (27) 1. Normaalimuoto 1NM (1 Normal Form, 1NF) Relaatio on 1. normaalimuodossa jos (ja vain jos) sen jokainen arvoalue sisältää ainoastaan atomaarisia arvoja ts. attribuuttia ei voi jakaa mielekkäisiin osiin Relaation on oltava kaksiulotteinen: 1. Relaatiossa ei saa olla toistuvia attribuutteja Moniarvoiset attribuutit on purettava omiksi relaatioikseen 2. Relaation jokainen attribuutti on jakamaton kokonaisuus
HAAGA-HELIA Heti-09 10 (27) Esim. TUTTAVA (tuttava_id, tut_nimi, tut_vuosi) TAPAAMINEN1 (tapaamis_id, paikan_nimi, pvm, al_aika, osoite, tuttava_id1, tuttava_id2, tuttava_id3,, tuttava_id10) TAPAAMINEN2 (tapaamis_id, paikan_nimi, pvm, al_aika, osoite, tuttava_lista) TUTTAVA TUTTAVA_ID TUT_NIMI TUT_VUOSI ake Akseli Mäkelä 2001 make Kerälä Martti 2002 pera PERTTI Järvinen 2006 TAPAAMINEN1 TAPAAMIS_ID PAIKAN_NIMI PVM AL_AIKA OSOITE TUTTAVA_ID1 TUTTAVA_ID2 TUTTAVA_ID10 001 Vanha 1.2.2010 18:00 Mansku 3, ake make Helsinki 002 Uusi 1.9.2010 19:00 Mansku 5 HKI ake TAPAAMINEN2 TAPAAMIS_ID PAIKAN_NIMI PVM AL_AIKA OSOITE TUTTAVA_LISTA 001 Vanha 1.2.2010 18:00 Mansku 3, ake, make PERA Helsinki 002 Uusi 1.9.2010 19:00 Mansku 5 HKI ake ei 1NF! Millaisia ongelmia datassa näyttäisi olevan?
HAAGA-HELIA Heti-09 11 (27) 1NF: TUTTAVA (tuttava_id, etunimi, sukunimi, tut_vuosi, ) TAPAAMINEN (tapaamis_id, paikan_nimi, pvm, al_aika, katuosoite, postitmp) TAVATTU(tapaamis_id, tuttava_id) TUTTAVA TUTTAVA_ID ETUNIMI SUKUNIMI TUT_VUOSI ake Akseli Mäkelä 2001 make Martti Kerälä 2002 pera Pertti Järvinen 2006 TAPAAMINEN TAPAAMIS_ID PAIKAN_NIMI PVM AL_AIKA OSOITE POSTITMP 001 Vanha 1.2.2010 18:00 Mansku 3 Helsinki 002 Uusi 1.9.2010 19:00 Mansku 5 Helsinki TAVATTU TAPAAMIS_ID TUTTAVA_ID 001 ake 001 make 001 pera 002 ake
HAAGA-HELIA Heti-09 12 (27) Miksi 1NF? Minkälaisen kyselyn joutuisit tekemään etsiäksesi tapaamiset tuttavan ake kanssa? (normalisoimattomissa vaihtoehdoissa) Mitä jos useasti tapaamasi tuttava vaatii, että hänen tuttava_id:nsä on muutettava. Miten tiedon muuttaminen onnistuisi? (normalisoimattomissa vaihtoehdoissa) Mitä, jos tapaamiseen osallistuu useampi tuttava, kuin mihin on varauduttu? (TAPAAMINEN1:ssä) ~ Normalisoimattomaan relaatioon liittyviä hankaluuksia
HAAGA-HELIA Heti-09 13 (27) 2. Normaalimuoto 2NM (2 Normal Form, 2NF) Relaatio on 2. normaalimuodossa jos (ja vain jos) se on 1NF:ssa ja jokainen avaimeen kuulumaton attribuutti on täydellisesti riippuvainen avaimesta Ts. avaimen osa ei saa riittää identifioimaan jotakin relaation attribuuteista Avaimen osasta riippuvat attribuutit esitetään omana relaationaan Huom! 2. normaalimuotoa on tarpeen tutkia vain, kun pääavain koostuu useammasta kuin yhdestä attribuutista!
HAAGA-HELIA Heti-09 14 (27) Esim: tuttavalla voi olla monta eri harrastusta, harrastuksella voi olla tyyppi, esim. urheilu, taide, TUTTAVAN_HARRASTUS(tuttava_id, harrastus, harrastustyyppi) TUTTAVA TUTTAVA_ID HARRASTUS HARRASTUSTYYPPI ake kitaransoitto musiikki make ilmakitaransoitto leikki ake juokseminen urheilu make juokseminen urheilu pera juokseminen URHEILU ake laulu musiikki pera pingis urheilu ei 2NF! Millaisia ongelmia datassa näyttäisi olevan?
HAAGA-HELIA Heti-09 15 (27) 2NF: TUTTAVAN_HARRASTUS(tuttava_id, harrastus) HARRASTUS( harrastus, harrastustyyppi) TUTTAVAN_HARRASTUS TUTTAVA_ID ake make pera make ake pera HARRASTUS kitaransoitto ilmakitaransoitto juokseminen juokseminen laulu sarjakuvat HARRASTUS HARRASTUS kitaransoitto ilmakitaransoitto juokseminen laulu sarjakuvat HARRASTUSTYYPPI musiikki leikki urheilu musiikki keräily
HAAGA-HELIA Heti-09 16 (27) Miksi 2NF? Kuinka moneen kertaan harrastuksen tyyppi pitää tallentaa tietokantaan? Jos harrastuksen tyyppi tulikin kirjattua väärin, moneenko relaatioon korjaus on tallennettava? tietylle harrastukselle saattaa kirjautua eri harrastustyyppejä tietokantaan? ~ Normalisoimattomaan relaatioon liittyviä hankaluuksia
HAAGA-HELIA Heti-09 17 (27) 3. Normaalimuoto 3NM (3 Normal Form, 3NF) Relaatio on 3. normaalimuodossa jos (ja vain jos) se on 2NF:ssa ja mikään sen avaimeen kuulumattomista attribuuteista ei ole avaimesta epäsuorasti riippuvainen Ts. ei-avaimena oleva attribuutti ei saa riippua avaimen lisäksi jostakin muusta, ei-avaimena olevasta attribuutista Siirrä attribuutit, jotka riippuvat avaimen lisäksi jostakin ei-avaimena olevasta attribuutista omaksi relaatiokseen
HAAGA-HELIA Heti-09 18 (27) Esim: TAPAAMINEN (tapaamis_id, paikan_nimi, pvm, al_aika, katuosoite, kunta) TAPAAMINEN TAPAAMIS_ID PAIKAN_NIMI PVM AL_AIKA OSOITE POSTITMP 001 Vanha 1.2.2010 18:00 Mansku 3 Helsinki 002 Uusi 1.9.2010 19:00 Mansku 5 Helsinki 003 Vanha 1.10.2010 19:00 Mansku 3 Helsinki 004 Vanha 1.12.2010 10:00 Mansku 3 Helsinki ei 3NF!
HAAGA-HELIA Heti-09 19 (27) 3NF: TAPAAMINEN (tapaamis_id, paikan_nimi, pvm, al_aika) PAIKKA (paikan_nimi, katuosoite, kunta) huomaa että viiteavaimen on säilyttävä TAPAAMINEN TAPAAMIS_ID PAIKAN_NIMI PVM AL_AIKA 001 Vanha 1.2.2010 18:00 002 Uusi 1.9.2010 19:00 003 Vanha 1.10.2010 19:00 004 Vanha 1.12.2010 10:00 PAIKKA PAIKAN_NIMI OSOITE POSTITMP Vanha Mansku 3 Helsinki Uusi Mansku 5 Helsinki
HAAGA-HELIA Heti-09 20 (27) Miksi 3NF? Kuinka moneen kertaan osoitetiedot joudutaan kirjoittamaan? Kun lisätään uusi tapaaminen tuttuun paikaan, joudutaan osoite kirjoittamaan yhä uudelleen Jos vanhoja tapaamisia poistetaan tietokannasta, miten voi käydä tiedon jonkin paikan osoitteesta? ~ Normalisoimattomaan relaatioon liittyviä hankaluuksia
HAAGA-HELIA Heti-09 21 (27) Normalisointiprosessi Normalisoimaton muoto Pura rakenteiset attribuutit & Siirrä toistuvat / moniarvoiset attribuutit omaksi relaatiokseen 1NF (atomaariset attribuutit) Poista epätäydellinen riippuvuus ts. Siirrä attribuutit jotka riippuvat pääavaimen osasta omaksi relaatiokseen 2NF (täydellinen riippuvuus koko avaimesta) Poista transitiivinen riippuvuus ts. Siirrä attribuutit, jotka riippuvat pääavaimen lisäksi jostakin pääavaimeen kuulumattomasta attribuutista omaksi relaatiokseen 3NF (attribuutit keskenään riippumattomia)
HAAGA-HELIA Heti-09 22 (27) 3NF = Normalisoinnin tavoitetaso! 1. Yksilöivä avain 2. Ei toistuvia tai rakenteellisia attribuutteja 3. Ei riippuvuutta pääavaimen osasta 4. Attribuutit keskenään riippumattomia "The rules leading to and including the 3. normal form can be summed up in a single statement: Each attribute must be a fact about the key, the whole key, and nothing but the key." [Wiorkowski, Kull. DB2 Design and Development Guide] Coddin alkuperäisessä määrittelyssä mukana vain 1NF, 2NF, 3NF Lisäksi myös Boyce-Codd normaalimuoto (BCNF) 4. Normaalimuoto (4NF) 5 normaalimuoto (5 NF) Näitä käsitellään syventävillä kursseilla
HAAGA-HELIA Heti-09 23 (27) Normalisointiesimerkki: Kurssihallinto OPETTAJA(openo, ope_nimi, ope_tutkinto, ope_puh1, ope_puh2) OPISKELIJA(opino, opi_nimi, aloitus_vuosi, osoite(katuos, postino, kunta)) KURSSI(kurssino, toteutusno, kurssin_nimi, vastuu_openo, opettava_openo, laajuus, aloitus_pvm) OSALLISTUMINEN(kurssino, toteutusno, opino, arvosana)
HAAGA-HELIA Heti-09 24 (27) OPETTAJA OPENO OPE_NIMI OPE_TUTKINTO OPE_PUH1 OPE_PUH2 111 Taina Torikas FM 09 123 040 123 222 Lainelin Lasse FM 040 234 333 Olga Osuva FL 09 345 040 567 666 Kurkela Kalle DI 09 456, 09 678 040 987 OPISKELIJA OPINO OPI_NIMI OSOITE AL_VUOSI 123 Heikki Herala Jokitie 3, 03100 Vantaa 2010 234 Isotalo Isa Jokitie 1 03100 VANTAA 2009 345 Jukka Jutila Jokitie 3; 03100 VANDA 2010 456 Kurkela Katja Meritie 2, 02100 ESPoo 2010 KURSSI KURSSINO TOTEUTUSNO KURSSI_NIMI VASTUU_OPENO OPETTAVA_OPENO LAAJUUS AL_PVM ICT05 1 Tiedonhallinta ja Tietokannat 333 111 6 10.1.2010 ICT05 2 Tiedonhallinta ja Tietokannat 333 333 6 20.1.2010 ICT03 50 Tieto ja tiedon varastointi 222 666 12 20.9.2009 OSALLISTUMINEN KURSSINO TOTEUTUSNO OPINO ALRVOSANA ICT05 1 123 3 ICT05 1 234 4 ICT03 50 123 5 Millaisia ongelmia datassa näyttäisi olevan?
HAAGA-HELIA Heti-09 25 (27) 1NF: 1. Pääavain määrää funktionaalisesti muut attribuutit 2. Ei rakenteellisia attribuutteja OPETTAJA(openo, ope_snimi, ope_enimi, ope_tutkinto) OPE_PUH(openo, ope_puh) OPISKELIJA(opino, opi_snimi, opi_enimi, aloitus_vuosi, katuos, postino, kunta) KURSSI(kurssino, toteutusno, kurssin_nimi, vastuu_openo, opettava_openo, laajuus, aloitus_pvm) OSALLISTUMINEN(kurssino, toteutusno, opino, arvosana)
HAAGA-HELIA Heti-09 26 (27) 2NF: ~ Jokainen attribuutti riippuu koko pääavaimesta (ei sen osasta) OPETTAJA(openo, ope_snimi, ope_enimi, ope_tutkinto) OPE_PUH(openo, ope_puh) OPISKELIJA(opino, opi_snimi, opi_enimi, aloitus_vuosi, katuos, postino, kunta) KURSSITOTEUTUS(kurssino, toteutusno, opettava_openo, aloitus_pvm) KURSSI(kurssino, kurssin_nimi, vastuu_openo, laajuus) OSALLISTUMINEN(kurssino, toteutusno, opino, arvosana)
HAAGA-HELIA Heti-09 27 (27) 3NF: ~ Jokainen attribuutti riippuu vain pääavaimesta (ei muista attribuuteista) OPETTAJA(openo, ope_snimi, ope_enimi, ope_tutkinto) OPE_PUH(openo, ope_puh) OPISKELIJA(opino, opi_snimi, opi_enimi, aloitus_vuosi, katuos, postino) POSTITMPK(postino, kunta) KURSSITOTEUTUS(kurssino, toteutusno, opettava_openo, aloitus_pvm) KURSSI(kurssino, kurssin_nimi, vastuu_openo, laajuus,) OSALLISTUMINEN(kurssino, toteutusno, opino, arvosana) Huolehdi että viiteavaimet (=yhteydet) säilyvät normalisoinnissa!