sql >> Database >  >> RDS >> PostgreSQL

Database-ontwerp voor het afdwingen van koppelingen met beperkingen

Ik weet niet of dit kan werken op Postgress, maar hier is een SQL Server-oplossing:

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

-- je kunt alleen spelers in volledige paren plaatsen

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

Je kunt proberen een enkele speler toe te voegen, of een speler uit een team te verwijderen, of meer dan twee spelers per team toe te voegen - alles zal mislukken vanwege een volledige reeks beperkingen.

Opmerking:de praktijk in SQL Server is om alle beperkingen expliciet te noemen. Ik heb mijn beperkingen niet genoemd voor het geval dat niet compatibel is met Postgres.



  1. Python cx_Oracle SQL met bindreeksvariabele

  2. ORA-01722:ongeldig nummer in Entity Framework

  3. SQL Om te controleren of de kamer beschikbaar is tussen de data

  4. Breed varchar-veld veroorzaakt Gevraagde conversie wordt niet ondersteund fout bij gebruik van openquery met MySQL-gekoppelde server