Kodekonsepter: Database-normalisering og de-normalisering

En av de sentrale ideene i relasjonsdatabaser er normaliseringsbegrepet. Normalisering og de-normalisering spiller en betydelig rolle i din evne til å skrive applikasjoner som gir gode resultater og tolererer dataendringer uten å skape uoverensstemmelser. I denne artikkelen vil jeg snakke om det grunnleggende om normalisering og de-normalisering, slik at du kan få tak i dette emnet.

Feltet med databaseteori inneholder en rekke normaliseringsnivåer; når den typiske utvikleren eller DBA sier at en database er "normalisert", viser de imidlertid til det som kalles Third Normal Form eller 3NF (det er ganske mange "Normal Forms"). Dette er hva jeg vil fokusere på i denne spalten.

I 3NF har hver tabell en nøkkelkolonne, og de eneste faktiske dataene i tabellen er ting som direkte hører til den tastens konsept; dette ligner veldig på objektorientert teori. Tabell A er et eksempel på datasettet som ikke er korrekt 3NF. Tabell A

Ikke normalisert. ( Klikk på bildet for å forstørre.)

Fordi tabell A ikke er normalisert, skaper vi følgende problemer for oss selv:

  • Hvis en kundeoppføring noen gang endres, må vi gjøre endringen i hver fakturapost i tabellen, noe som gir mye rom for feil.
  • Hvis en annen tabell må henvise til kunder, vil den enten måtte henvise til fakturaer (som er forvirrende og ikke oppretter en kanonisk post for hver kunde) eller gjenskape kundedataene andre steder, og lage to kilder til kundedata.
  • Å gjøre en endring i en kundeoppføring innebærer å låse hver rad med den kunden, noe som kan være problematisk.
  • Det er ingen måte å identifisere en gitt kunde unikt på.
For å normalisere denne tabellen identifiserer vi hver unike posttype; i dette eksemplet har vi to posttyper (faktura og kunder) innenfor hver faktiske post. Deretter deler vi opp postene i separate tabeller og gir hver tabell en unik ID. Denne IDen skal være en verdi som er helt uavhengig av posten, selv om virksomhetslogikken sier at dataene ikke kan endres, kan virksomhetslogikken endres i fremtiden. I tillegg bør ID-verdien (en "primærnøkkel") være en som databasen enkelt kan se etter og gi mulighet for enkel partisjonering av data mellom servere om nødvendig; som sådan er det å bruke en heltallsverdi med en autoincrementer ideell for primærnøkler. Etter normalisering vil vi ha to par tabeller ( tabell B og tabell C ). Tabell B

Normalisert fakturatabell. (Klikk på bildet for å forstørre.)
Tabell C

Normalisert kundetabell. (Klikk på bildet for å forstørre.)

Som du ser har vi nå to tabeller som bare inneholder dataene som er relevante for tabellen. Som et resultat, hvis vi har en annen tabell som må forholde seg til kunder, kan den referere til den uavhengige kundetabellen, som vil eliminere dataduplisering; hver kunde trenger bare å oppdateres ett sted. I tillegg kan vi nå identifisere kunder på en unik måte. Som en bonus sparer vi massevis av plass i databasen.

Alt dette høres bra ut, ikke sant? Det gjør det sikkert. Men som vi vet, det er sjelden noen gratis lunsjer i verden av programvareutvikling. I dette tilfellet er kostnadene for dette smakfulle måltidet ytelse, spesielt for lesing og samlede operasjoner. Søket går ganske raskt, takket være alle de praktiske primære tastene. Men la oss late som om vi ønsker å lage en salgsrapport i slutten av måneden som ser ut som tabellen vår før normalisering; Vi må utføre et langvarig spørsmål (tross alt, vi tar en måneds data) som må utføre JOIN-operasjoner på alle disse tabellene. I prosessen må vi låse alle disse radene og generelt sette fast databasen i prosessen. Det er gode grunner til at rapporter blir kjørt om natten, og dette er en av dem.

Vi løser dette problemet med et datavarehus. (Jeg har ikke tenkt å gå langt inn på datalagerteori, som er et dypt emne.) Et datavarehus er designet for ren lesehastighet og ser vanligvis ut som en de-normalisert tabell. Måten et datavarehus vanligvis fungerer er å periodisk ta et "øyeblikksbilde" av den elektroniske, relasjonsdatabasen som brukes til det daglige arbeidet og lage en rekke de-normaliserte tabeller, hver for å oppfylle en bestemt rapportering trenge. Derfra kjøres rapporter mot dataene på lageret. På denne måten kan de langvarige, ressurssultne rapportene kjøres mot tabeller som er optimalisert for disse rapportenes behov uten å binde opp online databasen. Ulempen er betydelig kostnad ved å ha ekstra databaseservere og lagring, og det faktum at du rapporterer mot data som ikke er sanntidsnøyaktige.

Jeg håper dette hjelper deg med å komme deg videre til å forstå databaser bedre.

Beslektede TechRepublic ressurser

  • Få praktiske tips om database-normalisering
  • Normalisering: Hvor langt er langt nok?
  • Normalisering av databaser starter med tastene
  • Å være eller ikke være normal: Det er databasespørsmålet

J.Ja

Avsløring av Justin's industri-tilknytning: Justin James har en kontrakt med Spiceworks for å skrive produktkjøpsguider. Han er også under kontrakt med OpenAmplify, som eies av Hapax, for å skrive en serie blogger, opplæringsprogrammer og andre artikler.

-------------------------------------------------- -------------------------------------

Få ukentlige utviklingstips i innboksen Hold utviklerferdighetene dine skarpe ved å registrere deg på TechRepublics gratis nyhetsbrev for Web Developer, levert hver tirsdag. Abonner automatisk i dag!

© Copyright 2020 | mobilegn.com