【问题标题】: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。结果表将包括游戏 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