Setja gagnagrunn í þriðja eðlilegu formi (3NF)

Þriðja eðlilegt eyðublað (3NF) er gagnagrunnsregla sem styður heilleika gagna með því að byggja á meginreglum um stöðlun gagnagrunns sem First Normal Form (1NF) og Second Normal Form (2NF) veita.

Þriðja Venjulegt Form Kröfur

Það eru tveir grunnkröfur fyrir gagnagrunninn að vera í þriðja eðlilegu formi:

Um aðal lykilatriði

Við skulum kanna frekar hvað við áttum með því að allir dálkar verða að treysta á aðal lykilinn.

Ef gildi dálks er hægt að draga úr bæði aðallyklinum og annarri dálki í töflunni, brýtur það gegn 3NF. Íhugaðu starfsmannatöflu með þessum dálkum:

Gera bæði LastName og FirstName aðeins háð gildi starfsmannaþjónustunnar? Jæja, gæti LastName verið háð FirstName? Nei, vegna þess að ekkert sem felst í LastName myndi stinga upp á gildi FirstName. Gæti FirstName verið háð LastName? Ekki aftur, því það sama er satt: hvað sem LastName gæti verið, gæti það ekki gefið vísbendingu um gildi FirstName. Þess vegna er þetta borð 3NF samhæft.

En íhuga þetta ökutæki borð:

Framleiðandinn og líkanið gætu leitt af ökutækinu - en líkanið gæti einnig leitt af framleiðanda vegna þess að gerð ökutækis er aðeins gerð af tiltekinni framleiðanda. Þessi borðhönnun er ekki í samræmi við 3NF og gæti því leitt til galla frávikum. Til dæmis gætirðu uppfært framleiðandann án þess að uppfæra líkanið og kynna ónákvæmni.

Til að gera það samhæft þurfum við að færa viðbótar háð dálkinn í aðra töflu og vísa til þess að nota erlenda lykil. Þetta myndi leiða til tveggja tafla:

Ökutæki Tafla

Í töflunni hér að neðan er ModelID er erlent lykill í líkanaborðinu:

Líkanatafla

Þessi nýja töflu kort líkan til framleiðenda. Ef þú vilt uppfæra allar upplýsingar um ökutæki sem eiga sér stað fyrir gerð, þá myndi þú gera það í þessum töflu, frekar en í ökutækjatöflunni.

Afleiddar reitir í 3NF líkaninu

Tafla gæti innihaldið aflað reit - eitt sem er reiknað út frá öðrum dálkum í töflunni. Tökum dæmi um þessa töflu fyrir pöntunarpantanir:

Heildarkostnaður brýtur 3NF samræmi vegna þess að hægt er að fá það með því að margfalda einingaverðið með því að magnið, frekar en að vera að fullu háð aðalatriðinu. Við verðum að fjarlægja það úr borðið til að fara eftir þriðja eðlilegu formi.

Reyndar, þar sem það er aflað, er betra að ekki geyma það í gagnagrunninum yfirleitt.

Við getum einfaldlega reiknað það "í fljúgandi" við framkvæma gagnasafn fyrirspurnir. Til dæmis gætum við áður notað þessa fyrirspurn til að sækja númer og heildarfjölda:

SELECT OrderNumber, Samtals FROM WidgetOrders

Við getum nú notað eftirfarandi fyrirspurn:

SELECT OrderNumber, UnitPrice * Magn AS Samtals FROM WidgetOrders

til að ná sömu niðurstöðum án þess að brjóta reglur um venju.