我的数据库中有 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 字段,票证可以由组或用户拥有。
什么是最正确的方式来描述票证和可选的用户或组之间的这种关系?
我想我应该在票证表中添加一个标志,说明拥有它的类型。
最佳答案
您有几个选项,所有选项都在“正确性”和易用性方面有所不同。与往常一样,正确的设计取决于您的需求。
这是使用您发布的架构的粗略示例:
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
)
关于sql-server - 多个表的外键,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7844460/