PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Conception de base de données pour l'appariement d'application de contraintes

Je ne sais pas si cela peut fonctionner sur Postgress, mais voici une solution 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

-- vous ne pouvez insérer des joueurs que par paires complètes

INSERT INTO dbo.Players(PlayerID, TeamID, NumberInTeam, TeamMateID, TeamMatesNumberInTeam)
SELECT 1,1,1,2,2 UNION ALL
SELECT 2,1,2,1,1;

Vous pouvez essayer d'insérer un seul joueur, ou de supprimer un joueur d'une équipe, ou d'insérer plus de deux joueurs par équipe - tout échouera en raison d'un ensemble complet de contraintes.

Remarque :la pratique dans SQL Server consiste à nommer explicitement toutes les contraintes. Je n'ai pas nommé mes contraintes juste au cas où ce ne serait pas compatible avec Postgres.