Existe uma tabela chamada Item(id, name, cost)
e Orders(id, bill_id, item_id, units)
, que é criada para rastrear pedidos feitos, onde mesmo bill_id significa que pertence a um único pedido.
Como impor uma restrição adicional no banco de dados que diz que o item deve estar "disponível" (naquele momento) se precisar ser adicionado como item_id na tabela Order ? Um item é determinado manualmente como "Disponível" e não pode ser derivado de outros campos no banco de dados neste cenário.
Um design de esquema (eu prefiro) é adicionar uma coluna Tipo que teria os campos "Disponível" e "Indisponível". Mas como posso verificar se a restrição de chave estrangeira item_id não deve ser apenas uma chave primária na Item
tabela, seu tipo também deve ser "disponível"?
Esta resposta Stack Overflow usando restrições de verificação parece próxima, mas é a única maneira? Eu sinto que isso é uma coisa trivial para RDBMS, ou isso não é um dado normalizado?
O outro desenho do esquema (eu não prefiro) é ter uma Tabela chamada "Menu" que poderia ter apenas os Itens Disponíveis. O problema é que essa tabela é muito dinâmica por natureza e muda dependendo da disponibilidade de itens. E estou apenas criando uma tabela de subconjunto de itens, dependendo de seu estado, o que não parece ser uma boa ideia.
É fácil fazer isso programaticamente; no entanto, como faço para conseguir isso no RDBMS? Eu gosto da ideia do banco de dados ser inteligente o suficiente para lidar com isso.
A resposta original está errada! Veja Editar 1 para a versão corrigida.
Resposta original
Uma solução incrível exigiria uma chave estrangeira para uma coluna em uma exibição ou uma tabela herdada, mas infelizmente o PostgreSQL (suponho que seja o seu RDBMS por causa da tag) não possui isso (ainda).
Acho que bastaria uma simples mudança na forma como você organiza os dados: crie uma tabela como ItemsAvailableQuantity , conectando um Item com sua disponibilidade que serão referências nos pedidos. Quando um item não está mais disponível,
DELETE
dele.Perceber! A restrição Positive_units pode causar problemas quando seu software reduz as unidades e atinge 0. Faça algo parecido
CHECK >= 0
, se necessário, ou adicione um gatilho que automaticamenteDELETE
-s linhas quando as unidades atingirem 0 (ou menos) em cadaINSERT
ouUPDATE
. Isso preservaria a tabela ItemAvailableQuantity para ter apenas itens realmente disponíveis, que é o que queremos para ser referenciado na tabela ItemOrder .Isso deve resolver seu problema. Não é uma resposta exata para sua pergunta. Isso envolveria um gatilho ou a
CHECK
chamada de uma função como no link que você forneceu.Para visualizar facilmente a quantidade dos itens então, basta criar uma view que una ItemAvailableQuantity e Item . Se você realmente quiser, torne-o
INSERT
capaz com um gatilho (veja o aviso da caixa amarela) .Editar 1
Na verdade , Order (também conhecido como ItemOrder ) deve fazer referência ao Item em vez de ItemAvailableQuantity para evitar qualquer problema quando o Item não estiver disponível no momento, conforme declarado no comentário.
Isso sugere que devemos remover toda a tabela ItemAvailableQuantity e adicionar apenas uma coluna available_quantity em Item .
Então, para ter certeza de inserir apenas itens disponíveis em pedidos, poderíamos simplesmente executar
onde
wanted_quantity
é um parâmetro passado pelo seu software para a consulta.Ainda assim, resolve o problema, mas não é uma resposta direta à pergunta.