Opção 1
Eu tenho um esquema de banco de dados parecido com este:
https://dbfiddle.uk/JKCTjadD
- A
Task
pertence a aService
(como em ECS ) - A
Task
pode ser reatribuído a outroService
. TaskConfig
rastreia o histórico de reatribuições (e outras configurações), e o registro mais recente (usandoinserted_on DESC
) é aqueleService
ao qual aTask
está atualmente atribuído.- A
Service
tem uma restrição única (service_name
,environment
). O ambiente tem sua própria tabela, mas ilustrada aqui como um Enum por questões de brevidade. - A
Task
também tem uma restrição única (task_name
,environment
).
O problema
O environment
in Task
é duplicado/redundante: o Service
associado ao Task
já possui o environment
que Task
está dentro.
opção 2
Decidi mudar para Service_id
: https://dbfiddle.uk/QB7k9hK3 Posso
então usar a seguinte consulta para buscar os pares mais recentes de ( , ):TaskConfig
Task
task_name
environment_name
SELECT DISTINCT ON (task_name, environment_name) *
FROM TaskConfig
JOIN Task ON Task.id = Task_id
JOIN Service ON Service.id = Service_id
ORDER BY task_name, environment_name, inserted_on DESC
O problema
- Não posso mais ter uma restrição exclusiva em (
task_name
,environment
) poisenvironment
não está naTask
tabela. - Um futuro desenvolvedor pode selecionar erroneamente (
task_name
,Service_id
) o que não resultará em pares exclusivos (task_name
,environment
).
Ajuda
Como você proporia resolver os problemas acima?
Se não houver maneiras melhores, qual das duas opções acima é o melhor esquema?
Se uma tarefa puder pertencer apenas a um serviço, o segundo modelo de dados será o correto. Para impor sua restrição, você deve adicionar uma cópia redundante de
environment
totask
:adicione uma nova coluna
environment
etask
preencha-a com os valores deservice
adicione uma restrição exclusiva redundante em
service (id, environment)
defina a chave estrangeira de
task
atéservice
usando essas duas colunasAgora você pode adicionar sua restrição. Sim, esta resposta precisa de uma cópia redundante
environment
, mas não há como evitar isso.