08. juli 2002 - 09:17Der er
11 kommentarer og 1 løsning
Relationel database-design
Jeg skal lave en database til en skakturnering - hver spiller deltager i X kampe og hver kamp afvikles af 2 spillere, hvilke tabeller og tilhørende primærnøgler er nødvendige ?
Efter ti år i London, Madrid, Paris og Utrecht kommer Sabios AI-fokuserede program af arrangementer om kundeoplevelser, ‘Disrupt’, for første gang til Danmark.
Du skal have en tabel til spillere med en primær nøgle. Kald den "Spiller". Derefter en tabel til kampene også med en primær nøgle. Lav en 3. tabel med kombinationsbokse til spillerfeltet og kampfeltet i de øvrige tabeller. Træk relationer mellem tabellerne med typen "alle poster fra tabel3". Denne tabel skal nødvendigvis ikke have en primær nøgle.
Tabellerne "Spiller" og "Kamp" er dit lager af informationer. I Spiller kan du oprette alle informationer om spillerne, klub, adresse, erfaring o.s.v. I Kamp opretter du kampene med tilhørende informationer som tidspunkt, hvor o.s.v.
Den tredje tabel skal indeholde mindst 2 felter: 1 kombinationsboks hvor du vælger en spiller, og en anden kombinationsboks hvos du vælger en kamp. Når du har laver relationerne, kan du lave en forespørgsel, hvor disse 2 felter en med, indsæt derefter de tilhørende felter fra tabellerne "Spiller" og "Kamp". Du vil nu få vist alle data om spiller og kamp
En kombinationsboks laver du i tabeldesign. I Feltegenskaberne under fanen opslag kan du vælge om feltet skal være en kombinationsboks, det sikrer bl.a. mod stavefejl: Hvis du f.eks. laver en rapport over turneringens resultat er det vel ikke særlig heldigt, hvis du den ene gang staver et navn Christian og den næste Kristian.
Jeg siger ikke, at den 3. tabel løser noget problem, det er blot den måde jeg ville foretrække at lave det.
Hvis du lægger din e-mail kan jeg strikke et emsempel sammen i Access97.
Hvor de to sidste felter er henvisninger til Primærnøglen i Spillertabellen.
Men du kan få problemer med at lave skærmbilleder/rapporter til din database, når spillernes kampdeltagelse fremgår at to og ikke blot et felt. Ikke værre, end at det kan klares, men nok til at gøre basen lidt kompliceret at have med at gøre.
Den bedste løsning er derfor, som mugs siger: lav tre tabeller. Spiller, Kamp og så en tredje Kampdeltagelse.
Spiller indeholder stadig Spillernr, Fornavn, Efternavn etc.
Kamp indeholder nu kun Kampnr, Tidspunkt, Sted, Resultat.... (ikke Spiller1 og Spiller2)
Kampdeltagelse, som er en relationstabel, indeholder referencer til primærnøgler i Spiller og Kamp: Spillernr, Kampnr
Access har nogle bekvemme indretninger til indtastning af sådanne referencer til primærnøgler. Ellers er det ikke specielt sjovt at skulle lægge data i relationstabellen. Kombinationsbokse og lister kan slå op på feltværdier i tabellen og dermed finde den nødvendige reference.
Selv tak. Du kan komme ud for, at en spiller f.eks. skifter adresse midt i en turnering. Hvis du kun har 2 tabeller som skitseret af helle fred, risikerer du at skulle rette spillerens adresse mange steder i db.
Hvis du benytter 3 tabeller, plukker du spillerens ID fra spillertabellen over i den tabel jeg vist har kaldt tabel3. Bemærk at det er spillerens ID du henter. D.v.s. at spillerens adresse stadig ikke er i tabel3, men du ser det ved at køre en forespørgsel, hvori relationen mellem de 2 tabeller forbinder de 2 ID-felter og så har du spillerens navn, adresse i forespørgslen. Når du så skal skifte hans adresse, skal du kun gøre det i spillertabellen, idet det er det eneste sted adressen er opført.
Hvis jeg kun benytter to tabeller - en med spilleroplysninger og en med turneringsoplysninger, i hvilken der findes en reference til de to spilleres ID i spiller-tabellen, så behøver jeg da heller ikke rette mere end et sted ?
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.