Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 用户、游戏、历史关系的数据库模式_Mysql_Database Design - Fatal编程技术网

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
表的外键约束。成员资格问题如何?