Tôi không biết liệu điều này có thể hoạt động trên Postgress hay không, nhưng đây là một giải pháp SQL Server:
CREATE TABLE dbo.Teams(TeamID INT NOT NULL PRIMARY KEY);
GO
CREATE TABLE dbo.Players(PlayerID INT NOT NULL PRIMARY KEY,
TeamID INT NOT NULL FOREIGN KEY REFERENCES dbo.Teams(TeamID),
NumberInTeam INT NOT NULL CHECK(NumberInTeam IN (1,2)),
TeamMateID INT NOT NULL,
TeamMatesNumberInTeam INT NOT NULL,
-- if NumberInTeam=1 then TeamMatesNumberInTeam must be 2
-- and vise versa
CHECK(NumberInTeam+TeamMatesNumberInTeam = 3),
UNIQUE(TeamID, NumberInTeam),
UNIQUE(PlayerID, TeamID, NumberInTeam),
FOREIGN KEY(TeamMateID, TeamID, TeamMatesNumberInTeam)
REFERENCES dbo.Players(PlayerID, TeamID, NumberInTeam)
);
INSERT INTO dbo.Teams(TeamID) SELECT 1 UNION ALL SELECT 2;
GO
- bạn chỉ có thể chèn người chơi theo từng cặp hoàn chỉnh
INSERT INTO dbo.Players(PlayerID, TeamID, NumberInTeam, TeamMateID, TeamMatesNumberInTeam)
SELECT 1,1,1,2,2 UNION ALL
SELECT 2,1,2,1,1;
Bạn có thể thử chèn một người chơi hoặc xóa một người chơi khỏi đội hoặc chèn nhiều hơn hai người chơi cho mỗi đội - tất cả đều sẽ thất bại do đã có đầy đủ các ràng buộc.
Lưu ý:thực tiễn trong SQL Server là đặt tên rõ ràng cho tất cả các ràng buộc. Tôi đã không đặt tên cho các ràng buộc của mình để đề phòng trường hợp không tương thích với Postgres.