Je hebt een paar opties, allemaal variërend in "juistheid" en gebruiksgemak. Zoals altijd hangt het juiste ontwerp af van uw behoeften.
-
U kunt eenvoudig twee kolommen maken in Ticket, OwnedByUserId en OwnedByGroupId, en voor elke tabel een nullable externe sleutel hebben.
-
U kunt M:M-referentietabellen maken die zowel ticket:gebruiker- als ticket:groeprelaties mogelijk maken. Misschien wilt u in de toekomst toestaan dat een enkel ticket eigendom is van meerdere gebruikers of groepen? Dit ontwerp dwingt niet af dat een ticket moet eigendom zijn van slechts één enkele entiteit.
-
U kunt voor elke gebruiker een standaardgroep maken en tickets hebben die eenvoudigweg eigendom zijn van een echte groep of de standaardgroep van een gebruiker.
-
Of (mijn keuze) een entiteit modelleren die fungeert als basis voor zowel gebruikers als groepen, en tickets hebben die eigendom zijn van die entiteit.
Hier is een ruw voorbeeld met uw geposte schema:
create table dbo.PartyType
(
PartyTypeId tinyint primary key,
PartyTypeName varchar(10)
)
insert into dbo.PartyType
values(1, 'User'), (2, 'Group');
create table dbo.Party
(
PartyId int identity(1,1) primary key,
PartyTypeId tinyint references dbo.PartyType(PartyTypeId),
unique (PartyId, PartyTypeId)
)
CREATE TABLE dbo.[Group]
(
ID int primary key,
Name varchar(50) NOT NULL,
PartyTypeId as cast(2 as tinyint) persisted,
foreign key (ID, PartyTypeId) references Party(PartyId, PartyTypeID)
)
CREATE TABLE dbo.[User]
(
ID int primary key,
Name varchar(50) NOT NULL,
PartyTypeId as cast(1 as tinyint) persisted,
foreign key (ID, PartyTypeId) references Party(PartyID, PartyTypeID)
)
CREATE TABLE dbo.Ticket
(
ID int primary key,
[Owner] int NOT NULL references dbo.Party(PartyId),
[Subject] varchar(50) NULL
)