Інший підхід полягає у створенні таблиці асоціацій, яка містить стовпці для кожного потенційного типу ресурсів. У вашому прикладі кожен із двох існуючих типів власників має свою власну таблицю (це означає, що вам є на що посилатися). Якщо це завжди так, ви можете мати щось подібне:
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, але виглядає інакше (залежно від уподобань).
Якщо ви не збираєтеся мати нову таблицю для кожного нового типу власника, можливо, було б добре включити тип власника замість стовпця з іноземним ключем для кожного потенційного власника:
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, я просто зібрав це разом.