Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Projeto de banco de dados de gerenciamento de estoque


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.