我有一个非常基本的问题。我正在设计一个数据库来跟踪某些人群中正在进行的国际象棋比赛。我正在考虑创建一个能够保存每个玩家细节的玩家表。主键是玩家ID。
我的问题是将游戏与玩家联系起来。 我最初的想法是创建一个游戏桌。其中的每条记录都是一个游戏,它将有2列玩家(玩家ID)玩,第三列将成为赢家(或抽奖)。
设计它的最佳方法是什么?第三列值应该是玩家ID还是我可以指定1如果第一列中的玩家赢了游戏,否则为0.如何处理绘制案例?我是否插入了一些关键字?
我还想知道是否有其他完全不同的方法来设计这个数据库。
答案 0 :(得分:0)
Sublime,您可以通过多种方式定义此数据库的结构。您最终选择哪种设计取决于数据库的性能期望和最终维护要求。我建议您阅读规范化,这将为您提供一些有关以各种方式设计表格的利弊的见解。
要回答您的具体问题,我会:
制作一个由以下字段组成的游戏桌:
此处需要注意的重点:
我添加了一个游戏ID主键,可以从另一个游戏中唯一标识一个游戏。如果没有这个,你将无法区分同一玩家所玩的多个游戏。您可能会或可能不会在实施中要求这样做。
根据您将数据提取到一些有意义的表示方法,游戏结果可能包含不同的值集。例如,一些可能性是:
让游戏结果等于玩家ID或0或-1表示平局。在我看来,最不受欢迎,因为这会导致该字段所代表的数据存在一致性问题。
让游戏结果等于预定义的可能值列表(1 =玩家1获胜,2 =玩家2获胜,3 =抽奖,4 =仍在进行中等)。可能的值可能是它自己的表。这种方法需要更广泛的查询计划。
您还可以将数据结构化为:
在此设置中,您的游戏表将仅包含游戏ID和玩家ID。结果表将包括游戏ID和游戏结果,使用上述解决方案之一来识别获胜者。
答案 1 :(得分:0)
以下是我的观点:
我已经在下面起草了一个例子
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