I took a look at the data. Why do you think about storing the data in a database at all? I suppose you want to read the data, run some algorithm on it, and compute a result, correct? Or is it actually a requirement to store the data permanently or this is even all you are trying to do?
You're lists all seem to have the following format:
[KillsByEnemyTypeClass] => Array
(
[0] => stdClass Object
(
[Key] => 0
[Value] => 0
)
...
[MedalCountsByType] => Array
(
[0] => stdClass Object
(
[Key] => 0
[Value] => 0
)
As the data format implies, the lists are consecutive arrays, not actually key-value pairs. Because the keys are all consecutive, you can store the values in one large array in your programming language of choice.
This is your data format:
struct Data {
std::string reason;
int status;
struct AiStatistics {
int aDeathsByDamageType[82];
int nHopperId;
int aKillsByDamageType[82];
int nMapId;
double fMedalChestCompletionPercentage;
int aMedalCountsByType[128];
int nTotalMedals;
int nVariantClass;
...
} aaistatistics[9];
}
It looks as if the arrays must have a static size, because the 82 different damage types will probably mean something to you. If there are suddenly 83 damage types, the program that generates this data will have changed and you will have to adapt your algorithms, too. That means the data and your program are not independent and the advantages of using a database are questionable.
Update
Thanks for clarifying your requirements. I understand why you have to cache the data for other clients now.
But: Is the data you linked to all the data you have to store? That means, do you only cache the output from the web API and if the output changes you overwrite the previously stored data? Or is there a temporal dimension and you want to store the sequence of outputs of the API? In both cases, a thin C++ API around the binary data could be much more efficient than a database.
If its just for caching the data, I would still propose to model the database after the object model above. The AI Statistics table has one column per member variable, i.e., one column for the complete DeathsByDamageType array. Store the whole array as one value. Clients cannot lookup a single value using this model, but have to receive the complete array. Unless you have a concrete use case for anything else, I'd stick with this. Your database will be much simpler.
If this is really, really, really not enough for your purposes, your tables would probably be:
table Data { id, reason, status }
table AiStatistics { id, data_id, ..., all integer members like nTotalMedals etc }
table DeathByDamageType { aistat_type, index, value }
table ... for every other array member of AiStatistics
By default, storing DeathByDamageType in this way is really space-inefficient, the table is at least three times larger than the array values because for every value you have to store the AiStatistics reference id and the array index separately.
If you do it this way, at least exploit the sparsity in the arrays and don't store values in DeathByDamageType that are 0. You could not do this with the array.