Duomenų bazės įvedimas trečioje įprastoje formoje (3NF)

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:

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:

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":

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 lentelės " Modeliai" raktas:

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.

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ę:

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ų.