sql >> Databáze >  >> RDS >> PostgreSQL

Návrh databáze pro párování vynucující omezení

Nevím, jestli to může fungovat na Postgress, ale tady je řešení pro 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

-- hráče můžete vložit pouze v úplných párech

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

Můžete zkusit vložit jednoho hráče nebo odstranit hráče z týmu nebo vložit více než dva hráče do týmu – vše selže kvůli kompletní sadě omezení.

Poznámka:Praxe v SQL Server je explicitně pojmenovat všechna omezení. Neuvedl jsem svá omezení pro případ, že to není kompatibilní s Postgres.



  1. Rozdíl mezi databází, tabulkou, řazením sloupců

  2. Mohu zaznamenat čas provádění dotazu v PostgreSQL 8.4?

  3. mysqli není podporováno v google app engine s php

  4. Jak získat hodnoty sloupců v jedné hodnotě oddělené čárkami