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.