Trečioji normalioji forma (3NF) yra duomenų bazės principas, kuris palaiko duomenų vientisumą, remdamasis duomenų bazės normalizavimo principais, pateiktais pirmosios įprastos formos (1NF) ir antrosios įprastos formos (2NF).
Trečios normos formos reikalavimai
Yra du pagrindiniai reikalavimai, kad duomenų bazė būtų trečioje įprastoje formoje:
- Duomenų bazė jau turi atitikti tiek 1NF, tiek 2NF reikalavimus.
- Visi duomenų bazės stulpeliai turi priklausyti nuo pirminio rakto, tai reiškia, kad bet kurio stulpelio reikšmė gali būti išvedama tik iš pirminio rakto.
Apie pagrindinę priklausomybę nuo rakto
Toliau pažvelkime, ką reiškia tai, kad visi stulpeliai turi priklausyti nuo pirminio rakto.
Jei stulpelio vertė gali būti išvedama tiek iš pirminio rakto, tiek iš kitos lentelės stulpelio, ji pažeidžia 3NF. Apsvarstykite darbuotojų lentelę su šiais stulpeliais:
- Darbuotojo ID
- Pirmas vardas
- Pavardė
Ar tiek LastName, tiek FirstName priklauso tik nuo EmployeeID vertės? Na, gali "LastName" priklausyti nuo "FirstName"? Ne, nes nieko, būdingo LastName, nenurodytų "FirstName" vertės. Ar "FirstName" priklausys nuo "LastName"? Nebereikia, nes taip pat yra tiesa: nesvarbu, koks būtų LastName, jis negalėjo pateikti užuominos apie "FirstName" reikšmę. Todėl ši lentelė atitinka 3NF reikalavimus.
Tačiau apsvarstykite šią lentelę "Transporto priemonės":
- VehicleID
- Gamintojas
- Modelis
Gamintojas ir modelis gali kilti iš VehicleID, tačiau modelis taip pat gali kilti iš gamintojo, nes transporto priemonės modelį gamina tik tas gamintojas. Šis stalo dizainas yra ne 3NF suderinamas, todėl gali sukelti duomenų anomalijas. Pvz., Galite atnaujinti gamintoją neatnaujindami modelio, pateikdami netikslumus.
Kad jis būtų suderinamas, mes turėsime perkelti papildomą priklausomą stulpelį į kitą lentelę ir nurodyti ją naudodami užsienio raktą. Tai sudarytų dvi lenteles:
Transporto priemonių lentelė
Toliau esančioje lentelėje ModelID yra užsienio raktas Modeliai lentelė:
- VehicleID
- Gamintojas
- ModelID
Modelių lentelė
Šioje naujoje lentelėje gamintojai pateikiami modeliai. Jei norite atnaujinti bet kokią konkretaus modelio transporto priemonės informaciją, tai reikėtų padaryti šioje lentelėje, o ne lentelėje Transportas.
- ModelID
- Gamintojas
- Modelis
Išvestiniai laukai 3NF modelyje
Lentelėje gali būti išvestinis laukas - tas, kuris skaičiuojamas pagal kitus lentelės stulpelius. Pvz., Apsvarstykite šią valdiklių užsakymų lentelę:
- Užsakymo numeris
- Kliento numeris
- Vieneto kaina
- Kiekis
- Iš viso
Bendras trikdo 3NF atitikimą, nes jis gali būti nustatomas padauginus vieneto kainą pagal kiekį, o ne visiškai priklausomas nuo pirminio rakto. Turime pašalinti jį iš lentelės, kad atitiktume trečią normalią formą.
Tiesą sakant, kadangi jis yra išvestas, geriau, kad jis nebūtų laikomas duomenų bazėje.
Atliekame duomenų bazių užklausas, galime tiesiog ją apskaičiuoti "sklandžiai". Pavyzdžiui, galbūt anksčiau galėjome naudoti šią užklausą, norėdami gauti užsakymų numerius ir bendrą sumą:
SELECT OrderNumber, Total FROM WidgetOrders
Dabar mes galime naudoti šią užklausą:
SELECT OrderNumber, UnitPrice * Kiekis AS Iš viso iš WidgetOrders
pasiekti tokius pačius rezultatus, nepažeidžiant normalizavimo taisyklių.