Mysql
 sql >> Database >  >> RDS >> Mysql

Progettazione del database di gestione delle scorte

Ho la stessa esigenza, ed ecco come ho affrontato il tuo problema di movimento delle azioni (che è diventato anche il mio problema).

Per modellare il movimento delle azioni (+/-), ho la mia supplying e il mio order tavoli. La fornitura agisce come il mio +stock e i miei ordini il mio -stock.

Se ci fermiamo a questo, potremmo calcolare il nostro stock effettivo che verrebbe trascritto in questa query 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

Che darebbe qualcosa come:

id  name            stock
=========================
 1  ASUS Vivobook       3
 2  HP Spectre         10
 3  ASUS Zenbook        0
    ...

Anche se questo potrebbe farti risparmiare una tabella, non sarai in grado di ridimensionarla, da qui il fatto che la maggior parte della modellazione (imho) utilizza un stock intermedio tabella, principalmente per problemi di prestazioni.

Uno degli aspetti negativi è la duplicazione dei dati, perché dovrai eseguire nuovamente la query sopra per aggiornare le tue azioni (vedi updatedAt colonna).

Il lato positivo sono le prestazioni del cliente. Fornirai risposte più rapide tramite la tua API.

Penso che un altro aspetto negativo potrebbe essere se gestisci un negozio ad alto traffico. Si potrebbe immaginare di creare un'altra tabella che memorizzi il fatto che uno stock viene ricalcolato e che faccia aspettare l'utente fino al termine del ricalcolo (richiesta push o polling lungo) per verificare se tutti i suoi articoli sono ancora disponibili (stock>=richiesta dell'utente). Ma questo è un altro affare...

Ad ogni modo, anche se la query di ricalcolo delle scorte utilizza sottoquery anonime, dovrebbe essere abbastanza veloce nella maggior parte dei negozi relativamente medi.

Nota

Lo vedi nel product_order , ho duplicato il prezzo e l'iva. Questo per ragioni di affidabilità:per bloccare il prezzo al momento dell'acquisto e per poter ricalcolare il totale con molti decimali (senza perdere centesimi).

Spero che aiuti qualcuno di passaggio.

Modifica

In pratica lo uso con Laravel e utilizzo un comando della console , che calcolerà il mio stock di prodotti in batch (uso anche un parametro facoltativo per calcolare solo per un determinato ID prodotto), quindi il mio stock è sempre corretto (relativo alla query precedente) e non aggiorno mai manualmente la tabella stock.