sql >> Databasteknik >  >> RDS >> PostgreSQL

Databasdesign för begränsningsframtvingande parning

Jag vet inte om detta kan fungera på Postgress, men här är en SQL Server-lösning:

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

-- du kan bara infoga spelare i kompletta par

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

Du kan prova att infoga en enskild spelare, eller ta bort en spelare från ett lag, eller infoga fler än två spelare per lag - alla kommer att misslyckas på grund av en komplett uppsättning begränsningar.

Notera:praxis i SQL Server är att uttryckligen namnge alla begränsningar. Jag nämnde inte mina begränsningar i fall det inte är kompatibelt med Postgres.



  1. MySQL Ladda datafil

  2. Nackdelar med att lagra bilder i en databas?

  3. Hur man producerar en csv-utdatafil från lagrad procedur i SQL Server

  4. Slå samman tabeller med kommavärden