Mysql 用户、游戏、历史关系的数据库模式
我正在尝试确定数据库的最佳组织。我有一个用户表,其中有一列用于每个人的Mysql 用户、游戏、历史关系的数据库模式,mysql,database-design,Mysql,Database Design,我正在尝试确定数据库的最佳组织。我有一个用户表,其中有一列用于每个人的当前游戏。(每个用户在任何给定时间只能属于一个游戏。)有一个游戏表,其中每个特定游戏都有一个唯一的id 我可以通过这种方式很好地执行所有查询/操作。但是,我希望维护每个用户在玩过游戏之前的记录,以便他们能够访问他们的历史数据和统计数据 由于游戏的持续时间很长(比如说几周),而且并非所有用户都会积极参与游戏,所以我考虑的模式是: 用户,非活动用户,游戏,游戏,游戏事件,游戏事件 我关心的是2:首先,两个用户表的登录和注册是否会有
当前游戏
。(每个用户在任何给定时间只能属于一个游戏。)有一个游戏表,其中每个特定游戏都有一个唯一的id
我可以通过这种方式很好地执行所有查询/操作。但是,我希望维护每个用户在玩过游戏之前的记录,以便他们能够访问他们的历史数据和统计数据
由于游戏的持续时间很长(比如说几周),而且并非所有用户都会积极参与游戏,所以我考虑的模式是:
用户
,非活动用户
,游戏
,游戏
,游戏事件
,游戏事件
我关心的是2:首先,两个用户表的登录和注册是否会有问题?第二,我是否必须为每个用户游戏关系维护一个两列
membership
表(每个用户在过去的5场游戏中有8个用户,意味着membership
表中有40行),或者是否有更简单的,更优雅的方式?我的建议是引入一个布尔列来指示实体是否处于活动状态
例如,我不使用“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
可能是
游戏历史
表
UserId | GameId
1 | 563
我想开始和结束日期会存储在游戏表中。您仍然可以将当前游戏id存储在用户表中,或在GameHistory表中创建一个名为current game的位字段。我将从
用户表中删除当前游戏
列,并添加一个新表,该表将用户与游戏连接在一起,并带有开始和结束时间戳。大致如下:
CREATE TABLE user_games (
user_id INT,
game_id INT,
start TIMESTAMP NOT NULL,
end TIMESTAMP
);
对于当前游戏,您可以将end
设置为NULL。当用户切换到其他游戏时,更新end
并为新游戏添加新行
为了查询当前游戏,只要在end
为空的条件下加入表即可。要查询历史游戏,只需确保时间戳介于开始
和结束
之间,那么会员问题如何?抱歉,我错过了这一部分。根据我的说法,是的,你必须有一个两列的用户游戏关系表,因为这是一个多对多的关系。并创建一个带有“用户id”和“游戏id”的复合主键。外键在这里有位置吗,或者这是一个没有争议的问题?外键在这里有明确的位置user\u id
和game\u id
应具有users
和games
表的外键约束。成员资格问题如何?