Ik heb dezelfde behoefte, en hier is hoe ik uw probleem met aandelenbewegingen heb aangepakt (wat ook mijn probleem werd).
Om voorraadbewegingen (+/-) te modelleren, heb ik mijn supplying
en mijn order
tafels. Leveringen fungeren als mijn +voorraad, en mijn bestellingen mijn -voorraad.
Als we hiermee stoppen, kunnen we onze werkelijke voorraad berekenen die in deze SQL-query zou worden getranscribeerd:
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
Wat zoiets zou opleveren als:
id name stock
=========================
1 ASUS Vivobook 3
2 HP Spectre 10
3 ASUS Zenbook 0
...
Hoewel dit u één tabel zou kunnen besparen, kunt u er niet mee schalen, vandaar het feit dat de meeste modellen (imho) een tussenliggende stock
gebruiken tabel, meestal voor prestatieproblemen.
Een van de nadelen is de dubbele gegevens, omdat u de bovenstaande zoekopdracht opnieuw moet uitvoeren om uw voorraad bij te werken (zie de updatedAt
kolom).
De goede kant is de klantprestatie. U levert snellere reacties via uw API.
Ik denk dat een ander nadeel zou kunnen zijn als u een winkel met veel verkeer beheert. Je zou je kunnen voorstellen een andere tabel te maken waarin het feit wordt opgeslagen dat een voorraad wordt herberekend, en de gebruiker laat wachten tot de herberekening is voltooid (push-verzoek of lange polling) om te controleren of al zijn/haar artikelen nog beschikbaar zijn (voorraad>=gebruikersvraag). Maar dat is een andere deal...
Hoe dan ook, zelfs als de zoekopdracht voor het herberekenen van aandelen anonieme subquery's gebruikt, zou het in de meeste relatief middelgrote winkels vrij snel genoeg moeten zijn.
Opmerking
Je ziet in de product_order
, Ik dupliceerde de prijs en de btw. Dit is om redenen van betrouwbaarheid:om de prijs te bevriezen op het moment van aankoop, en om het totaal opnieuw te kunnen berekenen met veel decimalen (zonder centen te verliezen).
Ik hoop dat het iemand helpt die langskomt.
Bewerken
In de praktijk gebruik ik het met Laravel , en ik gebruik een console-opdracht , die mijn productvoorraad in batch berekent (ik gebruik ook een optionele parameter om alleen voor een bepaald product-ID te berekenen), dus mijn voorraad is altijd correct (ten opzichte van de bovenstaande vraag), en ik werk de voorraadtabel nooit handmatig bij.