Kolmas normaalimuoto (3NF) on tietokantaperiaate, joka tukee tietojen eheyttä rakentamalla ensimmäisen normaalimuodon (1NF) ja toisen normaalimuodon (2NF) tarjoamiin tietokannan normalisointiperiaatteisiin. 3NF:n tavoitteena on parantaa tietokannan käsittelyä ja samalla minimoida tallennuskustannukset.
Kolmannen normaalin lomakkeen vaatimukset
Tietokannan 3NF-muodossa on kaksi perusvaatimusta:
- Tietokannan on täytettävä sekä 1NF- että 2NF-vaatimukset.
- Kaikkien tietokannan sarakkeiden on oltava riippuvaisia ensisijaisesta avaimesta, mikä tarkoittaa, että kunkin sarakkeen arvo voidaan johtaa vain ensisijaisesta avaimesta.
Ensisijaisen avaimen riippuvuus
Tutkitaan tarkemmin, mitä tarkoitamme sillä, että kaikkien sarakkeiden on oltava riippuvaisia ensisijaisesta avaimesta. Jos sarakkeen arvo voidaan johtaa sekä ensisijaisesta avaimesta että toisesta taulukon sarakkeesta, se rikkoo 3NF:ää. Harkitse työntekijöiden taulukkoa, jossa on seuraavat sarakkeet:
- henkilöstökortti
- Etunimi
- Sukunimi
Riippuvatko sekä sukunimi että etunimi vain työntekijätunnuksen arvosta? Voiko sukunimi riippua etunimestä? Ei, koska mikään sukunimeen luontainen osa ei viittaa etunimen arvoon. Voiko etunimi riippua sukunimestä? Ei enää, koska sama on totta: mikä tahansa sukunimi voi olla, se ei voi vihjata etunimen arvoon. Siksi tämä taulukko on 3NF-yhteensopiva. Harkitse sitten tätä ajoneuvotaulukkoa:
- Ajoneuvon tunnus
- Valmistaja
- Malli
Valmistaja ja malli voivat olla johdettu VehicleID:stä, mutta Malli voi olla johdettu myös valmistajasta, koska vain yksi tietty valmistaja valmistaa ajoneuvomallia. Tämä taulukkorakenne ei ole yhteensopiva 3NF:n kanssa ja voi siksi johtaa tietojen poikkeamiin. Voit esimerkiksi päivittää valmistajan päivittämättä mallia, mikä aiheuttaa epätarkkuuksia.
Tietokannan asettaminen kolmanteen normaalimuotoon (3NF)
Ylimääräisen riippuvaisen sarakkeen siirtäminen toiseen taulukkoon ja siihen viittaaminen vieraalla avaimella tekisi siitä yhteensopivan. Tämä johtaisi kahteen taulukkoon, joita kutsumme nimellä «ajoneuvot» ja «mallit». «Ajoneuvot»-taulukossa ModelID on «Models»-taulukon vierasavain:
- Ajoneuvon tunnus
- Valmistaja
- Mallin tunnus
Uusi Mallit-taulukko määrittää mallit valmistajille. Jos haluat päivittää mallin ajoneuvokohtaisia tietoja, tee se tässä taulukossa «Ajoneuvot»-taulukon sijaan.
- Mallin tunnus
- Valmistaja
- Malli
Johdetut kentät 3NF-mallissa
Taulukko voi sisältää johdetun kentän, kentän, joka lasketaan taulukon muiden sarakkeiden perusteella. Harkitse esimerkiksi tätä widget-tilaustaulukkoa:
- Tilausnumero
- Asiakasnumero
- Yksikköhinta
- Määrä
- Kaikki yhteensä
Kokonaismäärä rikkoo 3NF-yhteensopivuuden, koska se voidaan johtaa kertomalla yksikköhinta määrällä sen sijaan, että luottaisivat kokonaan ensisijaiseen avaimeen. Kolmannen normaalimuodon täyttämiseksi sinun on poistettava Total taulukosta. Koska se on johdettu, on parempi olla tallentamatta sitä tietokantaan ollenkaan, vaan laskea se vain lennossa tietokantakyselyitä suoritettaessa. Olemme esimerkiksi käyttäneet tätä hakua aiemmin saadaksemme tilausnumerot ja loppusummat:
VALITSE tilausnumero, yhteensä
FROM WidgetOrders
Käytä nyt seuraavaa kyselyä saadaksesi samat tulokset rikkomatta normalisointisääntöjä:
SELECT Tilausnumero, Yksikköhinta * Määrä AS Yhteensä
FROM WidgetOrders