我有一个游戏,我想存储玩家赢得某种地图类型的次数。我想跟踪所有时间和每月的胜利,因此我可以为他们提供两个排行榜视图。我的用户统计对象看起来像这样:
class UserStats {
user_id;
num_wins_map_1;
num_wins_map_2;
num_wins_map_n;
num_wins_for_map_1_this_month;
num_wins_for_map_2_this_month;
num_wins_for_map_n_this_month;
...
}
将其翻译成我的mysql实例,我正在考虑创建两个表:
stats_all_time
fk_user_id | num_wins_for_map_1 | num_wins_for_map_2 | num_wins_for_map_n
stats_monthly
fk_user_id | num_wins_for_map_1 | num_wins_for_map_2 | num_wins_for_map_n
但是我会在每个表中添加num_users行。换句话说,当一个新用户加入时,我不仅要向我现有的"用户"添加新行。表,也是" stats_all_time"和" stats_monthly"表。
我可以将所有这些字段直接添加到现有的"用户"表格,但由于我有很多地图和其他需要编制索引的统计数据,因此不会很好地扩展,我可能会在某个时刻达到InnoDb列限制。
有什么建议吗?
由于
答案 0 :(得分:0)
将地图作为自己的表格和加入信息的表格通常会更好:
即
Table Map
id
name
统计数据只是一个表格,用于将地图和用户与胜利列相关联。
然而,更好的是让统计数据记录胜利:
Table wins
id
map_id
user_id
date
这意味着您无需在添加新地图时添加新列,也可以生成所需的任何统计信息 - 您不仅限于所有时间和月度表:
-- Quick example queries - may be wrong
-- All time stats
SELECT COUNT(*) FROM wins WHERE user_id = X;
-- Monthly
SELECT MONTH(date),YEAR(date),COUNT(*) FROM wins WHERE user_id = X GROUP BY MONTH(date),YEAR(date);
-- Wins scoreboard in the last week
SELECT COUNT(*),user_id FROM wins WHERE date > DATE_SUB(NOW(), INTERVAL 7 DAY);