En korrekt designet database giver dig adgang til nøjagtige oplysninger, der er opdateret. Da et korrekt design er afgørende for, at du når dine mål i arbejdet med en database, er det værd at investere den tid, der kræves for lære principperne for godt design. I sidste ende er der meget større sandsynlighed for, at du ender med en database, der opfylder dine behov, og som nemt kan tilpasses ændringer.
I denne artikel får du retningslinjer for planlægning af en skrivebordsdatabase. Du lærer at beslutte, hvilke oplysninger du har brug for, hvordan du inddeler disse oplysninger i de rette tabeller og kolonner, og hvordan disse tabeller er relateret til hinanden. Du bør læse denne artikel, før du opretter din første skrivebordsdatabase.
Vigtigt!: Access giver designoplevelser, der gør det muligt at oprette databaseprogrammer til internettet. Mange designovervejelser er anderledes, når du designer til internettet. I denne artikel diskuteres der ikke design af webdatabaseprogrammer. Du kan få mere at vide i artiklen Opbyg en database, der skal deles på internettet.
I denne artikel
Nogle vigtige databaseudtryk
Access organiserer dine oplysninger itabeller: lister af rækker og kolonner, der minder om en bogholders blok eller et regneark. I en simpel database har du muligvis kun én tabel. Til de fleste databaser skal du bruge mere end én. Du kan f.eks. have en tabel, der lagrer oplysninger om produkter, en anden tabel, der lagrer oplysninger om ordrer, og en anden tabel med oplysninger om kunder.
Hver række kaldes mere korrekt en post,og hver kolonne, et felt. En post er en meningsfuld og ensartet måde at kombinere oplysninger om noget på. Et felt er et enkelt oplysningselement – en elementtype, der vises i hver post. I tabellen Produkter indeholder hver række eller post f.eks. oplysninger om ét produkt. Hver kolonne eller hvert felt indeholder nogle typer oplysninger om det pågældende produkt, f.eks. dets navn eller pris.
Hvad er et godt databasedesign?
Der er visse principper, som udgør en vejledning for processen med at designe en database. Det første princip er, at dublerede oplysninger (også kaldet overflødige data) er noget makværk, fordi det er spild af plads og øger risikoen for fejl og uoverensstemmelser. Det andet princip er, at oplysningernes korrekthed og fuldstændighed er vigtig. Hvis databasen indeholder forkerte oplysninger, vil alle rapporter, der trækker oplysninger fra databasen, også indeholde forkerte oplysninger. Som resultat deraf vil de beslutninger, du træffer, som er baseret på disse rapporter, derfor bygge på et forkert grundlag.
Et godt databasedesign er derfor et, som:
-
Opdeler dine oplysninger i emnebaserede tabeller for at reducere mængden af redundante data.
-
Giver Acces de oplysninger, der er nødvendige for at sammenføje oplysningerne i tabellerne efter behov.
-
Er med til at understøtte og sikre dine oplysningers nøjagtighed og integritet.
-
Er tilpasset dine data- og rapporteringsbehov.
Designprocessen
Designprocessen består af følgende trin:
-
Fastslå formålet med databasen
Dette er med til at forberede dig til de resterende trin.
-
Find og organiser de nødvendige oplysninger
Indhent alle de typer oplysninger, du vil registrere i databasen, f.eks. produktnavn og ordrenummer.
-
Inddel oplysningerne i tabeller
Inddel dine oplysningselementer i overordnede enheder eller emner såsom Produkter eller Ordrer. Hvert emne bliver så til en tabel.
-
Omdan oplysningselementer til kolonner
Beslut, hvilke oplysninger du vil gemme i hver tabel. Hvert element bliver til et felt og vises som en kolonne i tabellen. Tabellen Medarbejdere kan f.eks. indeholde felter som Efternavn og Ansættelsesdato.
-
Angiv primære nøgler
Vælg en primær nøgle for hver tabel. Den primære nøgle er en kolonne, der bruges til entydigt at identificere hver række. Et eksempel kan være Produkt-id eller Ordre-id.
-
Konfigurer tabelrelationerne
Kig på hver tabel, og beslut, hvordan dataene i den ene tabel er relateret til data i andre tabeller. Føj felter til tabeller, eller opret nye tabeller for at tydeliggøre relationer, som det er nødvendigt.
-
Tilpas dit design
Analysér dit design for fejl. Opret tabellerne, og tilføj nogle få poster med eksempeldata. Se, om du kan hente de ønskede resultater fra tabellerne. Foretag justeringer i designet efter behov.
-
Anvend normaliseringsreglerne
Anvend datanormaliseringsreglerne for at se, om tabellerne er struktureret korrekt. Foretag justeringer i tabellerne efter behov.
Fastslå formålet med databasen
Det er en god ide at skrive formålet med databasen ned på papir – dens formål, hvordan du forventer at bruge den, og hvem der skal bruge den. Til en lille database til en hjemmebaseret virksomhed kan du f.eks. skrive noget simpelt som "Kundedatabasen fører en liste over kundeoplysninger med henblik på produktion af forsendelser og rapporter". Hvis databasen er mere kompleks eller bruges af mange personer, som det ofte forekommer i virksomhedens indstillinger, kan formålet nemt være et afsnit eller mere og bør omfatte, hvornår og hvordan hver person skal bruge databasen. Idéen er at have en veludviklet missionserklæring, der kan henvises til i hele designprocessen. At have en sådan sætning hjælper dig med at fokusere på dine mål, når du træffer beslutninger.
Find og organiser de nødvendige oplysninger
Start med dine eksisterende oplysninger for at finde og organisere de nødvendige oplysninger. Du kan f.eks. registrere indkøbsordrer i en hovedbog eller beholde kundeoplysninger på papirformularer i et arkivskab. Saml disse dokumenter, og angiv hver type oplysninger, der vises (f.eks. hvert felt, du udfylder i en formular). Hvis du ikke har nogen eksisterende formularer, skal du i stedet forestille dig, at du er nødt til at designe en formular til at registrere kundeoplysningerne. Hvilke oplysninger skal formularen have? Hvilke udfyldningsfelter ville du oprette? Identificer og vis hver af disse elementer. Lad os f.eks. antage, at du i øjeblikket har kundelisten på indekskort. Når du undersøger disse kort, kan det vise, at hvert kort indeholder et kundenavn, adresse, by, stat, postnummer og telefonnummer. Hver af disse elementer repræsenterer en potentiel kolonne i en tabel.
Når du forbereder denne liste, skal du ikke bekymre dig om at gøre det hele perfekt i første forsøg. Prøv i stedet at angive alle de elementer, du kommer i tanke om. Hvis andre skal bruge databasen, kan du også spørge dem om deres ideer. Du kan finjustere listen senere.
Dernæst skal du overveje, hvilke typer rapporter eller forsendelser du måske vil producere fra databasen. Det kan f.eks. være, at du vil have en produktsalgsrapport til at vise salg efter område eller en lageroversigtsrapport, der viser produktlagerniveauer. Det kan også være en god ide at generere breve, der skal sendes til kunder, der annoncerer en salgsbegivenhed eller tilbyder en præmie. Design rapporten i dit hoved, og forestil dig, hvordan den vil se ud. Hvilke oplysninger skal anbringes i rapporten? Vis hvert element. Gør det samme for formularbrevet og for enhver anden rapport, du forventer at skulle oprette.
At overveje de rapporter og forsendelser du måske kommer til at oprette, hjælper dig med at identificere de elementer, du skal bruge i databasen. Antag eksempelvis, at du giver kunderne mulighed for at tilmelde sig (eller framelde sig) periodiske mailopdateringer, og du vil udskrive en liste over dem, der har tilmeldt sig. For at registrere disse oplysninger tilføjer du en kolonne med navnet "Send mail" i tabellen. For hver kunde kan du angive feltet til Ja eller Nej.
Kravet om at sende mails til kunder medfører, at der skal registreres endnu et element. Når du ved, at en kunde ønsker at modtage mails, skal du også kende den mailadresse, du skal sende dem til. Derfor skal du registrere en mailadresse for hver kunde.
Det giver god mening at oprette en model af hver rapport eller outputliste og overveje, hvilke elementer du skal bruge til at oprette rapporten. Når du f.eks. undersøger et formularbrev, kan der komme et par ting i baghovedet. Hvis du vil medtage en rigtig hilsen – f.eks. strengen "Hr.", "Fru" eller "Frk.", der starter en hilsen, skal du oprette et hilsenelement. Du kan også typisk starte et brev med "Kære Hr. Smith" i stedet for "Kære. Hr. Sylvester Smith". Det foreslår, at du typisk vil gemme efternavnet adskilt fra fornavnet.
Et vigtigt punkt at huske er, at du bør inddele hver enkelt oplysning i dens mindste brugbare dele. Hvis du har et navn, og du vil gøre efternavnet tilgængeligt, skal du opdele navnet i to dele – Fornavn og Efternavn. Hvis du f.eks. vil sortere en rapport efter efternavn, hjælper det at få kundens efternavn gemt separat. Hvis du vil sortere, søge, beregne eller rapportere baseret på et oplysningselement, bør du generelt placere det pågældende element i sit eget felt.
Tænk over de spørgsmål, du måske gerne vil have databasen til at besvare. Hvor mange salg af dit udvalgte produkt lukkede du f.eks. sidste måned? Hvor bor dine bedste kunder? Hvem er leverandøren af dit bedst sælgende produkt? Ved at forudse disse spørgsmål kan du finde svar på yderligere elementer, der skal registreres.
Efter at have indsamlet disse oplysninger er du klar til det næste trin.
Inddel oplysningerne i tabeller
Hvis du vil inddele oplysningerne i tabeller, skal du vælge de overordnede enheder eller emner. Efter at have fundet og organiseret oplysninger om en produktsalgsdatabase kan den foreløbige liste f.eks. se således ud:
De overordnede enheder, der er vist her, er produkterne, leverandørerne, kunderne og ordrerne. Det giver derfor mening at starte med disse fire tabeller: en til fakta om produkter, én til fakta om leverandører, én til fakta om kunder og en til fakta om ordrer. Selvom det ikke fuldfører listen, er det et godt sted at starte. Du kan fortsætte med at finjustere listen, indtil du har et design, der fungerer godt.
Når du første gang gennemser den foreløbige liste over elementer, kan det være fristende at samle dem alle i én enkelt tabel i stedet for de fire, der er vist i den foregående illustration. Du finder ud af her, hvorfor det er en dårlig ide. Overvej et øjeblik den tabel, der er vist her:
I dette tilfælde indeholder hver række oplysninger om både produktet og dets leverandør. Da du kan have mange produkter fra den samme leverandør, skal oplysninger om leverandørens navn og adresse gentages mange gange. Det er spild af diskplads. Det er en meget bedre løsning kun at registrere leverandøroplysningerne én gang i en separat tabel med Leverandører, og derefter sammenkæde den pågældende tabel med tabellen Produkter.
Et andet problem med dette design bliver tydeligt, når du vil redigere oplysninger om leverandøren. Antag f.eks., at du vil ændre en leverandørs adresse. Da den vises mange forskellige steder, ændrer du måske adressen ved et uheld ét sted, men glemmer at ændre den de andre steder. Du løser dette problem ved kun at registrere leverandørens adresse ét sted.
Når du designer din database, skal du altid kun prøve at registrere hvert enkelt fakta én gang. Hvis du gentager de samme oplysninger mere end ét sted, f.eks. adressen på en bestemt leverandør, skal du placere oplysningerne i en separat tabel.
Et sidste scenarie kan være, at Coho Winery kun leverer ét produkt, som du gerne vil slette, men du vil gerne bevare oplysningerne om leverandørens navn og adresse. Hvordan vil du med slette produktposten uden at miste leverandøroplysningerne? Det kan du ikke. Da hver post indeholder oplysninger om et produkt samt oplysninger om en leverandør, kan du ikke slette det ene uden også at slette det andet. Du kan derfor inddele den ene tabel i to dele for at holde disse oplysninger adskilt: den første til produktoplysninger og den anden til leverandøroplysninger. Når du sletter en produktpost, sletter du så kun oplysningerne om produktet, og ikke oplysningerne om leverandøren.
Når du har valgt det emne, der er repræsenteret af en tabel, bør kolonnerne i den pågældende tabel kun gemme oplysninger om emnet. Eksempelvis skal produkttabellen kun indeholde oplysninger om produkter. Da leverandøradressen er en oplysning om leverandøren og ikke en oplysning om produktet, hører det til i leverandørtabellen.
Omdan oplysningselementer til kolonner
For at bestemme kolonnerne i en tabel skal du beslutte, hvilke oplysninger der skal registreres om emnet i tabellen. Til tabellen Kunder kunne Navn, Adresse, Postnummer By, Send mail, Starthilsen og Mailadresse være et godt udgangspunkt for listen over kolonner. Hver post i tabellen indeholder det samme sæt af kolonner, så du kan gemme oplysninger om Navn, Adresse, Postnummer By, Send mail, Starthilsen og Mailadresseoplysninger for hver post. Eksempelvis indeholder adressekolonnen kundernes adresser. Hver post indeholder data om én kunde, og adressefeltet indeholder adressen på den pågældende kunde.
Når du har fastlagt det indledende sæt kolonner for hver tabel, kan du indskrænke kolonnerne yderligere. Det giver f.eks. mening at gemme kundenavnet som to separate kolonner: fornavn og efternavn, så du kan sortere, søge og indeksere kun på disse kolonner. På samme måde består adressen faktisk af fem separate komponenter, adresse, by, stat, postnummer og land/område, og det giver også mening at gemme dem i separate kolonner. Hvis du f.eks. vil udføre en søgning, filtrere eller sortere efter tilstand, skal du bruge oplysninger om tilstand gemt i en separat kolonne.
Du bør også overveje, om databasen skal indeholde oplysninger, der kun er nationale eller kun internationale. Hvis du f.eks. planlægger at gemme internationale adresser, er det bedre at have en områdekolonne i stedet for Stat, da en sådan kolonne kan tage højde for både nationale stater og områder i andre lande/områder. På samme måde giver postnummer mere mening end postnummer, hvis du skal gemme internationale adresser.
Følgende liste viser nogle tip til at beslutte dig for dine kolonner.
-
Medtag ikke beregnede data
I de fleste tilfælde bør du ikke gemme resultatet af beregninger i tabeller. Du kan i stedet få Access til at udføre beregningerne, når du vil se resultatet. Antag f.eks., at der er en rapport for Produkter på ordre, der viser subtotalen for enheder på ordre for hver kategori af produkt i databasen. Der er dog ingen subtotalkolonne for Enheder på ordre i nogen tabel. I stedet indeholder tabellen Produkter kolonnen Enheder på ordre, der lagrer enhederne i rækkefølge for hvert produkt. Ved hjælp af disse data beregner Access subtotalen, hver gang du udskriver rapporten. Selve subtotalen skal ikke gemmes i en tabel.
-
Gem oplysninger i deres mindste logiske dele
Det kan være fristende at have et enkelt felt til fulde navne eller til produktnavne sammen med produktbeskrivelser. Hvis du kombinerer mere end én type oplysninger i et felt, er det svært at hente individuelle oplysninger senere. Prøv at opdele oplysninger i logiske dele. Du kan f.eks. oprette separate felter til for- og efternavn eller til produktnavn, kategori og beskrivelse.
Når du har justeret datakolonnerne i hver tabel, er du klar til at vælge en primær nøgle for hver tabel.
Angiv primære nøgler
Hver tabel indeholder en kolonne eller et sæt af kolonner, som entydigt identificerer hver række, der er gemt i tabellen. Dette er ofte et entydigt id, såsom et medarbejder-id eller et serienummer. I databaseterminologi kaldes oplysningerne for tabellens primære nøgle. Access bruger primær nøglefelter til hurtigt at tilknytte data fra flere tabeller og samle data for dig.
Hvis du allerede har et entydig identifier til en tabel, f.eks. et produktnummer, der entydigt identificerer hvert produkt i kataloget, kan du bruge den pågældende identifikator som tabellens primære nøgle – men kun hvis værdierne i denne kolonne altid vil være forskellige for hver post. Du kan ikke have dublerede værdier i en primær nøgle. Brug f.eks. ikke folks navne som en primær nøgle, da navne ikke er entydige. Du kan nemt have to personer med det samme navn i den samme tabel.
En primær nøgle skal altid have en værdi. Hvis en kolonnes værdi kan blive ikke-tildelt eller ukendt (en manglende værdi) på et tidspunkt, kan den ikke bruges som en komponent i en primær nøgle.
Du bør altid vælge en primær nøgle, hvis værdi ikke ændres. En tabels primære nøgle kan bruges som reference i andre tabeller i en database, der anvender mere end én tabel. Hvis den primære nøgle ændres, skal ændringen også anvendes overalt, hvor der refereres til nøglen. Når du bruger en primær nøgle, der ikke ændres, reduceres risikoen for, at den primære nøgle ikke bliver synkroniseret med andre tabeller, der refererer til den.
Et vilkårligt entydigt tal bruges ofte som den primære nøgle. Du kan f.eks. tildele hver ordre et entydigt ordrenummer. Ordrenummerets eneste formål er at identificere en ordre. Når den er tildelt, ændres den aldrig.
Hvis du ikke har i tankerne en kolonne eller et sæt af kolonner, der kan være en god primær nøgle, kan du overveje at bruge en kolonne med datatypen Autonummerering. Når du bruger datatypen Autonummerering, tildeler Access automatisk en værdi for dig. En sådan identifikator er factless; den indeholder ingen faktiske oplysninger, der beskriver den række, den repræsenterer. Factless identifiers are ideal for use as a primary key because they do not change. En primær nøgle, der indeholder oplysninger om en række – f.eks. et telefonnummer eller et kundenavn – vil blive ændret, fordi selve de faktiske oplysninger kan blive ændret.
1. En kolonne, der er angivet til datatypen Automatisk nummerering udgør ofte en god primær nøgle. Der er ikke to produkt-id'er, der er ens.
I nogle tilfælde kan det være en ide at bruge to eller flere felter, som tilsammen udgør den primære nøgle for en tabel. Eksempelvis bruger en tabel med ordreoplysninger, der gemmer linjeelementer til ordrer, måske to kolonner til den primære nøgle: Ordre-id og produkt-id. Når en primær nøgle anvender mere end én kolonne, kaldes den også en sammensat nøgle.
Du kan oprette kolonnen Automatisk nummerering for hver af tabellerne som primær nøgle for produktsalgsdatabasen: Produkt-id for tabellen Produkter, Ordre-id for tabellen Ordrer, Kunde-id for tabellen Kunder og Leverandør-id for tabellen Leverandører.
Opret tabelrelationerne
Nu, hvor du har opdelt dine oplysninger i tabeller, skal du bruge en metode til at samle oplysningerne igen på en meningsfuld måde. Følgende formular indeholder oplysninger fra flere tabeller.
1. Oplysningerne i denne formular stammer fra tabellen Kunder...
2. ... tabellen Medarbejdere ...
3. ... tabellen Ordrer ...
4. ... tabellen Produkter ...
5. ... og tabellen Ordredetaljer.
Access er et relationsdatabasesystem. I en relationsdatabase inddeler du oplysningerne i separate, emnebaserede tabeller. Du kan derefter bruge tabelrelationer til at samle oplysninger efter behov.
Opret en en-til-mange-relation
Overvej dette eksempel: Tabellerne Leverandører og Produkter i produktordredatabasen. En leverandør kan levere et vilkårligt antal produkter. Det følger, at for en hvilken som helst leverandør, der er repræsenteret i tabellen Leverandører, kan der være mange produkter repræsenteret i tabellen Produkter. Relationen mellem tabellen Leverandører og tabellen Produkter er derfor en en-til-mange-relation.
Hvis du vil repræsentere en en til mange-relation i databasedesignet, skal du tage den primære nøgle på en-siden af relationen og tilføje den som en eller flere ekstra kolonner i tabellen på mange-siden af relationen. I dette tilfælde skal du f.eks. føje kolonnen Leverandør-id fra tabellen Leverandører til tabellen Produkter. Access kan derefter bruge leverandør-id'et i tabellen Produkter til at finde den rigtige leverandør til hvert produkt.
Kolonnen Leverandør-id i tabellen Produkter kaldes en fremmed nøgle. En fremmed nøgle er en anden tabels primære nøgle. Kolonnen Leverandør-id i tabellen Produkter er en fremmed nøgle, fordi den også er den primære nøgle i tabellen Leverandører.
Du levere grundlaget for at sammenføje relaterede tabeller ved at danne par mellem primære nøgler og fremmede nøgler. Hvis du ikke er sikker på, hvilke tabeller der skal dele en fælles kolonne, kan du ved at identificere en en-til-mange-relation sikre dig, at de to pågældende tabeller rent faktisk kræver en delt kolonne.
Opret en mange-til-mange-relation
Lad os se på relationen mellem tabellen Produkter og tabellen Ordrer.
En enkelt ordre kan omfatte mere end ét produkt. Og et enkelt produkt kan forekomme i mange ordrer. Derfor kan der for hver post i tabellen Ordrer være mange poster i tabellen Produkter. Og for hver post i tabellen Produkter kan der være mange poster i tabellen Ordrer. Denne type relation kaldes en mange til mange-relation, fordi der kan være mange ordrer for et hvilket som helst produkt. og for enhver ordre kan der være mange produkter. Bemærk, at hvis du vil registrere mange til mange-relationer mellem tabellerne, er det vigtigt, at du overvejer begge sider af relationen.
Emnerne i de to tabeller – ordrer og produkter – har en mange til mange-relation. Dette udgør et problem. For at forstå problemet skal du forestille dig, hvad der ville ske, hvis du forsøgte at oprette relationen mellem de to tabeller ved at tilføje feltet Produkt-id i tabellen Ordrer. Hvis du vil have mere end ét produkt pr. ordre, har du brug for mere end én post pr. ordre i tabellen Ordrer. Du ville ende med at gentage ordreoplysninger for hver række, der relaterer til en enkelt ordre – hvilket medfører et ineffektivt design, der kan føre til unøjagtige data. Du støder på det samme problem, hvis du placerer feltet Ordre-id i tabellen Produkter – så har du mere end én post i tabellen Produkter for hvert produkt. Hvordan kan problemet løses?
Løsningen er at oprette en tredje tabel, ofte kaldet en samlingstabel, der opdeler mange-til-mange-relationen i to en-til-mange-relationer. Du kan indsætte den primære nøgle fra hver af de to tabeller i den tredje tabel. Den tredje tabel registrerer dermed hver forekomst eller instans af relationen.
Hver post i tabellen Ordredetaljer repræsenterer ét linjeelement på en ordre. Den primære nøgle for tabellen Ordredetaljer består af to felter – de fremmede nøgler fra tabellerne Ordrer og tabellen Produkter. Det fungerer ikke at bruge feltet Ordre-id alene som den primære nøgle for denne tabel, fordi én ordre kan have mange linjeelementer. Ordre-id'et gentages for hvert linjeelement på en ordre, så feltet indeholder ikke entydige værdier. Det fungerer heller ikke kun at bruge feltet Produkt-id, fordi ét produkt kan være til stede i mange forskellige ordrer. Men sammen giver de to felter altid en entydig værdi for hver post.
I produktsalgsdatabasen er tabellen Ordrer og tabellen Produkter ikke direkte relateret til hinanden. I stedet er de indirekte relateret via tabellen Ordredetaljer. Mange-til-mange-relationen mellem ordrer og produkter er repræsenteret i databasen ved hjælp af to en-til-mange-relationer:
-
Tabellen Ordrer og tabellen Ordredetaljer har en en-til-mange-relation. Hver ordre kan have mere end ét linjeelement, men hvert linjeelement er kun forbundet til én ordre.
-
Tabellen Produkter og tabellen Ordredetaljer har en en-til-mange-relation. Hvert produkt kan have mange linjeelementer, der er knyttet til det, men hvert linjeelement refererer kun til ét produkt.
I tabellen Ordredetaljer kan du se alle produkterne på en bestemt ordre. Du kan også se alle ordrer på et bestemt produkt.
Efter at have inkorporeret tabellen Ordredetaljer kan listen over tabeller og felter se omtrent sådan ud:
Oprette en en til en-relation
En anden type relation er en en-til-en-relation. Antag f.eks., at du skal registrere nogle særlige supplerende produktoplysninger, som du sjældent skal bruge, eller som kun gælder for nogle få produkter. Da du ikke har brug for oplysningerne ofte, og fordi lagring af oplysningerne i tabellen Produkter resulterer i tomme pladser for hvert af de produkter, de ikke er gældende for, skal du placere dem i en separat tabel. Ligesom med tabellen Produkter bruger du Produkt-id som den primære nøgle. Forholdet mellem denne supplerende tabel og tabellen Produkter er en-til-en-relation. For hver post i tabellen Produkter findes der en enkelt matchende post i den supplerende tabel. Når du identificerer sådan en relation, skal begge tabeller have et felt til fælles.
Når du registrerer behovet for en-til-en-relation i din database, skal du overveje, om du kan sammensætte oplysningerne fra de to tabeller i én tabel. Hvis du af en eller anden grund ikke vil gøre det, måske fordi det resulterer i en masse tomme pladser, kan du i den følgende liste se, hvordan du kan repræsentere relationen i dit design:
-
Hvis de to tabeller ikke har det samme emne, kan du sandsynligvis konfigurere relationen ved at bruge den samme primære nøgle i begge tabeller.
-
Hvis de to tabeller har forskellige emner med forskellige primære nøgler, skal du vælge en af tabellerne (lige meget hvilken) og indsætte dens primære nøgle i den anden tabel som en fremmed nøgle.
Ved at fastslå relationer mellem tabeller kan du sikre dig, at du har de rette tabeller og kolonner. Når der findes en en-til-en- eller en en-til-mange-relation, skal de tabeller, det drejer sig om, have en eller flere fælles kolonner. Når der findes en mange-til-mange-relation, er der brug for en tredje tabel til at repræsentere relationen.
Finjuster designet
Når du har de tabeller, felter og relationer, du skal bruge, skal du oprette og udfylde tabellerne med eksempeldata og prøve at arbejde med oplysningerne: oprette forespørgsler, tilføje nye poster osv. Dette hjælper med at fremhæve potentielle problemer – det kan f.eks. være nødvendigt at tilføje en kolonne, som du har glemt at indsætte i designfasen, eller du har måske en tabel, som du skal opdele i to tabeller for at fjerne dublet.
Se, om du kan bruge databasen til at få de svar, du ønsker. Opret grove udkast til formularer og rapporter, og se, om de viser de data, du forventer. Hold øje med unødvendig duplikering af data, og rediger dit design for at fjerne dubletterne, når du finder dem.
Når du afprøver din første database, vil du sikkert opdage, at der er plads til forbedring. Her er nogle ting, du skal kontrollere:
-
Har du glemt nogen kolonner? Hvis det er tilfældet, hører oplysningerne så til i de eksisterende tabeller? Hvis det er oplysninger om noget andet, skal du muligvis oprette en anden tabel. Opret en kolonne for hvert oplysningselement, du skal registrere. Hvis oplysningerne ikke kan beregnes ud fra andre kolonner, er det sandsynligt, at du skal bruge en ny kolonne til dem.
-
Er nogle af kolonnerne unødvendige, fordi de kan beregnes ud fra eksisterende felter? Hvis et oplysningselement kan beregnes ud fra andre eksisterende kolonner – f.eks. en nedsat pris beregnet ud fra detailprisen – er det normalt bedre at gøre netop dette og undgå at oprette en ny kolonne.
-
Indtaster du gentagne gange de samme oplysninger i en af tabellerne? Hvis det er tilfældet, skal du sandsynligvis dele tabellen i to tabeller, der har en en-til-mange-relation.
-
Har du tabeller med mange felter, et begrænset antal poster og mange tomme felter i individuelle poster? Hvis det er tilfældet, skal du overveje at ændre tabellens design, så den har færre felter og flere poster.
-
Er hvert oplysningselement blevet opdelt i dets mindste brugbare dele? Hvis du vil rapportere, sortere, søge eller beregne på et oplysningselement, skal du placere det pågældende element i sin egen kolonne.
-
Indeholder hver kolonne en oplysning om tabellens emne? Hvis en kolonne ikke indeholder oplysninger om tabellens emne, hører det til i en anden tabel.
-
Er alle relationer mellem tabeller repræsenteret enten af almindelige felter eller af en tredje tabel? En-til-en- og en-til-mange-relationer kræver fælles kolonner. Mange-til-mange-relationer kræver en tredje tabel.
Finjustering af tabellen Produkter
Antag, at hvert produkt i produktsalgsdatabasen falder inden for en generel kategori, f.eks. drikkevarer, tilbehør eller fisk og fisk. Tabellen Produkter kan indeholde et felt, der viser kategorien for hvert produkt.
Antag, at du efter at have undersøgt og finjusteret databasens design beslutter dig for at gemme en beskrivelse af kategorien sammen med dens navn. Hvis du tilføjer feltet Beskrivelse af kategori i tabellen Produkter, skal du gentage hver kategoribeskrivelse for hvert produkt, der falder inden for kategorien – dette er ikke en god løsning.
En bedre løsning er at gøre Kategorier til et nyt emne, som databasen skal registrere, og give det sin egen tabel og sin egen primære nøgle. Du kan derefter tilføje den primære nøgle fra tabellen Kategorier i tabellen Produkter som en fremmed nøgle.
Tabellerne Kategorier og Produkter har en en-til-mange-relation: En kategori kan indeholde mere end ét produkt, men et produkt kan kun tilhøre én kategori.
Når du gennemser dine tabelstrukturer, skal du være på udkig efter gentagne grupper. Overvej f.eks. en tabel, der indeholder følgende kolonner:
-
Produkt-id
-
Navn
-
Produkt-id1
-
Navn1
-
Produkt-id2
-
Navn2
-
Produkt-id3
-
Navn3
Her er hvert produkt en gentagende gruppe af kolonner, der kun adskiller sig fra de andre ved at tilføje et tal i slutningen af kolonnenavnet. Når du ser kolonner, der er nummereret på denne måde, skal du genoverveje dit design.
Sådan et design har flere svagheder. For det første tvinger det dig til at sætte en øvre grænse for antallet af produkter. Så snart du overskrider denne grænse, skal du tilføje en ny gruppe af kolonner i tabelstrukturen, hvilket er en større administrativ opgave.
Et andet problem er, at de leverandører, der har færre end det maksimale antal produkter, vil spilde noget plads, da de ekstra kolonner vil være tomme. Den største fejl ved et sådant design er, at det gør mange opgaver svære at udføre, f.eks. sortering eller indeksering af tabellen efter produkt-id eller navn.
Når du opdager gentagende grupper, skal du gennemgå designet omhyggeligt med henblik på at opdele tabellen i to. I eksemplet ovenfor er det bedre at bruge to tabeller – én til leverandører og én til produkter – sammenkædet med leverandør-id.
Anvend normaliseringsreglerne
Du kan anvende datanormaliseringsreglerne (sommetider blot kaldet normaliseringsregler) som det næste trin i dit design. Du bruger disse regler til at se, om tabellerne er struktureret korrekt. Processen med at anvende regler på databasedesignet kaldes normalisering af databasen, eller bare normalisering.
Normalisering er især nyttigt, når du har angivet alle oplysningerne og har opnået midlertidigt design. Formålet er at hjælpe dig med at sikre, at du har opdelt dine oplysningselementer i de rette tabeller. Normalisering kan dog ikke sikre, at du har alle de korrekte dataelementer til at starte med.
Du skal anvende reglerne i rækkefølge på hvert enkelt trin for at sikre, at dit design ender med at have en af de såkaldte "normalformer". Fem normalformer er generelt anerkendt – fra den første normalform til den femte normalform. Denne artikel beskæftiger sig med de første tre, fordi de dækker alt, hvad der kræves for størstedelen af databasedesigns.
Første normalformular
Første normalform siger, at der ved hver skæring mellem rækker og kolonner i tabellen findes en enkelt værdi og aldrig en liste over værdier. Du kan f.eks. ikke have et felt med navnet Pris, hvor du placerer mere end én pris. Hvis du ser hvert skæringspunkt mellem rækker og kolonner som en celle, kan hver celle kun indeholde én værdi.
Anden normalform
Anden normalform kræver, at hver kolonne, der ikke er en nøgle, er fuldt afhængig af hele den primære nøgle og ikke kun en del af nøglen. Denne regel gælder, når du har en primær nøgle, der består af mere end én kolonne. Antag f.eks., at du har en tabel, der indeholder følgende kolonner, hvor Ordre-id og Produkt-id udgør den primære nøgle:
-
Ordre-id (primær nøgle)
-
Produkt-id (primær nøgle)
-
Produktnavn
Dette design overtræder anden normalform, fordi kolonnen Produktnavn er afhængig af Produkt-id, men ikke af Ordre-id, så den er ikke afhængig af hele den primære nøgle. Du skal fjerne Produktnavn fra tabellen. Den hører til i en anden tabel (Produkter).
Tredje normalform
Tredje normalform kræver ikke bare, at enhver kolonne, der ikke er en nøgle, skal være afhængig af den primære nøgle, men også at kolonner, som ikke er nøgler, skal være uafhængige af hinanden.
En anden måde at sige det på er, at hver kolonne, der ikke er en nøgle, skal være afhængig af den primære nøgle og intet andet end den primære nøgle. Antag f.eks., at du har en tabel, der indeholder følgende kolonner:
-
Produkt-id (primær nøgle)
-
Navn
-
Vejledende udsalgspris
-
Rabat
Antag, at Rabat afhænger af den vejledende udsalgspris. Denne tabel overholder ikke tredje normalform, fordi kolonnen Rabat, som ikke er en nøgle, er afhængig af en anden kolonne, som ikke er en nøgle, nemlig Vejledende udsalgspris. Kolonneuafhængighed betyder, at du skal kunne ændre eventuelle kolonner, som ikke er nøgler, uden at det påvirker andre kolonner. Hvis du ændrer en værdi i feltet Vejledende udsalgspris, ændres Rabat tilsvarende og overtræder dermed denne regel. I dette tilfælde bør Rabat flyttes til en anden tabel, som bruger Vejledende udsalgspris som nøgle.