sql >> Database teknologi >  >> RDS >> PostgreSQL

Databasedesign til begrænsningshåndhævelse af parring

Jeg ved ikke, om dette kan fungere på Postgress, men her er 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 kun indsætte spillere i hele 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 prøve at indsætte en enkelt spiller, eller slette en spiller fra et hold eller indsætte mere end to spillere pr. hold - alle vil mislykkes på grund af et komplet sæt af begrænsninger.

Bemærk:praksis i SQL Server er eksplicit at navngive alle begrænsninger. Jeg nævnte ikke mine begrænsninger bare i tilfælde af, at det ikke er kompatibelt med Postgres.



  1. Hvordan kan jeg flette to strenge af kommaseparerede tal i MySQL?

  2. Er id-kolonneposition i Postgresql vigtig?

  3. Indsæt forespørgsel i Oracle:Ugyldigt tabelnavn

  4. Indstil værdien til NULL i MySQL