在关系数据库中存储每日统计信息

时间:2015-02-16 19:43:53

标签: database statistics relational-database

我正在制作一款游戏,需要每天保存每位玩家的统计数据(玩过的游戏,获得的金币和现金)以及历史统计数据。

我目前的做法是我有3张桌子:

table `stats_current` -> for storing player's stats on CURRENT DAY
player_id | games_played | gold_earned | current_gold

table `stats_all_time` -> player's stats accumulated from the very beginning
player_id | games_played | gold_earned | current_gold

table `stats_history` -> player's stats daily, one record for one day
player_id | date | games_played | gold_earned | current_gold

每个玩家在stats_current上有一条记录,stats_all_time上有一条记录,stats_history表上的记录有限(例如,记录的最后30天)。

然后有一个守护进程/ cron作业每天执行这些操作:

  • 每位球员:
  • stats_current上搜索其记录,获取值。
  • 将新记录插入stats_history,值来自stats_current
  • 更新stats_all_time上的记录,使用stats_current
  • 中的值增加其值
  • stats_current上,将games_playedgold_earned的值重置为0.但请保留current_gold原样。

常见任务的解决方案:

  • 获取玩家X的当前金币current_gold
  • 检索stats_current
  • 在过去7天内获取玩家X的统计信息:从stats_history中选择6条记录,再加上stats_current
  • 中今天的记录
  • 获取玩家X的总游戏数:stats_history
  • 中检索值

问题:

  • 这是一种可行的方法吗?
  • 有哪些缺点?
  • 有没有办法优化此解决方案?

1 个答案:

答案 0 :(得分:1)

您的方法无法利用SQL的强大功能

stats_history 要获得今天的统计数据,请使用

SELECT * FROM stats_history WHERE Date = CURDATE() and PlayerId = PlayerId--Depending on your RDBMS you might need a different function to get the date.

获取所有时间统计信息只需使用

SELECT SUM(games_played) as games_played, SUM(gold_earned) as gold_earned FROM stats_history WHERE PlayerId = playerid 

您可以通过从该播放器的stats_history中选择最高记录,或者使用任何其他RMDBS特定策略(SQL Server的Over子句,按日期排序结果集并为MySQL添加current_gold)来提取当前黄金等)

您的方法存在风险,因为如果您的Chron失败,其他两个表将是不准确的。它也是不必要的重复数据。