Первая опция в списке @ Nathan Skerl - это то, что было реализовано в проекте, с которым я когда-то работал, где между тремя таблицами была установлена аналогичная связь.(Один из них ссылался на два других, по одному за раз.)
Итак, таблица ссылок имела два столбца внешнего ключа, а также имела ограничение, гарантирующее, что ровно одна таблица (не обе, не ни те, ни другие)на него ссылалась одна строка.
Вот как это может выглядеть применительно к вашим таблицам:
CREATE TABLE dbo.[Group]
(
ID int NOT NULL CONSTRAINT PK_Group PRIMARY KEY,
Name varchar(50) NOT NULL
);
CREATE TABLE dbo.[User]
(
ID int NOT NULL CONSTRAINT PK_User PRIMARY KEY,
Name varchar(50) NOT NULL
);
CREATE TABLE dbo.Ticket
(
ID int NOT NULL CONSTRAINT PK_Ticket PRIMARY KEY,
OwnerGroup int NULL
CONSTRAINT FK_Ticket_Group FOREIGN KEY REFERENCES dbo.[Group] (ID),
OwnerUser int NULL
CONSTRAINT FK_Ticket_User FOREIGN KEY REFERENCES dbo.[User] (ID),
Subject varchar(50) NULL,
CONSTRAINT CK_Ticket_GroupUser CHECK (
CASE WHEN OwnerGroup IS NULL THEN 0 ELSE 1 END +
CASE WHEN OwnerUser IS NULL THEN 0 ELSE 1 END = 1
)
);
Как видите, таблица Ticket
имеет два столбца, OwnerGroup
и OwnerUser
, оба из которых являются обнуляемыми внешними ключами.(Соответствующие столбцы в двух других таблицах соответственно являются первичными ключами.) Проверочное ограничение CK_Ticket_GroupUser
гарантирует, что только один из двух столбцов внешнего ключа содержит ссылку (другой - NULL, поэтому обе должны иметь значение NULL).
(Первичный ключ на Ticket.ID
не является необходимым для этой конкретной реализации, но определенно не повредит иметь такой ключ в такой таблице.)