sql >> Databáze >  >> RDS >> Mysql

Návrh databáze řízení zásob

Mám stejnou potřebu a zde je návod, jak jsem vyřešil váš problém s pohybem akcií (který se stal i mým problémem).

Abych mohl modelovat pohyb zásob (+/-), mám své supplying a moje order tabulky. Zásobování funguje jako moje +zásoba a moje objednávky jako moje -zásoby.

Pokud se zastavíme u tohoto, mohli bychom vypočítat naše skutečné zásoby, které by byly přepsány do tohoto SQL dotazu:

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

Což by dalo něco jako:

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

I když vám to může ušetřit jednu tabulku, nebudete s ní moci škálovat, proto většina modelování (imho) používá mezilehlou stock tabulka, většinou kvůli výkonu.

Jednou z nevýhod je duplikace dat, protože k aktualizaci zásob budete muset znovu spustit dotaz výše (viz updatedAt sloupec).

Dobrou stránkou je výkon klienta. Prostřednictvím vašeho API budete poskytovat rychlejší odpovědi.

Myslím, že další nevýhodou by mohlo být, pokud spravujete obchod s vysokou návštěvností. Můžete si představit vytvoření další tabulky, která ukládá skutečnost, že se zásoby přepočítávají, a nechat uživatele čekat na dokončení přepočtu (požadavek push nebo dlouhé dotazování), aby zkontroloval, zda jsou všechny jeho položky stále dostupné (zásoby>=uživatelská poptávka). Ale to je jiná dohoda...

Každopádně, i když dotaz na přepočet akcií používá anonymní poddotazy, měl by být ve skutečnosti dost rychlý ve většině relativně středních obchodů.

Poznámka

Vidíte v product_order , duplikoval jsem cenu a dp. Důvodem je spolehlivost:zmrazení ceny v okamžiku nákupu a možnost přepočítat součet na mnoho desetinných míst (aniž by se ztrácely centy).

Doufám, že to pomůže někomu kolemjdoucímu.

Upravit

V praxi to používám s Laravel a používám příkaz konzoly , která mi vypočítá zásoby produktu v dávce (také používám volitelný parametr pro výpočet pouze pro určité ID produktu), takže moje zásoby jsou vždy správné (vzhledem k výše uvedenému dotazu) a nikdy ručně neaktualizuji tabulku zásob.



  1. Pro poskytovatele ADO.NET „MySql.Data.MySqlClient“ nebyl nalezen žádný poskytovatel Entity Framework

  2. ORA-00947 Při globální deklaraci typu není dostatek hodnot

  3. Funkce MySQL LOG10() – Vrátí základní-10 logaritmus hodnoty

  4. Jak odstranit duplikáty v tabulce SQL na základě více polí