我的数据库中有 3 个相关表。
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 int NOT NULL, Subject varchar(50) NULL )
用户属于多个组。这是通过多对多关系完成的,但在这种情况下无关紧要。通过 dbo.Ticket.Owner 字段,票可以由组或用户拥有。
描述票证与可选的用户或组之间的这种关系的 最正确 的方式是什么?
我在想我应该在票证表中添加一个标志,说明什么类型拥有它。
您有几个选项,所有选项都在“正确性”和易用性方面各不相同。与往常一样,正确的设计取决于您的需求。
您可以简单地在 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 )