gpt4 book ai didi

sql-server - 多个表的外键

转载 作者:行者123 更新时间:2023-12-01 16:47:57 25 4
gpt4 key购买 nike

我的数据库中有 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
)

关于sql-server - 多个表的外键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7844460/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com