我想到了三种不同但同样可行的方法来保存图表数据。
所涉及的图表是“各类别得分随时间变化”的玩家得分图表。类别包括“建筑物”、“物品”、“任务完成”、“成就”等。
方法1:
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
查询添加/更新行。
方法3:
为每个用户使用一个文件,其中包含其分数数据的JSON编码数组。由于数据正在通过AJAX JSON调用获取,因此该文件可以静态获取(甚至可以缓存到以下午夜),而不会对服务器造成任何压力。每天,服务器都会运行每个文件,将每个数组中最旧的分数shift()
出来,并将新的分数push()
到末尾。
个人认为方法3是迄今为止最好的方法,但我听说过使用文件而不是数据库的坏处-例如,如果我想能够按不同类别的得分排名用户,则这种解决方案将非常糟糕。
在这两个数据库解决方案中,我已经在我以前的项目中实现了方法2,它似乎工作得很好。方法1似乎“更好”,因为它更好地利用了关系数据库和所有这些东西,但我有点担心它将包含(number of users) * (number of categories) * 7
行,这可能会变成一个大数字。
是否有什么我错过的东西可以帮助我做出最终决定使用哪种方法?1、2、3或以上都不是?
8*5*7 = 280
。随着预期负载的增加,答案将更接近于100,000 * 8 * 7 = 5,600,000
... - Niet the Dark Absol