2011-10-17 16 views
5

Pracuję nad grą planszową do gry samiliplayer online & z pytaniem o serwer SQL.Jak wymusić relację od 1 do n

Pozwala założyć, że gra pozwala dwóm graczom. Po utworzeniu gry twórca zostaje dodany jako pierwszy użytkownik.

W tym momencie dwóch użytkowników może spróbować dołączyć do gry jednocześnie. Jeden z tych użytkowników powinien być zablokowany.

Mój schemat bazy danych jest następujący:

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. 

czuję, że potrzebne są dwie rzeczy:

  1. sposób, aby zablokować tbPlayersInGame na podstawie GameID. Będzie to używane podczas dodawania gracza do gry. Z tego, co przeczytałem, wynika, że ​​odpowiednia byłaby blokada z kluczem (na GameId).
  2. Sposób na wymuszenie relacji 1 do 2, aby próba dodania trzeciego gracza zakończyła się niepowodzeniem.

Odpowiedz

1

Kilka sugestii:

1) Przy próbie zapisu do tabeli tbPlayersInGame najpierw zrobić SELECT, aby upewnić się, że gra nie jest pełny, a następnie wstawić do tabeli. Owiń SELECT i INSERT INTO w transakcji z poziomem izolacji transakcji ustawionym na serializację.

2) Nie ma osobną tabelę tbPlayersInGame, zamiast mieć 2 pola w tbGame: Player1Id, Player2Id

+0

Skończyło się na tym podejściem. Zapytanie było coś takiego: „Ustaw TRANSAKCJI IZOLACJA POZIOM SERIALIZABLE rozpocząć transakcji IF (SELECT COUNT (*) FROM PlayersInGame GDZIE GameID = @GameId