【问题标题】:Designing a database - Games played table设计数据库 - 游戏表
【发布时间】:2014-01-18 00:24:28
【问题描述】:

我有一个非常基本的问题。我正在设计一个数据库来跟踪某些人之间正在玩的国际象棋游戏。我正在考虑创建一个玩家表来保存每个玩家的详细信息。主键是玩家 ID。

我的问题是关于将游戏与玩家关联起来。 我最初的想法是创建一个游戏桌。其中的每条记录都是一场游戏,它将有 2 列用于播放它的玩家(玩家 ID),第三列将是获胜者(或平局)。

设计它的最佳方式是什么?第三列的值应该是玩家 ID,或者如果第一列中的玩家赢得了比赛,我可以指定 1,否则为 0。如何处理平局情况?我要插入一些关键字吗?

我也想知道是否有一些完全其他的方式来设计这个数据库。

【问题讨论】:

    标签: database database-design relational-database database-schema


    【解决方案1】:

    Sublime,有几种方法可以定义这个数据库的结构。您最终选择哪种设计取决于您的数据库的性能预期和最终维护要求。我建议您阅读规范化,它会让您深入了解以各种方式设计表格的利弊。

    要回答您的具体问题,我会:

    制作一个包含以下字段的游戏桌:

    • 游戏 ID(主键)
    • 玩家 1 ID(玩家表的外键)
    • 玩家 2 ID(玩家表的外键)
    • 比赛结果

    这里需要注意的重点:

    • 我添加了一个游戏 ID 主键来唯一地识别一个游戏与另一个游戏。没有这个,您将无法区分同一玩家玩的多个游戏。您在实施中可能需要也可能不需要。

    • 根据您将数据提取为某种有意义的表示的方法,游戏结果可能包含不同的值集。例如,一些可能性是:

      • 让游戏结果等于玩家 ID 或 0 或 -1 表示平局。在我看来,这是最不受欢迎的,因为这会导致字段表示的数据出现一致性问题。

      • 让游戏结果等于预定义的可能值列表(1 = 玩家 1 获胜,2 = 玩家 2 获胜,3 = 平局,4 = 仍在进行中,等等)。可能的值可能是它自己的表。这种方法需要更广泛的查询规划。

    您还可以将数据结构化为:

    • 玩家表 - 玩家信息
    • 游戏桌 - 游戏信息
    • 结果表 - 游戏结果信息

    在此设置中,您的游戏桌将仅包含游戏 ID 和玩家 ID。结果表将包括游戏 ID 和使用上述解决方案之一识别获胜者的游戏结果。

    【讨论】:

      【解决方案2】:

      以下是我的观点:

      • 我不喜欢有两列“玩家 1”和“玩家 2”的想法。在尝试获取“Jeff”玩过的所有游戏的列表时,您必须同时检查“玩家 1”和“玩家 2”列的 ID。
      • 您可以通过实现“GamePlay”类型的表格来解决上述问题,该表格为每个玩家提供单独的行。这样每个玩家都有自己的结果,并被保存在一个列中以便于查询。
      • 可能结果的单独表格会很整洁。

      我在下面起草了一个示例

      GameResult - 游戏结果参考表

       GameResultId | Desc 
       01           | Won   
       02           | Lost 
       03           | Drew
      

      游戏 - 这是游戏桌,列出游戏。可以有地点、日期、时间等详细信息。

       GameId | StartTime | Location | Ect
       01     | 13:00     | Park    | ect..
      

      GamePlay - 为每个成员-游戏交互设置一行。

       GamePlayId | GameId | PlayerId | GameResultId
       01         | 01     | 01       | 01
       02         | 01     | 02       | 02
      

      这样,您的玩家可以更轻松地查询。 (例如获取所有赢得比赛的玩家的列表)

       SELECT
            p.PlayerName
       FROM
            Player p
             INNER JOIN GapePlay gp
             ON p.PlayerId = gp.PlayerId
       WHERE gp.GameresultId = 1
      

      你也可以通过游戏轻松查询

       SELECT
           gp.GameId
       ,   p.Name
       ,   gr.Desc
       FROM
           GamePlay gp
           INNER JOIN Player p
           ON gp.PlayerId = p.PlayerId
           INNER JOIN GameResult gr
           ON gp.GameresultId = gr.GameResultId
       WHERE 
           GamePlayId = 01
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-09-06
        • 2013-12-03
        • 2011-11-16
        • 2019-06-08
        • 2014-11-07
        • 2019-06-25
        • 2012-10-09
        相关资源
        最近更新 更多