我试图确定数据库的最佳组织。我有一个用户表,其中包含每个人current_game
的列。 (每个用户在任何给定时间只能属于一个游戏。)有一个游戏桌,每个特定的游戏都有唯一的ID。
我可以通过这种方式执行所有查询/操作。但是,我希望保留每个用户之前游戏的记录,以便他们可以访问他们的历史数据和统计数据。
由于游戏只持续了这么长时间 - 比如说 - 并且由于并非所有用户都会积极参与游戏,这就是我正在考虑的架构:
users
,users_inactive
,games
,games_old
,game_events
,game_events_old
我的担忧是2:首先,两个用户表是否会出现登录和注册问题?第二,我是否必须维护一个两列membership
表,每个用户 - 游戏关系都有一行(所以8个用户分别在过去的5个游戏中表示membership
表中的40行),或者有更简单,更优雅的方式吗?
答案 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的条件下加入表。要查询历史游戏,只需确保时间戳介于start
和end
之间。
答案 2 :(得分:-1)
也许是GameHistory
表
UserId | GameId
1 | 563
我想开始和结束日期将存储在Games表中。您仍然可以将当前游戏ID存储在用户表中,或者在GameHistory表中创建一个名为当前游戏的位字段。