Un altro approccio è quello di creare una tabella di associazione che contenga colonne per ogni potenziale tipo di risorsa. Nel tuo esempio, ciascuno dei due tipi di proprietario esistenti ha una propria tabella (il che significa che hai qualcosa a cui fare riferimento). Se questo sarà sempre il caso, puoi avere qualcosa del genere:
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
)
Con questa soluzione, continueresti ad aggiungere nuove colonne mentre aggiungi nuove entità al database e elimineresti e ricreare il modello di vincolo di chiave esterna mostrato da @Nathan Skerl. Questa soluzione è molto simile a @Nathan Skerl ma ha un aspetto diverso (fino alle preferenze).
Se non hai intenzione di avere una nuova tabella per ogni nuovo tipo di proprietario, forse sarebbe bene includere un proprietario_tipo invece di una colonna di chiave esterna per ogni potenziale proprietario:
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
)
Con il metodo sopra, è possibile aggiungere tutti i tipi di proprietario desiderati. Owner_ID non avrebbe un vincolo di chiave esterna ma verrebbe utilizzato come riferimento alle altre tabelle. Il rovescio della medaglia è che dovresti guardare la tabella per vedere quali tipi di proprietario ci sono poiché non è immediatamente ovvio in base allo schema. Lo suggerirei solo se non conosci in anticipo i tipi di proprietario e non si collegheranno ad altre tabelle. Se conosci in anticipo i tipi di proprietario, sceglierei una soluzione come @Nathan Skerl.
Scusate se ho sbagliato SQL, ho appena lanciato questo.