Eu tenho a mesma necessidade, e aqui está como eu lidei com seu problema de movimentação de estoque (que se tornou meu problema também).
Para modelar a movimentação de estoque (+/-), tenho meu
supplying
e meu order
mesas. O fornecimento age como meu +estoque, e meus pedidos meu -estoque. Se pararmos com isso, poderíamos calcular nosso estoque real que seria transcrito para esta consulta SQL:
SELECT
id,
name,
sup.length - ord.length AS 'stock'
FROM
product
# Computes the number of items arrived
INNER JOIN (
SELECT
productId,
SUM(quantity) AS 'length'
FROM
supplying
WHERE
arrived IS TRUE
GROUP BY
productId
) AS sup ON sup.productId = product.id
# Computes the number of order
INNER JOIN (
SELECT
productId,
SUM(quantity) AS 'length'
FROM
product_order
GROUP BY
productId
) AS ord ON ord.productId = product.id
O que daria algo como:
id name stock
=========================
1 ASUS Vivobook 3
2 HP Spectre 10
3 ASUS Zenbook 0
...
Embora isso possa economizar uma tabela, você não poderá dimensionar com ela, daí o fato de que a maior parte da modelagem (imho) usa um
stock
intermediário tabela, principalmente por questões de desempenho. Uma das desvantagens é a duplicação de dados, pois você precisará executar novamente a consulta acima para atualizar seu estoque (consulte o
updatedAt
coluna). O lado bom é o desempenho do cliente. Você entregará respostas mais rápidas por meio de sua API.
Eu acho que outra desvantagem pode ser se você estiver gerenciando uma loja de alto tráfego. Você pode imaginar criar outra tabela que armazene o fato de que um estoque está sendo recalculado, e faça o usuário esperar até que o recálculo termine (solicitação push ou sondagem longa) para verificar se todos os seus itens ainda estão disponíveis (estoque>=demanda do usuário). Mas isso é outro negócio...
De qualquer forma, mesmo que a consulta de cálculo de ações esteja usando subconsultas anônimas, ela deve ser bastante rápida na maioria das lojas relativamente médias.
Observação
Você vê no
product_order
, dupliquei o preço e o IVA. Isso é por motivos de confiabilidade:congelar o preço no momento da compra e poder recalcular o total com muitas casas decimais (sem perder centavos no caminho). Espero que ajude alguém que esteja passando.
Editar
Na prática, eu uso com Laravel , e uso um comando de console , que calculará meu estoque de produtos em lote (eu também uso um parâmetro opcional para calcular apenas para um determinado id de produto), então meu estoque está sempre correto (em relação à consulta acima) e eu nunca atualizo manualmente a tabela de estoque.