Tria normala formo (3NF) estas datumbaza principo, kiu subtenas la integrecon de datumoj per konstruado sur la principoj normalaj principoj provizitaj per Unua Normala Formo (1NF) kaj Dua Normala Formo (2NF).
Triaj Normalaj Formuloj
Ekzistas du bazaj postuloj por datumbazo esti en tria normala formo:
- La datumbazo devas plenumi la postulojn de 1NF kaj 2NF .
- Ĉiuj datumaj kolumnoj devas dependi de la ĉefa ŝlosilo , kio signifas, ke la valoro de iu ajn kolumno povas esti derivita de la ĉefa ŝlosilo nur.
Pri la Ĉefa Ŝlosila Dependeco
Ni esploru plu kion ni signifas per la fakto, ke ĉiuj kolumnoj devas dependi de la ĉefa ŝlosilo.
Se valoro de kolumno povas esti derivita de kaj la primara ŝlosilo kaj alia kolumno en la tablo, ĝi malobservas 3NF. Pripensu tabulon de Oficistoj kun ĉi tiuj kolumnoj:
- EmployeeID
- UnuaName
- Familia nomo
Ĉu ambaŭ LastName kaj FirstName dependas nur de la valoro de EmployeeID? Nu, Ĉu LastName povus dependi de FirstName? Ne, ĉar nenio propra en LastName sugestus la valoron de FirstName. Ĉu FirstName povus dependi de LastName? Ne denove, ĉar la sama estas vera: kio ajn estas LastName eble, ĝi ne povus doni aludon pri valoro FirstName. Sekve, ĉi tiu tablo estas 3NF-kongrua.
Sed konsideras ĉi tiun veturilon-tablon:
- VeturiloID
- Fabrikisto
- Modelo
La fabrikanto kaj la modelo povus derivi de la VehicleID - sed la Modelo ankaŭ povus derivi de la Fabrikisto ĉar veturilo-modelo estas farita nur de aparta fabrikanto. Ĉi tiu tablo-dezajno estas ne-3NF-kongrua, kaj povus do rezultigi datumajn anomaliojn. Ekzemple, vi povus ĝisdatigi la fabrikiston sen ĝisdatigi la modelon, prezentante malkapablojn.
Por plenumi ĝin, ni bezonus movi la suplementan dependan kolumnon al alia tablo kaj referenci ĝin per fremda ŝlosilo. Ĉi tio rezultus en du tabloj:
Veturiloj Tablo
En la tablo sube, la ModeloID estas fremda ŝlosilo al la Model- tablo:
- VeturiloID
- Fabrikisto
- ModeloID
Modeloj Tabelo
Ĉi tiu nova tablo montras modelojn por fabrikantoj. Se vi volas ĝisdatigi ajnan veturilon informan specimenon al modelo, vi farus ĝin en ĉi tiu tablo, anstataŭ en la tablo de Veturiloj.
- ModeloID
- Fabrikisto
- Modelo
Derivitaj Kampoj en la 3NF-Modelo
Tablo eble enhavas derivaĵon - unu komputilon bazitan sur aliaj kolumnoj en la tablo. Ekzemple, konsideru ĉi tiun tablon de fenestraĵoj:
- Mendnumero
- Kliento-nombro
- Prezo unuopa
- Kvanto
- Tuta
La totalo rompas 3NF-plenumon ĉar ĝi povas esti derivita multiplikante la unuopa prezo de la kvanto, anstataŭ esti plene dependa de la primara ŝlosilo. Ni devas forigi ĝin el la tablo por plenumi la trian normalan formon.
Fakte, ĉar ĝi estas derivita, estas pli bone ne stoki ĝin en la datumbazo tute.
Ni simple povas komputi ĝin "sur la muŝo" kiam plenumas datumojn de datumbazo. Ekzemple, ni eble antaŭe uzis ĉi tiun konsulton por ricevi ordojn kaj totalajn ordojn:
SELECTu Ordon Nombro, Tuta De WidgetOrdersNi nun povas uzi la jenan konsulton:
Elektu Ordon Nombro, Unueco * Kvanto kiel Tuta De WidgetOrderspor atingi la samajn rezultojn sen malobservi normalajn regulojn.