我有两个表,用户和游戏。 游戏包含sideRed
列和sideBlue
列。每一方只有一个用户。 用户有列activeGame
。如果sideRed
和sideBlue
是一对一关系,那么后方引用activeGame
会去哪里?
答案 0 :(得分:2)
有很多用户和很多游戏。用户应以某种方式连接到游戏。这是典型的 m:n-relationship 。
在您的情况下,这是受限制的:每个游戏只有一个用户为sideRed
,一个用户为sideBlue
。目前,您的game
表有两个FK列到user
- 表引用蓝色和红色用户。到目前为止正确吗?
问自己一些问题:
activeGame
旗帜? 你应该始终考虑你的想法: - )
您可以将fk-column放入user
- 表中以引用活动游戏。问题:您的用户必须存在以填充游戏行的红色和蓝色列,但游戏必须存在以填充用户的activeGame列。这个交叉引用需要特别努力插入...
您可以在BIT
和sideRed
之外设置两个sideBlue
列,以将此引用标记为activeReference。在这种情况下,您必须确保每个用户不允许多个活动标志。
在
之间放置一个映射表一位聪明人说:一个好的数据库将在其表的计数上重新认识。越多越好: - )
嗯,越多越好可能不是一般规则,但是 - 在大多数情况下 - 人们不应该害怕在一个良好和可扩展的结构中投入更多的东西
您的评论
我喜欢这种解决方案,因为它有很强的关注点。 让我们说Shnugo采取了行动,我们必须向所有用户广播。 Shnugo的客户端发送UserGameID和请求的移动。那你就是 1.查询UserGame匹配UserGameID。 2.查询游戏匹配GameID并应用移动。 3.查询匹配GameID的UserGames并关注 联接以获取游戏中的用户ID列表。这是对的吗?
我设计中的游戏桌只是游戏本身的元描述(名称,图标,一些规则......)。特定游戏的状态(例如,所有国际象棋棋子的当前位置)将需要一个(或几个)更多的桌子,而UserGame
- 表应该包含对此的参考GameStatus
- 表格而不是GameID
)。您可能需要几个不同的表,因为国际象棋的状态需要其他结构而不是扑克的状态。但是 - 调查UserGame会告诉你哪个游戏正在播放,所以你知道要查看哪个表。
表GameInstance(当前玩游戏的状态,GameID,StatusID,......)
表UserGame(UserID, GameInstanceID ,TypeID [红色,蓝色,......] ......)
另一种可能性是存储所有移动并计算当前状态。但这对任何类型的游戏都不起作用。