Exemplo simplificado de um problema de modelagem de dados que tenho:
Tenho um modelo de domínio com image
tabela, camera
tabela, machine
tabela, restrição de chave estrangeira entre imagem e câmera ( taken_by_camera
) e um FK entre câmera e máquina ( installed_into_machine
).
image taken_by_camera camera
camera installed_into_machine machine
Tudo isso é baseado nos dados que obtemos dos clientes.
Porém, em nossa aplicação utilizamos os dados quase sempre em termos de conjuntos de imagens. Então, também temos uma set
mesa. Cada imagem pertence a um conjunto e para isso temos um belongs_to_set
FK na image
mesa.
image belongs_to_set set
Meu problema é que eu gostaria de restringir os conjuntos a conterem apenas imagens de uma máquina específica, por exemplo
set restricted_to_machine machine
Com apenas esses FKs implementados, não tenho nenhuma restrição que garanta que todas as imagens conectadas via câmera a uma máquina específica também acabem sendo conectadas à mesma máquina por meio do aparelho.
image_1 taken_by_camera camera_1
camera_1 installed_into_machine **machine_1**
image_1 belongs_to_set set_1
set_1 restricted_to_machine **machine_2**
Como posso modelar algo assim (logicamente, mas também no postgres).
PS: Deve ser possível ter imagens tiradas por câmeras diferentes em um conjunto, desde que essas câmeras estejam instaladas na mesma máquina.
Você precisa ter
set
um FK ativadomachine
e esta deve ser uma chave exclusiva composta secundária junto com sua chave primária principal.Você também deve fazer o mesmo para
camera
Em seguida, altere os FKs
image
para que eles façam referência a essas novas chaves compostas exclusivasAgora, qualquer linha inserida
image
não faz referência diretamachine
à tabela , ela faz referência às tabelas e por meio de sua coluna, garantindo assim que a ou à qual ela faz referência tenha o mesmo que faz.camera
set
machine_id
camera
set
machine_id
image
banco de dados<> violino