繁体   English   中英

设计数据库-游戏表

[英]Designing a database - Games played table

我有一个很基本的问题。 我正在设计一个数据库来跟踪某些特定人群之间下棋的情况。 我正在考虑创建一个球员表,该表将保存每个球员的详细信息。 主键是玩家ID。

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

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

我还想知道是否存在设计该数据库的其他方法。

崇高的是,有几种方法可以定义此数据库的结构。 您最终选择哪种设计取决于数据库的性能期望和最终维护要求。 我建议阅读有关规范化的内容 ,这将使您深入了解以各种方式设计表的优缺点。

为了回答您的特定问题,我将:

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

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

这里要注意的重要事项:

  • 我包括了一个游戏ID主键,以唯一地识别一个游戏与另一个游戏。 没有这个,您将无法区分同一位玩家玩的多个游戏。 您可能会或可能不会在您的实现中要求这样做。

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

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

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

您还可以将数据的结构组成为:

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

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

这是我的看法:

  • 我不喜欢将“玩家1”和“玩家2”这两列包含在内。 尝试获取“杰夫”玩过的所有游戏的列表时,您将需要同时检查“玩家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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM