【发布时间】:2015-02-16 19:43:53
【问题描述】:
我正在创建一个游戏,它需要每天保存每个玩家的统计数据(玩过的游戏、获得的经验和金币、当前的金币)以及历史数据。
我目前的做法是我有 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不变。
常见任务的解决方案:
-
获取玩家 X 当前的金币: 从
stats_current检索current_gold -
获取玩家X最近7天的统计数据:选择
stats_history中的6条记录,加上stats_current中的今天记录 -
获取玩家 X 的总游戏数: 从
stats_history检索值
问题:
- 这是一种可行的方法吗?
- 有哪些弱点?
- 有没有办法优化这个解决方案?
【问题讨论】:
标签: database statistics relational-database