A situação é que tenho uma tabela de inquilino e uma tabela de pesquisa de status baseada em inquilino. Cada um com suas próprias chaves primárias de numeração automática.
Agora quero adicionar uma coluna à tabela Tenant para um Status padrão que faça referência à tabela de pesquisa, o inquilino só deve poder padronizar para um status que esteja nesse inquilino e, por algum motivo, a estrutura exata do FK está bagunçada com a cabeça, então pensei em perguntar caso estivesse enlouquecendo haha.
ex Tabelas:
Inquilino:
ID do inquilino | Nome | ID de status padrão |
---|---|---|
1 | Adão | 1 |
2 | Matt | 7 |
Status:
ID do inquilino | statusID | Nome |
---|---|---|
1 | 1 | Novo |
1 | 2 | Fechado |
1 | 3 | Cancelado |
1 | 4 | Feito |
2 | 5 | Futuro |
2 | 6 | Removido |
2 | 7 | Abrir |
Então, eu ia adicionar a chave estrangeira
CONSTRAINT [FK_Tenant_Status] FOREIGN KEY ([defaultStatusID]) REFERENCES [dbo].[Status] ([statusID])
, mas percebi que adoraria alguma maneira de garantir que o defaultStatusID seja de um status no locatário correto e não tenho certeza de qual é o melhor método para isso.
Adicionar inquilinoID ao FK parece errado porque inquilinoID não é estrangeiro para essa tabela e se tornaria circular? A menos que seja realmente tão fácil?CONSTRAINT [FK_Tenant_Status] FOREIGN KEY ([tenantID], [defaultStatusID]) REFERENCES [dbo].[Status] ([tenantID],[statusID])
Imagino que talvez algum tipo de restrição seja o caminho a seguir, mas não tenho certeza.
Obrigado por qualquer ajuda/comentários!
Quando você adiciona as restrições necessárias para fins de identificação e exclusividade de linha, seu modelo é mais ou menos assim:
Se você não tivesse dado um tiro no pé usando substitutos como primeira coisa, você teria iniciado a modelagem identificando e usando as chaves reais como chaves primárias e obteria algo assim:
Então, se você tomasse a decisão de usar substitutos cuidadosamente, faria isso mantendo o tipo de relacionamento entre Locatário e Status como identificador e obteria algo assim:
Então todo o resto é bastante simples. Por exemplo, você poderia modelar os status padrão e ativo assim: