Database Modelling - Reducering af redundans?

Tags:    mssql udvikling

Hej Udviklere,

Jeg har tidligere skrevet herude angående et projekt jeg er gået i gang med for at udvide min horisont både på database side, men også indenfor PHP. Det her spørgsmål drejer sig enkelt set om database modellering.

Jeg er ved at lave et mindre spil, der bygger på det live rollespil jeg selv deltager i. Indtil videre ser min modellering sådan ud:
Data Model

I tabellen Skills har jeg følgende attributer:
SkillId - Id der knytter sig til alle skills som der sættes ind i spillet.
Name - Giver sig selv, navnet denne skill har
Stat - Spillet har nogle stats, Sneaky, Diplomacy er 2 af dem. Disse er skrevet som varchars
Value - Angiver de points som den giver til den angivne stat. (Kan også antag null da nogle skills ikke påvirker stats)

Spørgsmålet går så på, er det mest korrekt at lave en ny tabel som hedder stats, der indeholder alle stats og så bruger jeg bare et id i Skill tabellen i stedet for. Dette vil jo give mindre redudans? Eller bør jeg tænke det lidt anderledes.

Jeg så mange tak på forhånd.



Indlæg senest redigeret d. 17.03.2011 13:02 af Bruger #6559
8 svar postet i denne tråd vises herunder
2 indlæg har modtaget i alt 8 karma
Sorter efter stemmer Sorter efter dato
Det mest korrekte er at have en tabel til stats hvor hvert entry er en stat, som dine skills så kan henvise til.



Hvis den reelt eneste forskel på de to slags skills er hvorvidt de giver en statforøgelse eller ej, ville jeg have dem i samme tabel, med en tinyint(1) der afgør om de giver statforøgelse -- 0 på ingen forøgelse, 1 på forøgelse.

Hvis du vil have dem delt op i disse tre kategorier, men udover det stadig have dem til at være det samme, ville jeg stadig have dem i samme tabel, med en ENUM der afgjorde hvad kategori. For eksemepel:

category ENUM('boost','passive','active')

'boost' ville være en statforøgelse, 'passive' ville være en tidsindstillet skill og 'active' ville være noget der har effekt på andre spillere.



Ok jeg siger mange tak. Så skulle jeg gerne have det modelleret. Jeg har dog en anden ting, som jeg lige opdagede i går aftes. Skills kan i princippet stilles op i nogle flere kategorier.

Der er nogle skills, som giver en stats forøgelse, men der findes også skills som tager tid at bruge (resource anskaffelse), evner som igen ikke tager tid men har en effekt på andre spillere (overfald, snigbord mv). Mit udgangspunkt er at de 3 kategorier er speciallisernger af "skills" eller evner om man vil. De 2 løsningsforslag jeg kan se er at man giver hver specialiseing sin egen tabel og derved sparer plads. Men vil det så have nogen indflydelse på hvordan jeg generer id i praksis? (Hver skill skulle jo helst have sit eget id).

Den anden løsning er at smide alle attributer ind i en tabel, hvor jeg så vil få nogle felter der vil indeholde nulls. Denne løsning vil jeg se som den performance hurtigere løsning, på grund af det hele er samlet i en tabel og jeg skal ikke ud og lave kald på andre tabeller for at hente et charactersheet for en spiller. Desuden vil ikke få problemer med oprettelse af id'er, da de ikke er spredt.

Hvad mener I vil være smartest i mit tilfælde? Selv hælder jeg lidt til min anden løsning.



Så flag'et i tabellen oversætter jeg til enum. Okay. Så tror jeg vidst jeg har noget at arbejde videre med. ^^.

Jeg siger mange tak.



Tag et kig på database normalisering (http://en.wikipedia.org/wiki/Database_normalization) - mere præcists 3NF (http://en.wikipedia.org/wiki/Third_normal_form)


Jeg er skam klar over at der findes normaliseringer, men praktisk så kan man også komme til at normalisere for meget, selvom 3. NF burde være standard (Vores lærer mente ihvertfald at normaliserede man over 3. NF så var der stor sandsyndlighed for i Enterprise systemer, at koste for meget performance kontra hvad du fik ud af det).

Personlig har jeg ikke meget erfarring ud over de projekter, der har været obligatoriske på uddannelsen indtil videre.



Indlæg senest redigeret d. 18.03.2011 19:41 af Bruger #6559
Hej Udviklere,

Jeg har tidligere skrevet herude angående et projekt jeg er gået i gang med for at udvide min horisont både på database side, men også indenfor PHP. Det her spørgsmål drejer sig enkelt set om database modellering.

Jeg er ved at lave et mindre spil, der bygger på det live rollespil jeg selv deltager i. Indtil videre ser min modellering sådan ud:
Data Model

I tabellen Skills har jeg følgende attributer:
SkillId - Id der knytter sig til alle skills som der sættes ind i spillet.
Name - Giver sig selv, navnet denne skill har
Stat - Spillet har nogle stats, Sneaky, Diplomacy er 2 af dem. Disse er skrevet som varchars
Value - Angiver de points som den giver til den angivne stat. (Kan også antag null da nogle skills ikke påvirker stats)

Spørgsmålet går så på, er det mest korrekt at lave en ny tabel som hedder stats, der indeholder alle stats og så bruger jeg bare et id i Skill tabellen i stedet for. Dette vil jo give mindre redudans? Eller bør jeg tænke det lidt anderledes.

Jeg så mange tak på forhånd.


Hvad er det for et program du har tegnet din data model i ?



t