我正在开发一款在线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.
我觉得我需要两件事:
答案 0 :(得分:1)
一些建议:
1)当您尝试写入tbPlayersInGame表时,首先执行SELECT以确保游戏未满,然后插入表中。将事务隔离级别设置为可序列化的事务中的此SELECT和INSERT INTO包装。
2)没有单独的tbPlayersInGame表,而是在tbGame中有2个字段:Player1Id,Player2Id
答案 1 :(得分:1)
而不是1对n的关系,您可以将表设置为包含列 - 可能标记为host_player
和visitor_player
,或者必要的等效项(如国际象棋 - {{1 }和black
)。这有利于将有趣的事情保持在最低限度,并显示关系的自然状态。
这当然只有在应该有永久限制的数量的玩家时才有效 - 对于大多数棋盘游戏来说,这可能会正常工作....
如果您试图制作一个上限可变的游戏(无论出于何种原因),您可以通过以下声明“检测”可用的免费插槽:
white
如果您返回错误代码100('未选择/更新行),则播放器列表已满。您可能需要添加其他条件(以防止玩家加入两次),但这个概念应该仍然有用。