Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Chave estrangeira para várias tabelas


Você tem algumas opções, todas variando em "correção" e facilidade de uso. Como sempre, o design certo depende das suas necessidades.

  • Você pode simplesmente criar duas colunas em Ticket, OwnedByUserId e OwnedByGroupId, e ter chaves estrangeiras anuláveis ​​para cada tabela.

  • Você pode criar tabelas de referência M:M habilitando os relacionamentos ticket:user e ticket:group. Talvez no futuro você queira permitir que um único ticket seja de propriedade de vários usuários ou grupos? Este design não impõe que um ticket deve ser propriedade de uma única entidade.

  • Você pode criar um grupo padrão para cada usuário e ter tickets de propriedade de um grupo verdadeiro ou do grupo padrão de um usuário.

  • Ou (minha escolha) modelar uma entidade que atue como base para Usuários e Grupos e tenha tickets pertencentes a essa entidade.

Aqui está um exemplo aproximado usando seu esquema postado:
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
)