Innholdsfortegnelse:
Video: Ruby on Rails by Leila Hofer 2024
Det finnes tre kilder til endringsavvik i SQL Disse defineres som første, andre og tredje normale skjemaer (1NF, 2NF, 3NF). Disse vanlige skjemaene virker som rettsmidler for endringsforstyrrelser.
Første normal form
For å være i første normale form (1NF) må en tabell ha følgende egenskaper:
-
Tabellen er todimensjonal med rader og kolonner.
-
Hver rad inneholder data som gjelder noen ting eller deler av en ting.
-
Hver kolonne inneholder data for et enkelt attributt til det som beskrives.
-
Hver celle (skjæringspunktet i en rad og en kolonne) i tabellen må bare ha en enkelt verdi.
-
Oppføringer i en hvilken som helst kolonne må alle være av samme type. Hvis for eksempel oppføringen i en rad i en kolonne inneholder et ansattes navn, må alle de andre radene inneholde ansattes navn i den kolonnen.
-
Hver kolonne må ha et unikt navn.
-
Ingen to rader kan være identiske (det vil si hver rad må være unik).
-
Ordren til kolonnene og rekkefølgen av radene er ikke signifikante.
En tabell (relasjon) i første normale form er immun mot noen slags modifikasjonsanomalier, men er fortsatt gjenstand for andre. Salgstabellen er i første normale form, og tabellen er gjenstand for sletting og innføring av anomalier. Første normal form kan vise seg nyttig i enkelte applikasjoner, men upålitelig i andre.
Andre normale skjemaer
For å sette pris på andre normale skjemaer, må du forstå ideen om funksjonell avhengighet. En funksjonell avhengighet er et forhold mellom eller blant attributter. Et attributt er funksjonelt avhengig av en annen hvis verdien av den andre attributtet bestemmer verdien av det første attributtet. Hvis du vet verdien av det andre attributtet, kan du bestemme verdien av det første attributtet.
Anta at for eksempel et tabell har attributter (kolonner) StandardCharge, NumberOfTests og TotalCharge som relaterer seg gjennom følgende ligning:
TotalCharge = StandardCharge * NumberOfTests
TotalCharge er funksjonelt avhengig av både StandardCharge og NumberOfTests. Hvis du vet verdien av StandardCharge og NumberOfTests, kan du bestemme verdien av TotalCharge.
Hvert bord i første vanlig form må ha en unik primærnøkkel. Denne nøkkelen kan bestå av en eller flere kolonne. En nøkkel som består av mer enn en kolonne kalles en komposittnøkkel. For å være i andre normale form (2NF), må alle ikke-nøkkelattributter avhenge av hele nøkkelen. Dermed er hvert forhold som er i 1NF med en enkelt attributt nøkkel automatisk i andre normale form.
Hvis et forhold har en sammensatt nøkkel, må alle ikke-nøkkelattributter avhenge av alle komponentene i nøkkelen. Hvis du har et bord der noen ikke-nøkkelattributter ikke er avhengige av alle komponentene i nøkkelen, bryter du tabellen opp i to eller flere tabeller slik at i alle de nye tabellene er alle ikke-nøkkelattributter avhengig av alle komponenter av primærnøkkelen.
Lyd forvirrende? Se på et eksempel for å avklare saker. Tenk på SALES-tabellen. I stedet for å bare registrere et enkelt kjøp for hver kunde, legger du til en rad hver gang en kunde kjøper en vare for første gang. En annen forskjell er at charterkunder (de med Customer_ID-verdier på 1001 til 1007) får rabatt på vanlig pris.
Customer_ID identifiserer ikke en rad unikt. I to rader er Customer_ID 1001. I to andre rader er Customer_ID 1010. Kombinasjonen av Customer_ID-kolonnen og Produkt-kolonnen identifiserer en rad. Disse to kolonnene sammen er en komposittnøkkel.
Hvis ikke for det faktum at noen kunder kvalifiserer for rabatt og andre ikke, vil tabellen ikke være i andre normale form, fordi pris (en ikke-nøkkelattributt) bare vil avhenge av en del av nøkkelen (Produkt). Fordi noen kunder kvalifiserer for rabatt, er Pris avhengig av både CustomerID og Product, og tabellen er i andre normale form.
Tredje normal form
Tabeller i andre normale form er spesielt utsatt for noen typer modifikasjonsanomalier - spesielt de som kommer fra transitive avhengigheter.
A Transitiv avhengighet oppstår når en attributt avhenger av et andre attributt, som avhenger av et tredje attributt. Slettinger i et bord med en slik avhengighet kan forårsake uønsket informasjonstap. En relasjon i tredje normale form er en relasjon i andre normale form uten transitiv avhengighet.
Se igjen på SALES bordet, som du vet er i første normale form. Så lenge du begrenser oppføringer for å tillate bare én rad for hver Customer_ID, har du en primærnøkkel med en attributt, og tabellen er i andre normale form. Tabellen er imidlertid fortsatt underlagt uregelmessigheter. Hva om kunden 1010 ikke er fornøyd med klorblekemiddel, og returnerer varen for tilbakebetaling?
Du vil fjerne den tredje raden fra bordet, som registrerer at kunden 1010 kjøpte klorblekemiddel. Du har et problem: Hvis du fjerner den raden, mister du også det faktum at klorblekemiddel har en pris på $ 4. Denne situasjonen er et eksempel på en transitiv avhengighet. Prisen avhenger av Produkt, som igjen avhenger av primærnøkkel Customer_ID.
Å bryte SALES-tabellen i to tabeller løser problemet med transitiv avhengighet. De to tabellene utgjør en database som er i tredje normale form.