【问题标题】:Database schema for users, games, historical relationships用户、游戏、历史关系的数据库模式
【发布时间】:2013-02-19 18:34:47
【问题描述】:

我正在尝试确定我的数据库的最佳组织方式。我有一个用户表,其中每个人的current_game 都有一个列。 (每个用户在任何给定时间只能属于一个游戏。)有一个游戏表,其中每个特定游戏都有一个唯一的 ID。

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

由于游戏只能持续这么长时间(比如几周),而且由于并非所有用户都会一直积极参与游戏,所以我正在考虑以下模式:

usersusers_inactivegamesgames_oldgame_eventsgame_events_old

我的担忧是 2:首先,两个用户表是否会在登录和注册时出现问题?其次,我是否必须维护一个两列 membership 表,其中每个用户-游戏关系都有一行(所以 8 个用户每人参加过 5 场过去的游戏意味着 membership 表中有 40 行),还是有更简单的,更优雅的方式?

【问题讨论】:

    标签: mysql database-design


    【解决方案1】:

    我的建议是引入一个布尔列来指示实体是否处于活动状态。

    例如,代替“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
    

    【讨论】:

    • membership 问题呢?
    • 对不起,我错过了那部分。据我说,是的,你必须有一个两列的用户游戏关系表,因为这是一个多对多的关系。
    • 并用“user_id”和“game_id”创建一个复合主键。
    • 外键在这里有位置吗,或者这是一个没有实际意义的问题?
    • 外键在这里有明确的位置。 user_idgame_id 应该具有与 usersgames 表的外键约束。
    【解决方案2】:

    我将从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 之间即可。

    【讨论】:

      【解决方案3】:

      可能是GameHistory

      UserId | GameId 
      
      1      | 563    
      

      我想开始和结束日期将存储在 Games 表中。您仍然可以将当前游戏 id 存储在用户表中,或者在 GameHistory 表中创建一个位字段,称为当前游戏。

      【讨论】:

      • 会员问题呢?
      猜你喜欢
      • 2011-10-18
      • 1970-01-01
      • 2011-03-12
      • 2019-05-22
      • 2010-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-21
      相关资源
      最近更新 更多