sql >> Base de Datos >  >> RDS >> PostgreSQL

Diseño de base de datos para el emparejamiento de aplicación de restricciones

No sé si esto puede funcionar en Postgress, pero aquí hay una solución de 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

-- solo puedes insertar jugadores en parejas completas

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

Puede intentar insertar un solo jugador, eliminar un jugador de un equipo o insertar más de dos jugadores por equipo; todo fallará debido a un conjunto completo de restricciones.

Nota:la práctica en SQL Server es nombrar explícitamente todas las restricciones. No mencioné mis restricciones en caso de que no sea compatible con Postgres.