在多个表中存储用户的属性?

时间:2014-04-11 13:00:26

标签: mysql database database-design

我有一个游戏,我想存储玩家赢得某种地图类型的次数。我想跟踪所有时间和每月的胜利,因此我可以为他们提供两个排行榜视图。我的用户统计对象看起来像这样:

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列限制。

有什么建议吗?

由于

1 个答案:

答案 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);