PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Дизайн на база данни за сдвояване, налагащо ограничения

Не знам дали това може да работи на Postgress, но ето решение за 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

-- можете да вмъквате играчи само в пълни двойки

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

Можете да опитате да вмъкнете един играч, или да изтриете играч от отбор, или да вмъкнете повече от двама играчи на отбор - всичко ще се провали поради пълен набор от ограничения.

Забележка:практиката в SQL Server е изрично да се наименуват всички ограничения. Не посочих моите ограничения само в случай, че не е съвместимо с Postgres.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да прехвърлите NEW.* към EXECUTE в тригерна функция

  2. psycopg2 и сигурност на SQL инжектиране

  3. Означава UPDATE WHERE Value is IN Подзаявка, която има GROUP BY, така че няма проблем(и) със състояние на състезание?

  4. Не можете да стартирате postgresql.service?

  5. Да се ​​изчисли максималната сума на анотирано поле върху групирано по заявка в Django ORM?