Bạn có một vài lựa chọn, tất cả đều khác nhau về độ "đúng" và dễ sử dụng. Như mọi khi, thiết kế phù hợp tùy thuộc vào nhu cầu của bạn.
-
Bạn có thể chỉ cần tạo hai cột trong Ticket, OwnedByUserId và OwnedByGroupId, và có các Khóa ngoại có thể vô hiệu cho mỗi bảng.
-
Bạn có thể tạo bảng tham chiếu M:M cho phép cả quan hệ vé:người dùng và vé:nhóm. Có lẽ trong tương lai bạn sẽ muốn cho phép một vé duy nhất được sở hữu bởi nhiều người dùng hoặc nhóm? Thiết kế này không bắt buộc rằng thẻ phải chỉ được sở hữu bởi một tổ chức duy nhất.
-
Bạn có thể tạo một nhóm mặc định cho mọi người dùng và có vé chỉ thuộc sở hữu của Nhóm thực sự hoặc Nhóm mặc định của người dùng.
-
Hoặc (lựa chọn của tôi) lập mô hình một thực thể hoạt động như một cơ sở cho cả Người dùng và Nhóm, đồng thời có các vé thuộc sở hữu của thực thể đó.
Đây là một ví dụ sơ bộ bằng cách sử dụng lược đồ đã đăng của bạn:
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
)