将每日统计信息存储在关系数据库中
Storing daily statistics in relational database
我正在创建一个游戏,需要每天保存每个玩家的统计数据(玩过的游戏、获得的经验和金币、当前金币),以及所有时间的统计数据。
我目前的做法是我有 3 个 tables:
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
table上有有限的记录(例如,只记录最近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天的数据: select
stats_history
的6条记录,加上今天stats_current
[=的记录59=]
- 获取玩家 X 的总游戏数: 从
stats_history
中检索值
问题:
- 这是可行的方法吗?
- 弱点是什么?
- 有什么方法可以优化这个解决方案吗?
您的方法未能利用 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 服务器的 Over 条款,订购按日期设置的结果并为 MySQL 等添加 current_gold)
您的方法有风险,因为如果您的 Chron 失败,其他两个表将不准确。这也是不必要的数据重复。
我正在创建一个游戏,需要每天保存每个玩家的统计数据(玩过的游戏、获得的经验和金币、当前金币),以及所有时间的统计数据。
我目前的做法是我有 3 个 tables:
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
table上有有限的记录(例如,只记录最近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
中检索 - 获取玩家X最近7天的数据: select
stats_history
的6条记录,加上今天stats_current
[=的记录59=] - 获取玩家 X 的总游戏数: 从
stats_history
中检索值
current_gold
问题:
- 这是可行的方法吗?
- 弱点是什么?
- 有什么方法可以优化这个解决方案吗?
您的方法未能利用 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 服务器的 Over 条款,订购按日期设置的结果并为 MySQL 等添加 current_gold)
您的方法有风险,因为如果您的 Chron 失败,其他两个表将不准确。这也是不必要的数据重复。