用户,游戏,历史关系的数据库模式

时间:2013-02-19 18:34:48

标签: mysql database-design

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

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

由于游戏只持续了这么长时间 - 比如说 - 并且由于并非所有用户都会积极参与游戏,这就是我正在考虑的架构:

usersusers_inactivegamesgames_oldgame_eventsgame_events_old

我的担忧是2:首先,两个用户表是否会出现登录和注册问题?第二,我是否必须维护一个两列membership表,每个用户 - 游戏关系都有一行(所以8个用户分别在过去的5个游戏中表示membership表中的40行),或者有更简单,更优雅的方式吗?

3 个答案:

答案 0 :(得分:1)

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

例如,我将在“游戏”表中使用game_active(布尔列)而不是“games_old”表,而不是“games”和“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

答案 1 :(得分:1)

我会从current_game表中删除users列,并添加一个新表,用于将用户与游戏连接在一起以及开始和结束时间戳。有点像:

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

对于当前游戏,您可以将end设置为NULL。当用户切换到其他游戏时,请更新end并为新游戏添加新行。

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

答案 2 :(得分:-1)

也许是GameHistory

UserId | GameId 

1      | 563    

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