Vinnaren i pepparkakshustävlingen!
2016-04-06, 18:38
  #1
Medlem
en tanke dök upp för mig när jag höll på lite med databaser idag - jag kan inte så mycket om databaser/lagring, men lite - och det är, hur kan e.x databasstrukturen för stora spel, som WoW, se ut?

Det är lätt att föreställa sig hur varje enskild karaktärs guld/equipment/inventory sparas, men exempelvis med achievements där det finns flera tusen(tror jag), hur kan det se ut? Kan det sparas en lång array i json i stil med achievementNummer:siffra(som indikerar hur långt man kommit e.v om den slutförts), det skulle ju bli många tusen karaktärer långt. Det borde finnas ett smartare sätt för att spara sådan sorts data?

En till sak som är intressant är hur exempelvis achievements i WoW gällande saker som exploration.
Där finns det ju flera delar av varje, som "Upptäck hela bla" och sedan "Upptäckt del 1, Upptäckt del 2" osv. skulle det sparas som achievementNummer:array med varje plats och en 1/0 för status?

Att sedan hantera denna datan verkar relativt simpelt, då varje achievementNummer antagligen är kopplat till en beskrivning/namn och då kan man ju koppla det till vilken sorts data det är som sparas, om det är true/false, eller en array.

Slutligen så fick jag en liten tanke angående just detta med exploration achievements, men det är väl kanske mer kodrelaterat än databaser - är det rimligt att det helt enkelt är någon sorts hook som körs när man kommer in i en ny del, hur skulle koden för detta se ut?
Citera
2016-08-08, 02:04
  #2
Medlem
Skulle tro att dom har någon slags big data lösning såsom Hadoop eller MongoDB. MongoDB är filbaserat med JSON liknande filer. Helt annan struktur och lösning än vad vanliga databaser har.
Citera
2016-08-08, 21:30
  #3
Medlem
fnirps avatar
Citat:
Ursprungligen postat av hej-svejs
Det är lätt att föreställa sig hur varje enskild karaktärs guld/equipment/inventory sparas, men exempelvis med achievements där det finns flera tusen(tror jag), hur kan det se ut? Kan det sparas en lång array i json i stil med achievementNummer:siffra(som indikerar hur långt man kommit e.v om den slutförts), det skulle ju bli många tusen karaktärer långt. Det borde finnas ett smartare sätt för att spara sådan sorts data?

En till sak som är intressant är hur exempelvis achievements i WoW gällande saker som exploration.
Där finns det ju flera delar av varje, som "Upptäck hela bla" och sedan "Upptäckt del 1, Upptäckt del 2" osv. skulle det sparas som achievementNummer:array med varje plats och en 1/0 för status?

Att sedan hantera denna datan verkar relativt simpelt, då varje achievementNummer antagligen är kopplat till en beskrivning/namn och då kan man ju koppla det till vilken sorts data det är som sparas, om det är true/false, eller en array.

Nu har jag inte spelat WoW och jag är en renodlad databaskille, men förstår inte vad jag skulle vinna på att lagra något som ett JSON-objekt och inte som renodlad data, i en databas.

Förmodligen behöver spelet inte läsa ut/skriva ner achivements speciellt ofta, så ur rent prestandatänk, behöver man inte komprimera läsning/skrivning genom att lagra data som tex JSON. Blir bara krångligt i onödan, anser jag. Databaser är snabba om man lagrar rätt data på rätt sätt och använder sig av index. Hårddisk är billigt.

Det borde finnas en achievements-tabell där alla achievements finns och där varje achievement har ett unikt id (PK). Det borde också finnas en användar-tabell med ett unikt id för varje användare. Sedan gör man bara en kopplingstabell där man för varje avklarad achievement sätter in en post med userid och achievementid. Man behöver ju inte lagra ej påbörjade diton än iallafall, så då håller man tabellen kort.

Är det så att man vill lagra hur långt man kommit på pågående achievement, kan man ju lägga till en kolumn till i kopplingstabellen som talar om aktuell status. Det finns säkert mer data man vill ha med. Tidsstämpling på varje achievements skulle jag tippa finns med, för att motverka ev fusk, eller för annan kontroll. Är det olika levels i spelet är säkert varje achievement knuten till det och då behöver man inte lagra achievements annat än på pågående level.

Du skriver också om att achievements kan vara uppdelade. Där är frågan om det är smartast att göra det i koden eller både i kod och i databas. Jag gillar när databaserna har en logisk koppling till koden, för då är det så mycket lättare att vidareutveckla, buggrätta och administrera databaserna.

Jag kommer fram till följande databasbasstruktur helt enkelt:

USER
user_id (PK)
username
level_id (FK) -- Pågående level
...
...

LEVEL
level_id (PK)
level_name

ACHIEVEMENT
achievement_id (PK)
level_id (FK)
achivement_name
achievement_id (FK) -- För att bygga beroenden mellan olika achievements
...
...

USER_ACHIEVEMENT
user_id (FK)
achievement_id (FK)
status
timestamp

Att läsa ut datat från det här är lätt, även om det är tusentals rader. Att sedan i databaslagret i koden, bygga om det till valfri JSON eller annat sätt att komprimera datat, är ju görbart. Men jag skulle nog inte göra det så om jag var kodare....

Nu har säkert andra databasnissar sina synpunkter på det här. Finns många sätt att lösa det på och många av dessa är dessutom lika rätt som det här :-)
Citera
2016-08-08, 23:11
  #4
Medlem
Brunbeverns avatar
Intressant fråga nu när du nämner det.

Citat:
Ursprungligen postat av hej-svejs
Slutligen så fick jag en liten tanke angående just detta med exploration achievements, men det är väl kanske mer kodrelaterat än databaser - är det rimligt att det helt enkelt är någon sorts hook som körs när man kommer in i en ny del, hur skulle koden för detta se ut?

Detta skulle nog vara av intresse http://gamedev.stackexchange.com/que...g-achievements
Citera

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback