设计数据库 - 游戏表

时间:2014-01-16 22:20:20

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

我有一个非常基本的问题。我正在设计一个数据库来跟踪某些人群中正在进行的国际象棋比赛。我正在考虑创建一个能够保存每个玩家细节的玩家表。主键是玩家ID。

我的问题是将游戏与玩家联系起来。 我最初的想法是创建一个游戏桌。其中的每条记录都是一个游戏,它将有2列玩家(玩家ID)玩,第三列将成为赢家(或抽奖)。

设计它的最佳方法是什么?第三列值应该是玩家ID还是我可以指定1如果第一列中的玩家赢了游戏,否则为0.如何处理绘制案例?我是否插入了一些关键字?

我还想知道是否有其他完全不同的方法来设计这个数据库。

2 个答案:

答案 0 :(得分:0)

Sublime,您可以通过多种方式定义此数据库的结构。您最终选择哪种设计取决于数据库的性能期望和最终维护要求。我建议您阅读规范化,这将为您提供一些有关以各种方式设计表格的利弊的见解。

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

制作一个由以下字段组成的游戏桌:

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

此处需要注意的重点:

  • 我添加了一个游戏ID主键,可以从另一个游戏中唯一标识一个游戏。如果没有这个,你将无法区分同一玩家所玩的多个游戏。您可能会或可能不会在实施中要求这样做。

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

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

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

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

  • 球员表 - 球员信息
  • 游戏桌 - 游戏信息
  • 结果表 - 游戏结果信息

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

答案 1 :(得分:0)

以下是我的观点:

  • 我不喜欢让两列“玩家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