Имате няколко опции, като всички се различават по "правилност" и лекота на използване. Както винаги, правилният дизайн зависи от вашите нужди.
-
Можете просто да създадете две колони в Ticket, OwnedByUserId и OwnedByGroupId, и да имате нулеви външни ключове към всяка таблица.
-
Можете да създадете референтни таблици M:M, позволяващи както билет:потребител, така и билет:група. Може би в бъдеще ще искате да разрешите един билет да бъде притежаван от множество потребители или групи? Този дизайн не налага, че билетът трябва да бъде собственост само на едно лице.
-
Можете да създадете група по подразбиране за всеки потребител и да имате билети, просто собственост на истинска група или група по подразбиране на потребител.
-
Или (по мой избор) моделирайте обект, който действа като база както за потребители, така и за групи и има билети, притежавани от този обект.
Ето един груб пример за използване на публикуваната от вас схема:
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
)