[英]Designing a database - Games played table
我有一个很基本的问题。 我正在设计一个数据库来跟踪某些特定人群之间下棋的情况。 我正在考虑创建一个球员表,该表将保存每个球员的详细信息。 主键是玩家ID。
我的问题是将游戏与玩家相关联。 我最初的想法是创建一个游戏桌。 它中的每个记录都是一个游戏,其中有2列用于播放该记录的玩家(玩家ID),第3列将是获胜者(或平局)。
最好的设计方法是什么? 如果第三列的值是玩家ID,或者如果第一列的玩家赢得了比赛,我只能指定1,否则我可以指定0。我该如何处理平局情况? 我要插入一些关键字吗?
我还想知道是否存在设计该数据库的其他方法。
崇高的是,有几种方法可以定义此数据库的结构。 您最终选择哪种设计取决于数据库的性能期望和最终维护要求。 我建议阅读有关规范化的内容 ,这将使您深入了解以各种方式设计表的优缺点。
为了回答您的特定问题,我将:
制作一个包含以下字段的游戏表:
这里要注意的重要事项:
我包括了一个游戏ID主键,以唯一地识别一个游戏与另一个游戏。 没有这个,您将无法区分同一位玩家玩的多个游戏。 您可能会或可能不会在您的实现中要求这样做。
根据您将数据提取为有意义的表示方式,游戏结果可能包含不同的值集。 例如,一些可能性是:
让游戏结果等于玩家ID或0或-1表示平局。 在我看来,最不优选,因为这会导致该字段表示的数据存在一致性问题。
让游戏结果等于可能值的预定义列表(1 =玩家1获胜,2 =玩家2获胜,3 =平局,4 =仍在进行中,等等)。 可能的值可能是它自己的表。 这种方法需要更广泛的查询计划。
您还可以将数据的结构组成为:
在此设置中,您的游戏表将仅包含游戏ID和玩家ID。 结果表将包括游戏ID和使用上述解决方案之一来标识获胜者的游戏结果。
这是我的看法:
我在下面草拟了一个例子
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.