Treća normalna forma (3NF) je princip baze podataka koji podržava integritet podataka izgradnjom na principima normalizacije baze podataka koji su obezbeđeni u prvom normalnom obliku (1NF) i drugom normalnom obliku (2NF).
Treći zahtjevi za normalnu obradu
Postoje dva osnovna zahteva da baza podataka bude u trećoj normalnoj formi:
- Baza podataka već mora zadovoljiti zahtjeve i 1NF i 2NF .
- Sve kolone baze podataka moraju zavisiti od primarnog ključa , što znači da vrijednost svake kolone može biti izvedena samo iz primarnog ključa.
O zavisnosti od primarnog ključa
Hajde da istražimo dalje šta podrazumevamo činjenicom da sve kolone moraju zavisiti od primarnog ključa.
Ako vrednost kolone može biti izvedena iz primarnog ključa i drugog stupca u tabeli, ona krši 3NF. Razmotrite tablu zaposlenih sa ovim stupcima:
- EmployeeID
- Ime
- Prezime
Da li i LastName i FirstName zavise samo od vrednosti EmployeeID-a? Pa, da li LastName zavisi od FirstName? Ne, jer ništa inherentno u LastName ne bi predložilo vrijednost FirstName. Može li FirstName zavisiti od LastName? Ne ponovo, jer je isto istina: bez obzira na LastName, ne bi mogla dati nagoveštaj vrijednosti FirstName-a. Zbog toga je ova tabela usklađena sa 3NF.
Ali uzmite u obzir ovu tablu Vozila:
- VehicleID
- Proizvođač
- Model
ProizvoĎač i model mogu proizvesti iz VehicleID-a, ali model može proizvesti i proizvođača, jer model vozila kreira samo određeni proizvođač. Ovaj dizajn tabele nije kompatibilan sa 3NF-om, i stoga može rezultirati anomalijama podataka. Na primer, možete ažurirati proizvođača bez ažuriranja modela, uvodeći netačnosti.
Da bismo ga usaglasili, trebali bi premjestiti dodatnu zavisnu kolonu na drugu tablicu i pozvati ga pomoću inostranog ključa. To bi dovelo do dve tabele:
Vozni stol
U donjoj tabeli ModelID je inostrani ključ u tabeli " Modeli" :
- VehicleID
- Proizvođač
- ModelID
Tablica modela
Ova nova tabela mapira modele za proizvođače. Ako želite da ažurirate sve informacije o vozilu specifične za model, to biste uradili u ovoj tabeli, a ne u tablici Vozila.
- ModelID
- Proizvođač
- Model
Izvedena polja u modelu 3NF
Tabela može sadržati izvedeno polje - jedno koje se izračunava na osnovu drugih kolona u tabeli. Na primer, razmotrite ovu tabelu naredbi za vidžet:
- Broj narudžbe
- Broj kupca
- Cijena po jedinici
- Količina
- Ukupno
Ukupno prekida saglasnost sa 3NF-om jer može da se izvede množenjem cene jedinice za količinu, umjesto da je potpuno zavisna od primarnog ključa. Moramo ga ukloniti sa stola kako bi se pridržavali treće normalne forme.
U stvari, pošto je izvedeno, bolje je da ga uopšte ne čuvate u bazi podataka.
Jednostavno ga možemo izračunati "na putu" prilikom obavljanja upita za bazu podataka. Na primer, možda smo ranije koristili ovaj upit za preuzimanje brojeva i ukupnih brojeva naloga:
SELECT OrderNumber, Total FROM WidgetOrdersSada možemo da koristimo sledeći upit:
SELECT OrderNumber, UnitPrice * Količina AS Ukupno od WidgetOrdersda postignu iste rezultate bez kršenja pravila normalizacije.