Otro enfoque es crear una tabla de asociación que contenga columnas para cada tipo de recurso potencial. En su ejemplo, cada uno de los dos tipos de propietarios existentes tiene su propia tabla (lo que significa que tiene algo a lo que hacer referencia). Si este siempre será el caso, puede tener algo como esto:
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 esta solución, continuaría agregando nuevas columnas a medida que agrega nuevas entidades a la base de datos y eliminaría y volvería a crear el patrón de restricción de clave externa que muestra @Nathan Skerl. Esta solución es muy similar a @Nathan Skerl, pero se ve diferente (hasta la preferencia).
Si no va a tener una nueva Tabla para cada nuevo tipo de Propietario, entonces sería bueno incluir un tipo de propietario en lugar de una columna de clave externa para cada Propietario potencial:
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 el método anterior, puede agregar tantos tipos de propietarios como desee. Owner_ID no tendría una restricción de clave externa, pero se utilizaría como referencia para las otras tablas. La desventaja es que tendrías que mirar la tabla para ver cuáles son los tipos de propietarios, ya que no es inmediatamente obvio según el esquema. Solo sugeriría esto si no conoce los tipos de propietario de antemano y no se vincularán a otras tablas. Si conoce de antemano los tipos de propietarios, elegiría una solución como @Nathan Skerl.
Lo siento si me equivoqué con un poco de SQL, solo hice esto.