如何强制执行1到n的关系

时间:2011-10-17 23:26:20

标签: sql locking integrity

我正在开发一款在线muiltiplayer棋盘游戏&有一个SQL服务器问题。

让我们假设游戏允许两个玩家。创建游戏时,创建者将被添加为第一个用户。

此时,两个用户可以尝试同时加入游戏。应阻止其中一个用户。

我的数据库架构如下:

tbGame - contains a list of all games. PrimaryKey is GameId
tbPlayers - contains a list of all registered users. PrimaryKey is PlayerId
tbPlayersInGame - contains a list of all players in each game. Foreign key 
                  relations to tbGame and tbPlayers.

我觉得我需要两件事:

  1. 基于GameId锁定tbPlayersInGame的方法。这将在向游戏添加玩家时使用。从我所看到的,它听起来像一个键范围锁(在GameId上)将是合适的。
  2. 一种强制执行1对2关系的方法,以便尝试添加第3个玩家将失败。

2 个答案:

答案 0 :(得分:1)

一些建议:

1)当您尝试写入tbPlayersInGame表时,首先执行SELECT以确保游戏未满,然后插入表中。将事务隔离级别设置为可序列化的事务中的此SELECT和INSERT INTO包装。

2)没有单独的tbPlayersInGame表,而是在tbGame中有2个字段:Player1Id,Player2Id

答案 1 :(得分:1)

而不是1对n的关系,您可以将表设置为包含列 - 可能标记为host_playervisitor_player,或者必要的等效项(如国际象棋 - {{1 }和black)。这有利于将有趣的事情保持在最低限度,并显示关系的自然状态。

这当然只有在应该有永久限制的数量的玩家时才有效 - 对于大多数棋盘游戏来说,这可能会正常工作....

如果您试图制作一个上限可变的游戏(无论出于何种原因),您可以通过以下声明“检测”可用的免费插槽:

white

如果您返回错误代码100('未选择/更新行),则播放器列表已满。您可能需要添加其他条件(以防止玩家加入两次),但这个概念应该仍然有用。