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

    10-16 03:39