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

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_historytable上有有限的记录(例如,只记录最近30天).

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

常见任务的解决方案:


问题:

您的方法未能利用 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 失败,其他两个表将不准确。这也是不必要的数据重复。