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.