sql >> Database >  >> RDS >> Mysql

Voorraadbeheer database ontwerp

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.



  1. Dubbele waarden vinden in MySQL

  2. datagrip Kan geen wijzigingen toepassen Deze tabel is alleen-lezen. Wijzigingen in de celeditor kunnen niet worden toegepast

  3. Welke modus voor MySQL WEEK() voldoet aan ISO 8601

  4. Downtime en Hotpatch-toepasmodus in gebruik R12.2