Другой подход - создать ассоциативную таблицу, содержащую столбцы для каждого потенциального типа ресурса. В вашем примере каждый из двух существующих типов владельцев имеет свою собственную таблицу (что означает, что вам есть на что ссылаться). Если так будет всегда, у вас может получиться что-то вроде этого:
CREATE TABLE dbo.Group
(
ID int NOT NULL,
Name varchar(50) NOT NULL
)
CREATE TABLE dbo.User
(
ID int NOT NULL,
Name varchar(50) NOT NULL
)
CREATE TABLE dbo.Ticket
(
ID int NOT NULL,
Owner_ID int NOT NULL,
Subject varchar(50) NULL
)
CREATE TABLE dbo.Owner
(
ID int NOT NULL,
User_ID int NULL,
Group_ID int NULL,
{{AdditionalEntity_ID}} int NOT NULL
)
С помощью этого решения вы продолжите добавлять новые столбцы по мере добавления новых сущностей в базу данных, а также удалите и воссоздайте шаблон ограничения внешнего ключа, показанный @Nathan Skerl. Это решение очень похоже на @Nathan Skerl, но выглядит иначе (в зависимости от предпочтений).
Если у вас не будет новой таблицы для каждого нового типа владельца, то, возможно, было бы хорошо включить owner_type вместо столбца внешнего ключа для каждого потенциального владельца:
CREATE TABLE dbo.Group
(
ID int NOT NULL,
Name varchar(50) NOT NULL
)
CREATE TABLE dbo.User
(
ID int NOT NULL,
Name varchar(50) NOT NULL
)
CREATE TABLE dbo.Ticket
(
ID int NOT NULL,
Owner_ID int NOT NULL,
Owner_Type string NOT NULL, -- In our example, this would be "User" or "Group"
Subject varchar(50) NULL
)
С помощью описанного выше метода вы можете добавить столько типов владельцев, сколько захотите. Owner_ID не будет иметь ограничения внешнего ключа, но будет использоваться как ссылка на другие таблицы. Обратной стороной является то, что вам придется взглянуть на таблицу, чтобы увидеть, какие типы владельцев есть, поскольку это не сразу очевидно на основе схемы. Я бы предложил это только в том случае, если вы заранее не знаете типы владельцев, и они не будут связываться с другими таблицами. Если вы заранее знаете типы владельцев, я бы выбрал такое решение, как @Nathan Skerl.
Извините, если я ошибся в SQL, я просто собрал это вместе.