Une autre approche consiste à créer une table d'association contenant des colonnes pour chaque type de ressource potentiel. Dans votre exemple, chacun des deux types de propriétaires existants a sa propre table (ce qui signifie que vous avez quelque chose à référencer). Si tel est toujours le cas, vous pouvez avoir quelque chose comme ceci:
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
)
Avec cette solution, vous continueriez à ajouter de nouvelles colonnes à mesure que vous ajoutez de nouvelles entités à la base de données et vous supprimeriez et recréeriez le modèle de contrainte de clé étrangère affiché par @Nathan Skerl. Cette solution est très similaire à @Nathan Skerl mais semble différente (selon vos préférences).
Si vous n'allez pas avoir une nouvelle table pour chaque nouveau type de propriétaire, il serait peut-être bon d'inclure un owner_type au lieu d'une colonne de clé étrangère pour chaque propriétaire potentiel:
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
)
Avec la méthode ci-dessus, vous pouvez ajouter autant de types de propriétaires que vous le souhaitez. Owner_ID n'aurait pas de contrainte de clé étrangère mais serait utilisé comme référence aux autres tables. L'inconvénient est que vous devriez regarder le tableau pour voir quels types de propriétaires il y a car ce n'est pas immédiatement évident en fonction du schéma. Je ne suggérerais cela que si vous ne connaissez pas les types de propriétaires à l'avance et qu'ils ne seront pas liés à d'autres tables. Si vous connaissez à l'avance les types de propriétaires, j'irais avec une solution comme @Nathan Skerl.
Désolé si je me trompe de SQL, je viens de jeter ceci ensemble.