我正在制作一款游戏,需要每天保存每位玩家的统计数据(玩过的游戏,获得的金币和现金)以及历史统计数据。
我目前的做法是我有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_played
,gold_earned
的值重置为0.但请保留current_gold
原样。常见任务的解决方案:
current_gold
stats_current
stats_history
中选择6条记录,再加上stats_current
stats_history
问题:
答案 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失败,其他两个表将是不准确的。它也是不必要的重复数据。