0

我正在尝试确定我的数据库的最佳组织。我有一个 users 表,其中每个人的current_game. (每个用户在任何给定时间只能属于一个游戏。)有一个游戏表,其中每个特定游戏都有一个唯一的 ID。

我可以通过这种方式很好地执行我的所有查询/操作。但是,我想维护每个用户之前游戏的记录,以便他们可以访问他们的历史数据和统计数据。

由于游戏只能持续这么长时间——比如说几周——而且并非所有用户都会一直积极参与游戏,所以这是我正在考虑的模式:

users, users_inactive, games, games_old, game_events,game_events_old

我的担忧是 2:首先,两个用户表是否会在登录和注册时出现问题?其次,我是否必须membership为每个用户-游戏关系维护一个包含一行的两列表(所以 8 个用户每个都参加过 5 个过去的游戏意味着表中有 40 行membership),还是有更简单、更优雅的方法?

4

3 回答 3

1

我的建议是引入一个布尔列来指示实体是否处于活动状态。

例如,代替“games”和“games_old”表,我会在“games”表中使用game_active(布尔列)并消除“games_old”表。在业务逻辑中,您必须将新游戏标记为活动,将旧游戏标记为非活动。

同样的逻辑也适用于其他表。

约束看起来像,

PRIMARY KEY (`user_id`, `game_id`),
INDEX `idx_user_id` (`user_id`),
INDEX `idx_game_id` (`game_id`),
CONSTRAINT `fk_users_user_game` FOREIGN KEY (`user_id`) REFERENCES `users` (`user_id`) ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT `fk_games_user_game` FOREIGN KEY (`game_id`) REFERENCES `games` (`game_id`) ON UPDATE NO ACTION ON DELETE NO ACTION
于 2013-02-19T18:42:32.133 回答
1

我将从表中删除该current_gameusers并添加一个新表,该表将用户与游戏以及开始和结束时间戳连接起来。类似于以下内容:

CREATE TABLE user_games (
    user_id INT,
    game_id INT,
    start TIMESTAMP NOT NULL,
    end TIMESTAMP
);

对于当前游戏,您将设置end为 NULL。当用户切换到不同的游戏时,更新end并为新游戏添加新行。

为了查询当前游戏,只需在条件end为 NULL 的情况下加入表。要查询历史游戏,只需确保时间戳在start和之间end

于 2013-02-19T18:52:24.513 回答
-1

也许是一张GameHistory桌子

UserId | GameId 

1      | 563    

我想开始和结束日期将存储在 Games 表中。您仍然可以将当前游戏 ID 存储在用户表中,或者在 GameHistory 表中创建一个位字段,该字段将被称为当前游戏。

于 2013-02-19T18:45:10.020 回答