2011-10-17 38 views
5

Tôi đang làm việc trên trò chơi trên bảng trò chơi muiltiplayer trực tuyến & có câu hỏi về máy chủ SQL.Cách thực thi mối quan hệ 1 đến n

Giả sử trò chơi cho phép hai người chơi. Khi trò chơi được tạo, người tạo sẽ được thêm làm người dùng đầu tiên.

Tại thời điểm đó, hai người dùng có thể thử tham gia trò chơi cùng một lúc. Một trong những người dùng này sẽ bị chặn.

schema cơ sở dữ liệu của tôi là như sau:

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. 

Tôi cảm thấy như tôi cần hai điều:

  1. Một cách để khóa tbPlayersInGame dựa trên GameId. Điều này sẽ được sử dụng trong khi thêm người chơi vào trò chơi. Từ những gì tôi đã đọc nó âm thanh giống như một khóa tầm quan trọng (trên GameId) sẽ phù hợp.
  2. Cách để thực thi mối quan hệ 1 đến 2 để nỗ lực thêm người chơi thứ 3 sẽ không thành công.

Trả lời

1

Một vài gợi ý:

1) Khi bạn cố gắng viết vào bảng tbPlayersInGame đầu tiên làm một SELECT để chắc chắn rằng các trò chơi là không đầy đủ, sau đó INSERT INTO bàn. Quấn SELECT này và INSERT INTO trong một giao dịch với mức cô lập giao dịch được đặt thành serializable.

2) Không có một bảng tbPlayersInGame riêng biệt, thay vì có 2 trường trong tbGame: Player1Id, Player2Id

+0

Tôi đã sử dụng phương pháp này. Truy vấn là một cái gì đó như: 'SET GIAO DỊCH cô lập CẤP SERIALIZABLE BEGIN TRANSACTION IF (SELECT COUNT (*) FROM PlayersInGame ĐÂU GameId = @GameId Buurin

1

Thay vì một mối quan hệ 1-to-n, bạn có thể thiết lập bảng của bạn phải cột - có thể được gắn nhãn host_playervisitor_player hoặc tương đương cần thiết (như cờ vua - blackwhite). Điều này có lợi thế là giữ những điều hài hước ở mức tối thiểu và thể hiện trạng thái tự nhiên của mối quan hệ.

Điều này tất nhiên chỉ hoạt động nếu có được coi là một hạn chế vĩnh viễn số lượng người chơi - đối với hầu hết các trường hợp boardgames, điều này có thể sẽ hoạt động tốt ....

Nếu bạn đang cố gắng để thực hiện một trò chơi mà giới hạn trên là có thể thay đổi (vì lý do gì), bạn có thể 'phát hiện' khe miễn phí có sẵn với các tuyên bố sau:

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) 

Nếu bạn nhận được trở lại một lỗi mã 100 ('Không có hàng chọn/cập nhật), danh sách người chơi đã đầy. Bạn có thể cần thêm các điều kiện khác (để ngăn người chơi tham gia hai lần), nhưng khái niệm vẫn hoạt động.

+0

Cảm ơn bạn đã trả lời. Tôi nên rõ ràng hơn, trò chơi có thể có số lượng người chơi khác nhau từ 2-8. Cho rằng tôi đã tránh thêm các cầu thủ vào bảng trò chơi. Tôi không nghĩ rằng bạn có thể thêm mệnh đề where vào câu lệnh chèn trong SQL Server, sửa tôi nếu tôi sai. – Buurin

+0

Ack, bạn nói đúng, bạn không thể chỉ thêm mệnh đề 'WHERE' - tôi muốn đặt nó như là một phần của chỉnh sửa' SELECT' .... –

Các vấn đề liên quan