I recently learned about normalisation in my informatics class and I'm developing a multiplayer game using SQLite as backend database at the moment.
Some information on it:
The simplified structure looks a bit like the following:
player_id | level | exp | money | inventory
---------------------------------------------------------
1 | 3 | 120 | 400 | {item a; item b; item c}
Okay. As you can see, I'm storing a table/array in string form in the column "inventory". This is against normalization.
But the thing is: Making an extra table for the inventory of players brings only disadvantages for me!
- The only points where I access the database is:
- When a player joins the game and his profile is loaded
- When a player's profile is saved
When a player joins, I load his data from the DB and store it in memory. I only write to the DB like every five minutes when the player is saved. So there are actually very few SQL queries in my script.
If I used an extra table for the inventory I would have to, upon loading:
- Perform an performance and probably more data-intensive query to fetch all items from the inventory table which belong to player X
- Walk through the results and convert them into a table for storage in memory
And upon saving:
- Delete all items from the inventory table which belong to player X (player might have dropped/sold some items?)
- Walk through the table and perform a query for each item the player owns
If I kept all the player data in one table:
- I'd only have one query for saving and loading
- Everything would be in one place
- I would only have to (de)serialize the tables upon loading and saving, in my script
What should I do now?
Do my arguments and situation justify working against normalisation?