PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Datenbankdesign für Constraint-Enforcement-Pairing

Ich weiß nicht, ob dies auf Postgress funktionieren kann, aber hier ist eine SQL Server-Lösung:

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

-- Spieler können nur als komplette Paare eingefügt werden

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

Sie können versuchen, einen einzelnen Spieler einzufügen, einen Spieler aus einem Team zu löschen oder mehr als zwei Spieler pro Team einzufügen – alles wird aufgrund einer Reihe von Einschränkungen fehlschlagen.

Hinweis:Die Praxis in SQL Server besteht darin, alle Einschränkungen explizit zu benennen. Ich habe meine Einschränkungen nicht genannt, nur für den Fall, dass dies nicht mit Postgres kompatibel ist.