Kolmas normaalne vorm (3NF) on andmebaasi põhimõte, mis toetab andmete terviklikkust, tuginedes esimese normaalse vormi (1NF) ja teise normaalse vormi (2NF) poolt esitatud andmebaasi normaliseerimispõhimõtetele .
Kolmanda normaalse vormi nõuded
Andmebaasis on kaks põhinõuet, mis peavad olema kolmandas normaalses vormis:
- Andmebaas peab juba vastama nii 1NF kui ka 2NF nõuetele .
- Kõik andmebaasi vead peavad sõltuma primaarvõtist , see tähendab, et iga veeru väärtus võib tuletada ainult esmastest võtmetest.
Peamise võtme sõltuvuse kohta
Lähemalt uurime, mida me mõtleme sellepärast, et kõik veerud peavad olema primaarvõti sõltuvad.
Kui veeru väärtust saab tuletada nii põhiväärtus kui ka teine veerg tabelis, rikub see 3NF-i. Mõelge veergudega Töötajate tabel:
- Töötaja ID
- Eesnimi
- Perekonnanimi
Kas nii LastName kui FirstName sõltuvad ainult EmployeeID väärtusest? Noh, kas LastName sõltub Esimene Nimi? Ei, sest Lastname'i olemus ei viita esimese nime väärtusele. Kas FirstName sõltub LastName? Ära jällegi, sest sama on tõsi: ükskõik, milline on LastName, ei pruugi olla eesnimi väärtuse eeskujuks. Seetõttu on see tabel 3NF-i ühilduv.
Kuid pidage seda Sõiduki lauda:
- VehicleID
- Tootja
- Mudel
Tootja ja mudel võivad tuletada VehicleID - kuid mudel võiks tuleneda ka tootjalt, sest sõiduki mudelit teeb ainult konkreetne tootja. See laudade disain on mitte-3NF-ile ühilduv ja võib seetõttu põhjustada andmete kõrvalekaldeid. Näiteks võite värskendada tootjat ilma mudeli uuendamata, esitades ebatäpsusi.
Selleks, et teha see nõuetele vastav, peaksime lisama täiendava sõltuva veeru teisaldama teisele tabelile ja viitama sellele välisvõti kasutades. Selle tulemuseks on kaks tabelit:
Sõidukid Tabel
Alljärgnev tabel ModelID on mudelite tabeli välisvõti:
- VehicleID
- Tootja
- ModelID
Mudelite tabel
See uus tabel koostab tootjate jaoks mudelid. Kui soovite värskendada mudeli spetsiifilist sõidukiteavet, tehke see pigem käesolevas tabelis kui sõiduki tabelis.
- ModelID
- Tootja
- Mudel
Tuletatud väljad 3NF-mudelil
Tabel võib sisaldada tuletatud välja - üks, mis arvutatakse tabeli teistel veergudel. Näiteks kaaluge vidintellimuste tabelit:
- Tellimuse number
- Kliendi number
- Ühikuhind
- Kogus
- Kokku
Kokku katkestab 3NF-i vastavuse, sest seda saab tuletada, korrutades ühikuhinna koguse asemel täiesti sõltuva primaarvõtmega. Peame eemaldama selle tabelist kolmanda normaalse vormi täitmiseks.
Tõepoolest, kuna see on tuletatud, on parem mitte hoida seda andmebaasis üldse.
Andmebaasi päringute teostamisel saame lihtsalt arvutada seda "lennata". Näiteks võib-olla kasutasime seda päringut järjekorranumbrid ja kogusummad allalaadimiseks:
SELECT OrderNumber, Total FROM WidgetOrdersNüüd saame kasutada järgmist päringut:
SELECT OrderNumber, UnitPrice * Kogus AS FROM FROM WidgetOrders kokkuet saavutada samad tulemused ilma normaalsuse reeglite rikkumata.