sql >> Database teknologi >  >> RDS >> Mysql

Design af lagerstyringsdatabase

Jeg har det samme behov, og her er, hvordan jeg tacklede dit aktiebevægelsesproblem (som også blev mit problem).

For at modellere lagerbevægelser (+/-), har jeg min forsyning og min ordre tabeller. Levering fungerer som mit +lager, og mine ordrer er mit lager.

Hvis vi stopper med dette, kunne vi beregne vores faktiske lager, som ville blive transskriberet til denne SQL-forespørgsel:

SELECT id, name, sup.length - ord.length AS 'stock'FROM product# Beregner antallet af ankomne varerINNER JOIN ( SELECT productId, SUM(quantity) SOM 'længde' FRA levering, HVOR ankom ER TRUE GROUP BY productId) AS sup ON sup.productId =product.id# Beregner antallet af ordreINNER JOIN ( SELECT productId, SUM(quantity) AS 'længde' FRA product_order GROUP BY productId) AS ord ON ord.productId =product.id

Hvilket ville give noget som:

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

Selvom dette kan spare dig for én tabel, vil du ikke være i stand til at skalere med den, derfor det faktum, at det meste af modelleringen (imho) bruger en mellemliggende aktie tabel, mest af hensyn til ydeevnen.

En af ulemperne er dataduplikeringen, fordi du bliver nødt til at køre forespørgslen ovenfor igen for at opdatere dit lager (se updatedAt kolonne).

Den gode side er klientens ydeevne. Du vil levere hurtigere svar gennem din API.

Jeg tror, ​​at en anden ulempe kunne være, hvis du administrerer en butik med stor trafik. Du kunne forestille dig at oprette en anden tabel, der gemmer det faktum, at et lager bliver genberegnet, og få brugeren til at vente, indtil genberegningen er færdig (push-anmodning eller lang polling) for at kontrollere, om hver af hans/hendes varer stadig er tilgængelige (lager>=brugerefterspørgsel). Men det er en anden aftale...

I hvert fald, selvom forespørgslen om lagerberegning bruger anonyme underforespørgsler, burde den faktisk være ret hurtig nok i de fleste af de relativt mellemstore butikker.

Bemærk

Du kan se i product_order , jeg duplikerede prisen og momsen. Dette er af pålidelighedsgrunde:for at fryse prisen i købsøjeblikket og for at kunne genberegne totalen med mange decimaler (uden at miste øre i vejen).

Håber det hjælper nogen der går forbi.

Rediger

I praksis bruger jeg det med Laravel , og jeg bruger en konsolkommando , som vil beregne mit produktlager i batch (jeg bruger også en valgfri parameter til kun at beregne for et bestemt produkt-id), så mit lager er altid korrekt (i forhold til forespørgslen ovenfor), og jeg opdaterer aldrig lagertabellen manuelt.



  1. Primære nøgler med Apache Spark

  2. Hvordan får man den primære nøgle til tabellen?

  3. Sådan indsætter og sletter du data i PostgreSQL

  4. Hvordan kan jeg kombinere flere rækker til en kommasepareret liste i SQL Server 2005?