我总共提出了三种不同的、同样可行的方法来保存图表数据。
有问题的图表是“随着时间的推移,玩家在各个类别中的得分”。类别包括“建筑”、“物品”、“任务完成”、“成就”等。
方法一:
CREATE TABLE `graphdata` (
`userid` INT UNSIGNED NOT NULL,
`date` DATE NOT NULL,
`category` ENUM('buildings','items',...) NOT NULL,
`score` FLOAT UNSIGNED NOT NULL,
PRIMARY KEY (`userid`, `date`, `category`),
INDEX `userid` (`userid`),
INDEX `date` (`date`)
) ENGINE=InnoDB
此表包含每个用户/日期/类别组合的一行。要显示用户的数据,请选择userid
。旧条目通过以下方式清除:
DELETE FROM `graphdata` WHERE `date` < DATE_ADD(NOW(),INTERVAL -1 WEEK)
方法二:
CREATE TABLE `graphdata` (
`userid` INT UNSIGNED NOT NULL,
`buildings-1day` FLOAT UNSIGNED NOT NULL,
`buildings-2day` FLOAT UNSIGNED NOT NULL,
... (and so on for each category up to `-7day`
PRIMARY KEY (`userid`)
)
由于是主键,因此按用户 ID 选择更快。每天的分数都会向下移动,如下所示:
... SET `buildings-3day`=`buildings-2day`, `buildings-2day`=`buildings-1day`...
条目不会被删除(除非用户删除他们的帐户)。可以使用INSERT...ON DUPLICATE KEY UPDATE
查询添加/更新行。
方法三:
为每个用户使用一个文件,其中包含一个 JSON 编码的分数数据数组。由于无论如何都是通过 AJAX JSON 调用获取数据,这意味着可以静态获取文件(甚至缓存到下一个午夜),而不会对服务器造成任何压力。服务器每天运行每个文件,shift()
从每个阵列中push()
找出最旧的分数,最后将新的分数排在最后。
就我个人而言,我认为方法 3 是迄今为止最好的,但是我听说过使用文件而不是数据库的坏事——例如,如果我希望能够根据用户在不同类别中的分数对他们进行排名,那么这个解决方案将非常糟糕。
在这两种数据库解决方案中,我已经在我的一个较旧的项目中实施了方法 2,这似乎效果很好。方法 1 似乎“更好”,因为它更好地利用了关系数据库和所有这些东西,但我有点担心它会包含(number of users) * (number of categories) * 7
行,这可能会变成一个很大的数字。
我有什么遗漏可以帮助我最终决定使用哪种方法吗?1、2、3或以上都不是?