2013-02-19 29 views
0

我正试图确定我的数据库的最佳组织。我有一个用户表,每个人都有一列current_game。 (每个用户在任何特定时间只能属于一个游戏。)有一个游戏桌,每个特定游戏都有一个唯一的ID。用户,游戏,历史关系的数据库模式

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

由于比赛只持续了这么久 - 周说 - 因为不是所有的用户将始终积极参与比赛,这是我正在考虑的模式:

usersusers_inactivegamesgames_old,game_events,game_events_old

我的顾虑是2:首先,两个用户表会出现登录和注册问题吗?其次,我是否必须为每个用户游戏关系保留一列两排membership表格(因此每个用户游戏关系中有8个用户在过去的5场比赛中表示membership表中有40行),还是有更简单,更优雅的方式?

回答

1

我的建议是引入一个布尔列来指示实体是否处于活动状态。例如,我将在“游戏”表格中使用game_active(布尔列),而不是“games_old”表格,而不是“游戏”和“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 
+0

“会员”问题呢? – David 2013-02-19 18:43:33

+0

对不起,我错过了那部分。据我所知,是的,你必须有一个两列的用户 - 游戏关系表,因为这是一个多对多的关系。 – Slowcoder 2013-02-19 18:54:54

+0

然后用“user_id”和“game_id”创建一个复合主键。 – Slowcoder 2013-02-19 19:00:30

-1

也许GameHistory

UserId | GameId 

1  | 563  

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

+0

会员问题呢? – David 2013-02-19 18:46:52

1

我会从users表中删除current_game列,并添加一个新表,将用户与游戏连接在一起,并附带开始和结束时间戳。沿着线的东西:

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

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

为了查询当前游戏,只需加入表格即可,条件是end为NULL。要查询历史游戏,请确保时间戳在startend之间。