2011-10-17 3 views
5

온라인 muiltiplayer 보드 게임 &에 SQL 서버 질문이 있습니다.1 대 n 관계를 적용하는 방법

게임에 2 명의 플레이어가 있다고 가정합니다. 게임이 생성되면 작성자가 첫 번째 사용자로 추가됩니다.

이 시점에서 두 명의 사용자가 동시에 게임에 참가하려고 할 수 있습니다. 이러한 사용자 중 한 명이 차단되어야합니다. 다음과 같이

내 데이터베이스 스키마는 다음과 같습니다

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. 

나는 두 가지 필요 같은 느낌 다음 게임 ID를 기반으로 tbPlayersInGame을 잠그는

  1. 길을. 이것은 플레이어를 게임에 추가하는 동안 사용됩니다. 내가 읽은 바로는 GameId에서 키 범위 잠금과 같은 소리가 적합 할 것입니다.
  2. 3 대 플레이어를 추가하려는 시도가 실패 할 수 있도록 1 대 2 관계를 강화하는 방법.

답변

1

몇 가지 제안 :

1) 당신이 tbPlayersInGame 테이블에 기록 할 때에는 먼저 게임이 전체 있지 않은지 확인하기 위해 SELECT을은 다음 테이블에 삽입. 이 SELECT 및 INSERT INTO를 트랜잭션 격리 수준이 serializable로 설정된 트랜잭션으로 래핑하십시오. 당신은 열을 가지고 테이블을 설정할 수, Player1Id, Player2Id

+0

나는이 접근법을 끝내었다. 'SET 트랜잭션 격리 수준 SERIALIZABLE INSERT INTO PlayersInGame을 BEGIN (<게임 게임 ID = @GameId FROM MaxPlayers을 선택 PlayersInGame 게임 ID = @GameId로부터 SELECT COUNT (*)) TRANSACTION IF를 BEGIN : 쿼리는 같은 것이 있었다. .. 는 TRAN RETURN 0 END 롤백 TRAN에게 RETURN을 COMMIT -1 '답장을 보내 – Buurin

1

대신 1 대 N의 관계 - :

2) 대신 tbGame 2 개 필드가 별도의 tbPlayersInGame 테이블을하지 마십시오 아마도 host_playervisitor_player으로 분류되거나 필요한 동등한 것 (체스에서와 같이 - blackwhite). 이것은 재미있는 일을 최소한으로 유지하고 관계의 자연 상태를 보여주는 장점이 있습니다. 물론

이에서만 작동 플레이어의 영구적으로 제한 수있을 예정이다 경우 - boardgames의 대부분의 경우, 이것은 아마 잘 작동합니다 ....

것은 당신이을 시도하는 경우 상한은 변경 가능한 게임 (어떤 이유), 다음과 같은 문으로 사용 가능한 슬롯을 '검색'할 수

INSERT INTO game_players (game_id, player_id) 
SELECT VALUES (:GAME_ID, :PLAYER_ID) 
WHERE :MAX_PLAYER_COUNT > (SELECT COUNT(*) 
          FROM game_players 
          WHERE game_id = :GAME_ID) 

다시 100의 오류 코드를 얻을 경우 ('행이 선택/업데이트되지), 플레이어 목록이 꽉 찼습니다. 플레이어가 두 번 참가하지 못하도록 다른 조건을 추가해야하지만 개념은 계속 작동해야합니다.

+0

감사합니다. 나는 더 분명해야했는데, 게임은 2-8에서 다양한 선수를 가질 수 있습니다. Game table에 플레이어를 추가하는 것을 피하는 것을 감안할 때. SQL Server의 insert 문에 where 절을 추가 할 수 없다고 생각합니다. 틀렸을 경우 수정하십시오. – Buurin

+0

Ack, 네 말이 맞아. 그냥'WHERE' 절을 추가 할 수는 없어. 나는 그것을'SELECT' 편집의 일부로 넣으려고했다. –

관련 문제