La première option dans @Nathan Skerlla liste est ce qui a été mis en œuvre dans un projet que j'ai déjà travaillé avec, où une relation similaire a été établi entre les trois tableaux. (L'un d'eux mention de deux autres, l'un à la fois).
Ainsi, la table de référence avait deux colonnes de clé étrangère, et aussi elle a une contrainte de garantir qu'une seule table (pas les deux, pas non plus) a été référencée par une seule ligne.
Voici à quoi ça pourrait ressembler quand il est appliqué à vos tables:
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 [Group] IS NULL THEN 0 ELSE 1 END +
CASE WHEN [User] IS NULL THEN 0 ELSE 1 END = 1
)
);
Comme vous pouvez le voir, l' Ticket
tableau a deux colonnes, OwnerGroup
et OwnerUser
, qui sont tous deux nullable clés étrangères. (Les colonnes respectives dans les deux autres tableaux sont réalisés à des clés primaires en conséquence.) L' CK_Ticket_GroupUser
la contrainte de vérification s'assure que seule l'une des deux colonnes de clé étrangère contient une référence (l'autre étant NULLE, c'est pourquoi les deux doivent être nullable).
(La clé primaire sur Ticket.ID
n'est pas nécessaire pour cette mise en oeuvre particulière, mais il a certainement ne serait pas mal d'en avoir un dans un tableau comme celui-ci.)