Tietokannan sijoittaminen kolmannelle normaalimuodolle (3NF)

Kolmas normaali lomake (3NF) on tietokannan periaate, joka tukee tietojen eheyttä rakentamalla ensimmäisen Normal Form (1NF) ja Second Normal Form (2NF) -standardin normalisointiperiaatteita.

Kolmas tavanomainen vaatimuslomake

Tietokannassa on kaksi perusvaatimusta, jotka ovat kolmannessa normaalissa muodossa:

Tietoja ensisijaisesta avaintekijästä

Tutkitaan entisestään, mitä tarkoitamme sillä, että kaikkien sarakkeiden on oltava riippuvaisia ​​ensisijaisesta avaimesta.

Jos sarakkeen arvo voidaan johtaa sekä ensisijaisesta avaimesta että taulukon toisesta sarakkeesta, se rikkoo 3NF. Harkitse Työntekijät-taulukon näiden sarakkeiden avulla:

Onko sekä viimeinen nimi että etunimi riippuisi vain EmployeeID: n arvosta? Voisiko LastName riippua FirstName: stä? Ei, koska mikään lasteen ominaisuuksista ei ehdota arvoa FirstName. Voisiko FirstName riippua viimeisestä nimestä? Ei uudestaan, koska sama pätee: mitä LastName saattaa olla, se ei voinut antaa vihjeitä FirstName-arvon arvosta. Siksi tämä taulukko on 3NF-yhteensopiva.

Mutta ajattele tätä Ajoneuvot-taulukkoa:

Valmistaja ja malli voisivat saada VehicleID: stä - mutta malli voisi myös tulla valmistajalta, koska ajoneuvomalli on vain valmistajan valmistaja. Tämä taulukkosuunnittelu ei ole yhteensopiva 3NF: n kanssa, ja se voi siten johtaa datan poikkeamiin. Voit esimerkiksi päivittää valmistajan päivittämättä mallia ja esittämällä epätarkkuuksia.

Jotta se olisi yhteensopiva, meidän olisi siirrettävä ylimääräinen riippuva sarake toiseen taulukkoon ja viitata se ulkomaisen avaimen avulla. Tämä johtaisi kahteen taulukkoon:

Ajoneuvot Taulukko

Alla olevassa taulukossa ModelID on mallipöydän vieraan avain:

Mallit Taulukko

Tämä uusi taulukko malleja valmistajille. Jos haluat päivittää mallia koskevat ajoneuvotietosi, tee se tässä taulukossa eikä ajoneuvojen taulukossa.

Johdotetut kentät 3NF-mallissa

Taulukko voi sisältää johdetun kentän - joka lasketaan taulukon muiden sarakkeiden perusteella. Katso esimerkiksi tämä widget-tilausten taulukko:

Kokonaisuus rikkoo 3NF: n noudattamista, koska se voidaan johtaa kertomalla yksikköhinta määrällä sen sijaan, että se olisi täysin riippuvainen ensisijaisesta avaimesta. Meidän on poistettava se taulukosta, jotta voimme noudattaa kolmannen normaalin lomakkeen.

Itse asiassa, koska se on peräisin, on parempi olla tallentamatta tietokantaan ollenkaan.

Voimme yksinkertaisesti laskea sen "lennossa" suoritettaessa tietokantahakemuksia. Voimme esimerkiksi käyttää aiemmin tätä kyselyä saadaksesi tilausnumerot ja kokonaismäärät:

SELECT Tilausnumero, Yhteensä FROM WidgetOrders

Voimme nyt käyttää seuraavaa kyselyä:

SELECT Tilausnumero, yksikköhinta * Määrä AS Total FROM WidgetOrders

jotta saataisiin samat tulokset rikkomatta normalisointisääntöjä.