Outra abordagem é criar uma tabela de associação que contenha colunas para cada tipo de recurso em potencial. No seu exemplo, cada um dos dois tipos de proprietários existentes possui sua própria tabela (o que significa que você tem algo a referenciar). Se este for sempre o caso, você pode ter algo parecido com isto:
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
)
Com esta solução, você continuaria adicionando novas colunas ao adicionar novas entidades ao banco de dados e excluir e recriar o padrão de restrição de chave estrangeira mostrado por @Nathan Skerl. Esta solução é muito semelhante à @ Nathan Skerl, mas parece diferente (de acordo com a preferência).
Se você não tiver uma nova tabela para cada novo tipo de proprietário, talvez seja bom incluir um owner_type em vez de uma coluna de chave estrangeira para cada potencial proprietário:
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
)
Com o método acima, você pode adicionar quantos tipos de proprietários desejar. O Owner_ID não teria uma restrição de chave estrangeira, mas seria usado como uma referência para as outras tabelas. A desvantagem é que você teria que olhar para a tabela para ver o que o proprietário digita, pois não é imediatamente óbvio com base no esquema. Eu sugeriria isso apenas se você não conhecer os tipos de proprietário com antecedência e eles não estarão vinculados a outras tabelas. Se você conhece os tipos de proprietários de antemão, eu usaria uma solução como @ Nathan Skerl.
Desculpe se eu entendi errado o SQL, acabei de jogar isso juntos.