Entendo seu problema, mas tenho dúvidas sobre partes dele, então serei um pouco mais geral.
- Se possível, eu armazenaria dados de depósito/depósito de backup com seus dados de inventário (seja diretamente pendurado nos depósitos ou se for específico do produto nas tabelas de inventário).
- Se a configuração precisar ser calculada por meio de sua lógica de negócios, os registros deverão ficar fora da tabela order/order_item
Em termos de como implementar a estrutura em SQL, assumirei que todos os pedidos são enviados de um único depósito e que o envio deve ser pendurado na tabela de pedidos (mas as ideias devem ser aplicáveis em outro lugar):
-
A maneira mais antiga de impor depósitos de backup zero/um seria pendurar um registro Warehouse_Source da tabela Orders e incluir um campo "IsPrimary" ou "ShippingPriority" e incluir um índice exclusivo composto que inclui OrderID e IsPrimary/ShippingPriority.
-
se você tiver apenas um depósito de backup, poderá adicionar os campos ShippingSource_WareHouseID e ShippingSource_Backup_WareHouseID ao pedido. Embora, este não é o caminho que eu iria.
No SQL 2008 e versões posteriores, temos a maravilhosa adição de Filtered Indexes . Eles permitem que você adicione uma cláusula WHERE ao seu índice -- resultando em um índice mais compacto. Ele também tem o benefício adicional de permitir que você realize algumas coisas que só podiam ser feitas por meio de gatilhos no passado.
- Você pode colocar um índice filtrado exclusivo em OrderID &IsPrimary/ShippingPriority (WHERE IsPrimary =0).
Adicione um comentário ou algo assim se você quiser que eu explique mais.