【问题标题】:User and game database many-to-many connection用户和游戏数据库多对多连接
【发布时间】:2015-04-12 00:09:02
【问题描述】:

我正在尝试创建一个游戏数据库。我已经创建了一个用户表,其中存储了用户、密码和电子邮件。

CREATE TABLE `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(50) DEFAULT NULL,
  `password` char(40) DEFAULT NULL,
  `email` varchar(60) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=111 DEFAULT CHARSET=utf8;

我还创建了一个游戏表,其中包含游戏类型、游戏名称、持续时间、描述、活跃度和创建者。

CREATE TABLE `games` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `type` varchar(30) DEFAULT NULL,
      `name` varchar(60) DEFAULT NULL,
      `duration` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
      `description` varchar(255) DEFAULT NULL,
      `Active` tinyint(1) DEFAULT NULL,
      `Completed` tinyint(1) DEFAULT NULL,
      `createdBy` int(11) NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8;

用户将能够创建一个游戏并邀请 x 个用户,因此这将是多对多的关系。我试图创建一个名为 active_games 的表,但我不确定我应该如何进行。我需要一个联系,这样我才能知道谁创造了这个游戏,谁在玩那个游戏。

CREATE TABLE `active_games` (
  `user_id` int(11) NOT NULL DEFAULT '0',
  `game_id` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`user_id`,`game_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

下一步是什么?如果用户创建一个游戏并向其他朋友发送“邀请”,是否可以自动分配一个游戏 ID 以及被邀请到该游戏 ID 的用户?如果我想查找特定用户的所有活跃游戏,我该怎么做?

【问题讨论】:

  • 要自动创建条目,您可以将触发器添加到games 表。

标签: mysql database database-design


【解决方案1】:

您还需要两张桌子。 UserGames 会有关于创建游戏的用户的信息:

CREATE TABLE UserGames (
    UserGameId int not null auto_increment primary key,
    userid int NOT NULL references users(id),
    gameid int not null references games(id),
    CreationDate datetime,
    . . .
);

还有GameInvites:

CREATE TABLE GameInvites (
    GameInviteId int not null auto_increment primary key,
    UserGamesId int not null references UserGames(UserGamesId),
    invited_userid int NOT NULL references users(id),
    AcceptedFlag bit
    . . .
);

. . . 表示可能要存储的有关每个关系的附加信息。

【讨论】:

  • 谢谢!我有点困惑如何进行查询。如果用户想要创建游戏并邀请用户,查询会是什么?我需要 active_games 表吗?
  • 如果您想查看谁在玩什么游戏,您需要active_games。如果多个用户可以创建游戏,则需要UserGames(尽管 CreationDate 是游戏的一个属性,所以应该在Games 表中)。如果它是游戏的一位创作者,则该信息可以保留在Games 表中。至于怎么查询,就看你想知道什么了。
  • 感谢重播!好吧,我不确定如何设置数据库。如果我使用上面的所有代码,它会起作用还是我必须修改/建立一些关系?在我设置数据库之后,如何创建游戏(我在用户表中有一些用户)并将邀请“发送”给用户。当游戏需要一些“状态”更新或游戏完成时,我应该使用哪个表?我对关系数据库以及如何跟踪不同的表不太熟悉。希望你能给我解释一下:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-25
  • 2016-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多