Datenbank-Design: Bestands-und Verkaufs-system?
Ich entwickeln müssen, um eine Inventar-und Vertriebs-system.
Für die Inventur, ich muss in der Lage sein zu verfolgen, ideal Lagerbestände, Lagerbestand, Meldebestand, Kosten, Verkaufspreis, etc.
Nicht jeden Gegenstand im Inventar ist "verkauft." Zum Beispiel, ich kann wollen, um Bestand zu halten Plastik-Bechern verwendet für Limonaden. Bedeutet, jedes mal, wenn ich verkaufe ein soda, ich muss zum abziehen der Kunststoff-cup-Inventar zählen. Also, eine "mittlere Cola" ist eigentlich der Kunststoff-cup, einige Servietten und die Flüssigkeit, jedes Element hat seinen eigenen Lagerbestand, Kosten, etc.
Dann gibt es das Konzept der "combos." Vielleicht eine $1 mittlere Cola und ein $3 hamburger verkauft werden, zusammen als eine combo für nur $3.50 (a $0.50 ersparnis). Die Cola erwähnt wurde, einige Servietten. Sagen die hamburger gehören auch Servietten auf seine eigenen. Jedoch, als ein combo, ist der Käufer nicht die Serviette, die für die Cola und der hamburger, sondern der Käufer bekommt nur die gleiche Menge von Servietten, als ob er/Sie Kauf nur die Cola.
Für das Vertriebs-system, die ich brauche, um zu verfolgen alle sale und vielleicht eine Beziehung aufrechtzuerhalten, die mit der Inventar-Datensätze (dies würde bedeuten, dass ich niemals wirklich löschen eines Elements im Inventar, sobald ein Verkauf getätigt wird-für historische Zwecke). Wenn ich verkaufen eine "mittlere Cola" für $1, vielleicht sollte ich es brechen, da $0.90 für die Flüssigkeit und 0,10 US-Dollar für die Kunststoff-cup.
Und wenn ich verkaufen eine "combo", vielleicht brauche ich, um in der Lage sein, um anzugeben, dass der hamburger tatsächlich verkauft für $3 und die mittlere Coke war nur von $0,50 (nur die soda wurde abgezinst, um die combo ansprechender).
Das kann nicht sein das ein neues problem. Hat jemand irgendwelche Ideen (oder Beispiele), die ich mir ansehen kann um dieses problem zu lösen? Ich bin mir nicht sicher, wie das Modell Bestand, der verkaufbaren items (besonders die combos), und zum aufzeichnen der Umsatz.
- mögliche Duplikate von Shopping Cart
- Der link geht nicht auf die Probleme, die ich angesprochen hier. Ich habe einige der vorhandenen Lösungen. Ich sehe nicht, wie Sie behoben haben die Probleme hier festgestellt.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Lösung, die Sie suchen, verlassen Sie sich auf eine Buchhaltung-style-Modell und ein paar von Stücklisten (BOM). Ihre großen entity-Typen gehören:
SKU Dies ist die Liste der Dinge, die Sie verkaufen. Die Eigenschaften gehören Dinge wie Produktbeschreibung und den aktuellen Verkaufspreis. Sie bekommen Lust auf brechen und den Preis in einer untergeordneten Tabelle gibt die Preise im Laufe der Zeit. Nehmen wir an, Sie gehen zu lassen, dass Falten für jetzt. Einige SKUs werden kann "combos" von der Art, die Sie sprechen.
KOMPONENTE Dies ist die Liste der Dinge, die für ein SKU, wie Servietten, Becher, Brötchen, Frikadellen, Cola Sirup etc. - um Ihr Beispiel. Genauso SKU Beschreibungen und Preise, Komponenten, Beschreibungen und Stückkosten. (Das kann auch historisiert in einer untergeordneten Tabelle.) Diese Tabelle ist, wo Sie in der Regel speichern Sie Ihre ROP zu.
ZUSAMMENSETZUNG Dies ist eine Stückliste, die Sie schneidet SKU-und Komponentenebene und sagt, wie viele Einheiten der einzelnen KOMPONENTEN gehen in eine Einheit des SKU. Sie benötigen eine von diesen, sich zu kreuzen zwei SKUs zu (für combos). Sie können entweder eine Tabelle oder zwei Tabellen für diese. Zwei Tabellen halten die Puristen glücklich, eine Tabelle wird zweckmässig aus einem coder Sicht.
VERKAUF Dies ist eine Transaktion, die Tabelle sieht vor, dass ein header für die Aufzeichnung der Verkauf von einer oder mehreren SKUs. Diese Tabelle würde Dinge wie das Datum der Transaktion, Kassierer-ID, und anderen header-Elemente.
SALE_ITEM Dies ist die Transaktions-detail-Tabelle umfassen würde, die SKU wurde verkauft (und wie viele) und für wie viel. Die wie viel ist eine Denormalisierung der SKU Preis zum Zeitpunkt des Verkaufs, konnten aber auch keine besonderen Abweichungen des Preises. Der Preis, den eigentlich die Kosten für die SKU ist eine gute Sache, denormalize, da könnte jemand die Liste Bearbeiten, Preis, SKU und dann würde man den überblick verlieren, wie viel wurde tatsächlich berechnet für das Element an der Zeit.
INVENTORY_HDR Dies ist eine Transaktions-Tabelle, die ähnlich der VERKAUF konzeptionell, aber es wird der header für eine Bestandsaufnahme zu Transaktionen wie den Erhalt von neuen Inventar, mit Inventar (wie bei Verkauf) und bei der Inventur Anpassungen. Wieder, dies wäre Datum/Beschreibung Zeug, aber es kann ein direkter link zu einem SALE_ITEM für Bestands-Bewegungen, Vertrieb, wenn Sie möchten. Sie müssen nicht, es zu tun auf diese Weise, aber einige Leute mögen, um die Verbindung zwischen Umsatz und Kosten für eine Transaktion von der Transaktion basis.
INVENTORY_DTL Dies ist die Details für eine Bestandsaufnahme Transaktion. Diese gibt an, welche KOMPONENTE in der Menge, ging in oder out, und die INVENTORY_HDR Transaktion, dass diese Bewegung angewendet wird. Dies wäre auch wo du die tatsächlichen Kosten bezahlt, die für die Komponente Element.
LAGE können Sie (wenn Sie möchten) auch den physischen Standort des Inventars, die Sie erhalten und benutzen/verkaufen. In einem restaurant ist dies möglicherweise nicht wichtig, aber wenn man eine Kette oder wenn Ihr restaurant hat eine offsite-Lager für Komponenten-Inhaltsstoffe dann könnten Sie Pflege.
Betrachten Sie die folgenden ERD:
Tun Sie Ihre revenue accounting Sie würde das hinzufügen bis das Geld aufgenommen in die SALE_ITEM Tabelle.
Lagerbestände berechnet werden basiert auf der Summierung der INVENTORY_DTL ins und outs für jede KOMPONENTE. (Speichern Sie nicht den aktuellen Lagerbestand in einer Tabelle - Dieses ist dazu verdammt, Sie zu verursachen Versöhnung-Probleme).
Tun Sie Ihre Kostenrechnung würden Sie hinzufügen, bis das Geld aufgenommen in die INVENTORY_DTL Tabelle. Beachten Sie, dass Sie in der Regel nicht genau wissen die Serviette oder Brötchen, die Sie verkauft haben, so wird es nicht möglich sein, link bestimmte Komponente reciepts mit bestimmten SKU Umsatz. Stattdessen, Sie brauchen, um eine Konvention für die Bestimmung, welche Komponenten verwendet wurden, für jede SKU. Möglicherweise haben Sie accounting-Regeln, die angeben, welche Konvention Sie verwenden müssen. Die meisten Menschen FIFO verwenden. Einige Branchen nutzen die LIFO-und ich habe sogar gesehen, weighted average cost accounting.
SALE
wie ein Eingang undINVENTORY_HDR
wie ein Konnossement. Jedem Verkauf können für mehrere Elemente. Dies kann daran liegen, dass du die Bestellung für mehrere Personen, oder Sie können, um verschiedene Elemente a la carte. Man kann nicht müssen, um einen header für dieses, aber es ist besser widerspiegelt, was tatsächlich passiert ist. Auf der anderen Seite, wenn Sie von Ihrem dashboard Metriken ist Durchschnittliche Kunde Verkauf, dann müssen Sie die header zu binden verkauften Artikel zur gleichen Zeit zusammen. Das gleiche gilt für den Erhalt von Inventar. Lieferungen in der Regel gehören viele unterschiedliche Elemente.COMPONENT
in zwei Tabellen, eine identifiziert, die ein Typ von Element zur Miete ("Husqvarna Kettensäge Modell T540 XP" - Diese sitzen würde, wo die Komponente ist jetzt) und die spezifische Instanz des Elements ("Kettensäge mit Seriennummer 8843764") Die item-Instanz möglicherweise eine Kreuzung zwischen derINVENTORY_DTL
Tabelle und der Tabelle component.Ich würde vorschlagen, völlig trennt das Inventar, Tische von der Geld-accounting-Tabellen. Zum Beispiel, das Beispiel, das Sie Gaben, ich weiß, lächerlich: Für Ihre Durchschnittliche fast-food-restaurant ein $.90 cent Cola kostet etwa $.05-$.07 für die Tasse, und weniger als einen penny für die Flüssigkeit, wobei Sie eine ordentliche Gewinn von $.83ish. Warum haben sich die Kosten bis zu $.90?
Tabellen:
InventoryItems
Felder: InventoryItemId, Name, CurrentInventoryLevel, IdealInventoryLevelInventoryChangeRecords
Felder: InventoryChangeId, InventoryItemId, Ändern, (int)RetailItems
Felder: RetailItemId, Name, PreisRetailItemMakeup
Felder: RetailItemId, InventoryItemId, MengeSaleTransactions
Felder: SaleTransactionId, DateTime, TotalSaleSaleTransactionItems
Felder: SaleTransactionId, RetailItemId, MengeFür jeden Verkauf, den Sie verwenden sollten, eine sproc (oder trigger) zu aktualisieren CurrentInventoryLevel und einfügen von Datensätzen in InventoryChangeRecords. Sie können leicht herausfinden, wie jeder Verkauf betroffen Inventar durch den Beitritt von SaleTransaction zu SaleTransactionItems zu RetailItemMakeup.
Wenn Sie wollte, es zu tun in einer noch stärkeren (aber IMO überflüssige) Weise könnten Sie eine andere viele-zu-viele " - Tabelle zwischen SaleTransactionItems und InventoryChangeRecords.