2

我正在探索一个简单的记分应用程序来玩纸牌游戏拉米作为一种练习。我正在为 iOS 构建它,但这有点无关紧要,因为它使用 SQLite 数据存储,因此数据结构适用于任何环境。让我设置一个用例:

要开始记分,您首先要设置您的球员。我希望可以保留玩家,以便您可以跟踪统计数据等。因此,您要么创建新玩家,要么选择现有玩家。

然后,当你玩的时候,你会为每个玩家添加带有分数的回合。

游戏结束后,玩家和分数都将被保存,因此您可以查看过去游戏的日志。

我遇到的问题是一个玩家可以玩很多游戏,这些游戏有很多轮。但是,在观看一场比赛时,它有很多回合,每一回合都有很多玩家(显示他们的分数)。

为此构建 ERD 表明我对这种数据结构的看法将是多么失控。

愚蠢的ERD

好像我在转圈。有没有构建这些数据的例子,或者任何人都可以告诉我我在哪里偏离轨道?

4

2 回答 2

5

事实

  • 游戏存在。

  • 游戏GameRound

  • 播放器存在。

  • 玩家GameRound


约束

  • It is possible that some 游戏more than one GameRound

  • It is possible that some 玩家more than one GameRound and that for some GameRoundmore than one 玩家that GameRound


逻辑的

在此处输入图像描述

于 2013-08-15T18:51:15.253 回答
3

如果您认为该Player表是 a 的可能玩家池,Game那么您需要在和GamePlayer表之间有一个表来识别该特定游戏的玩家集。这张桌子也可以容纳该游戏桌上的四名玩家。GamePlayerposition

对于此表中的 PK,您可以使用 GameID 和 PlayerID 的组合,或添加自动生成的 ID。如果您使用后一种选项(这是我更喜欢的),您仍然应该在GameID/PlayerID组合上有一个唯一索引。GameID/Position也是PK的有效候选人,因为每场比赛每个位置只能填补一次。

我会完全删除圆桌并在其位置添加一个Score表格,并RoundNum作为一列。这Score将有一个外键引用回到GamePlayer表中(因为只有该游戏中的玩家才能真正得分)。

同样,您可以在此表上选择 PK。GamePlayerID/RoundNum必须是唯一的并且是 PK 的候选者,但我会使用自动生成的 ID。再一次,你应该在GamePlayerID/RoundNum组合上有一个唯一的索引。

使用这四个表,您可以解决所有 M:M 关系。

在此处输入图像描述

于 2013-08-13T16:50:14.337 回答