Datenbankschema für Preisprodukte (Pakete, Werbeaktionen, mengenbasiertes, zeitlich begrenztes Angebot…)

11

Ich arbeite an einer neuen Verkaufsstelle für ein Unternehmen, das je nach Produktmix Produkte zu unterschiedlichen Preisen anbietet.

Alle Produkte haben einen Grundpreis.

Um mein Problem zu erklären, werde ich die folgenden Informationen verwenden:

Product         Category        Price
A               1               45
B               1               70
Q               2               20
R               2               27
S               2               15
X               3               17
Y               3               22
Z               3               16

Das Unternehmen hat Pakete, zum Beispiel Paket "Combo": Wenn Sie für Produkt A oder B 1 von Q oder R und 1 von X, Y oder Z wählen, erhalten Sie einen Rabatt von 20 USD.

Fall A: Manchmal fügen Kunden bei der Bestellung ein Basisprodukt hinzu, zum Beispiel: Sie gehören nicht zu Produkt A, und sie fügen Produkt Q und Produkt P hinzu, um ein Paket mit einem reduzierten Preis zu erstellen. Dann könnten sie hinzufügen, dass sie 1 von Produkt B mit 1 R und 1 Z wollen.

Fall B: Manchmal fügen Kunden 1 A und 2 B, 2 Q, 1 S, 2 X und 1 Z hinzu. Gemäß den im "Combo" -Paket festgelegten Regeln gelten nur 2 Combos, da S kein Combo-Element ist.

Andere Aktionen sind mengenabhängig. Wenn Sie also 2 von B kaufen, erhalten Sie 20% Rabatt und / oder Zeitabhängigkeit. Diese gilt nur nach 17.00 Uhr oder vor 10% Rabatt, wenn Sie vor 10 Uhr sind. Eine weitere Aktion hängt möglicherweise davon ab, wann Ihr letzter Einkauf getätigt wurde oder ob Sie in Y einen Zeitraum von mehr als X USD gekauft haben.

Meine Probleme:

1) Wie strukturiere ich die Tabellen, damit ich die verschiedenen Pakete oder Werbeaktionen auf eine Weise erstelle, die sehr flexibel ist, um verschiedene Arten von Werbeaktionen mit unterschiedlichen Anforderungen hinzuzufügen?

2) Wenn sie wie Fall B (oder eine Mischung aus Fall A und Fall B) bestellen, wie strukturiere ich meine Abfrage, damit ich testen kann, welche Produktmischungen in der Bestellung enthalten sind, und die Preise / Beschreibungen entsprechend aktualisieren kann ? Letztendlich würde das beste Ergebnis für diese Abfrage zurückgeben, welche Pakete und Werbeaktionen Anforderungen erfüllen, deren Reihenfolge dem Kunden den größten Nutzen bringt (dh möglicherweise erfüllt das, was sie bestellt haben, die Anforderungen für Werbeaktion 1 und 3, aber Werbeaktion 3 ist kostengünstiger muss mit mehreren Aktionen arbeiten).

Vielen Dank im Voraus für die Hilfe!

UPDATE # 1

Um die vorliegenden Probleme besser zu beschreiben und die bisher geleistete Arbeit zu aktualisieren, um sie zu lösen, füge ich eine ERD des Produktmodells hinzu, die auf die Entitäten und Attribute beschränkt ist, die das Problem betreffen (dh Inventar ist hier nicht im Spiel, also kein Inventar Entitäten sind vorhanden).

Geben Sie hier die Bildbeschreibung ein

Ich füge auch Beispieldaten von den Entitäten und Attributen hinzu, die diese Frage betreffen (um das Lesen der Daten zu vereinfachen, gebe ich anstelle von Fremdschlüsseln Namen / Beschreibungen ein):

Hier ist ein Link zu einem Flussdiagramm, das ein Beispiel für eine Kombination enthält, eine schnelle und visuelle Möglichkeit, die Tabellenstruktur zu verstehen.

PRODUCT
---------
ID  Name
================================
1   Hamburger
2   Cheeseburger
3   Bacon Hamburger
4   Bacon Cheeseburger
5   Orange Juice
6   Apple Juice
7   Coffee
8   Coke
9   French Fries
10  Onion Rings
11  Soup du Jour
12  Hamburger Combo
13  CheeseBurger Combo
14  Bacon Hamburger Combo
15  Bacon Cheeseburger Combo
16  Combo Side
17  Combo Beverage
18  Small Orange Juice
19  Large Orange Juice
20  Small Apple Juice
21  Large Apple Juice
22  Add Extra Patty
23  Add Avocado

PRODUCT COMPONENT
------------------
productFrom                 productTo       
===================================================
Hamburger Combo             Hamburger
Hamburger Combo             Combo Side
Hamburger Combo             Combo Beverage
CheeseBurger Combo          Cheeseburger
CheeseBurger Combo          Combo Side
CheeseBurger Combo          Combo Beverage
Bacon Hamburger Combo       Bacon Hamburger
Bacon Hamburger Combo       Combo Side
Bacon Hamburger Combo       Combo Beverage
Bacon Cheeseburger Combo    Bacon Cheeseburger
Bacon Cheeseburger Combo    Combo Side
Bacon Cheeseburger Combo    Combo Beverage

PRODUCT FEATURE
----------------
ID  Description
=======================
1   Combo Side Option
2   Combo Beverage
3   Juice
4   Orange Juice Size
5   Apple Juice Size
6   Extras

PRODUCT FEATURE APPLICABILITY
------------------------------
product                     productFeature  ProductFeatureApplicabilityType
============================================================================
Hamburger Combo             Combo Side      Required
Hamburger Combo             Juice Flavor    Required
Cheeseburger Combo          Combo Side      Required
Cheeseburger Combo          Juice Flavor    Required
Bacon Hamburger Combo       Combo Side      Required
Bacon Hamburger Combo       Juice Flavor    Required
Bacon Cheeseburger Combo    Combo Side      Required
Bacon Cheeseburger Combo    Juice Flavor    Required


PRODUCT FEATURE APPLICABILITY
------------------------------
productFeature  product             ProductFeatureApplicabilityType
============================================================================
Combo Side      Hamburger Combo             Required
Combo Beverage  Hamburger Combo             Required
Extras          Hamburger Combo             Optional
Combo Side      Cheeseburger Combo          Required
Combo Beverage  Cheeseburger Combo          Required
Extras          Cheeseburger Combo          Optional
Combo Side      Bacon Hamburger Combo       Required
Combo Beverage  Bacon Hamburger Combo       Required
Extras          Bacon Hamburger Combo       Optional
Combo Side      Bacon Cheeseburger Combo    Required
Combo Beverage  Bacon Cheeseburger Combo    Required
Extras          Bacon Cheeseburger Combo    Optional




OPTIONAL FEATURE
------------------
productFeatureFrom  Product             ProductFeatureTo        
=============================================================
Combo Side Option   French Fries
Combo Side Option   Onion Rings
Combo Side Option   Soup du Jour
Combo Beverage                          Juice
Combo Beverage      Coffee
Juice                                   Orange Juice Size
Juice                                   Apple Juice Size
Orange Juice Size   Orange Apple Juice
Orange Juice Size   Orange Apple Juice
Apple Juice Size    Small Apple Juice
Apple Juice Size    Large Apple Juice
Extras              Add Extra Patty
Extras              Add Avocado

Mit den Recherchen und der Unterstützung durch die Community konnte ich das erste Problem lösen. Tatsächlich habe ich dies mit mehr Flexibilität getan, als ich bei der ersten Bereitstellung des Systems gedacht hatte.

Obwohl mit Problem 2 Fortschritte erzielt wurden, ist es nicht zufriedenstellend gelöst. Es gab einige Ideen, wie dies zu tun ist. Neil McGuilgan stellte eine großartige Frage, die zu einer möglichen Lösung mit Relational Division führte (dba.stackexchange.com/questions/45829/what-is-the-name-of-this-type- of-query-and-what-is-a-effizient-example) und dieses Buch (www.amazon.com/books/dp/0471380237) haben sehr geholfen. Derzeit funktioniert diese Lösung jedoch, so wie ich es verstehe, jeweils nur mit "einem" Datensatz (Combo). Wenn ein Kunde auftaucht und sagt, er möchte 2 Cheeseburger, 1 Hamburger, 1 kleinen Apfelsaft, 1 Cola, 1 Pommes Frites und 2 Zwiebelringe, muss ich feststellen, dass nur eine Kombination in der Mischung enthalten ist, und die andere hinzufügen Produkte zum Grundpreis. Wenn es mehrere Kombinationskombinationen gibt, I '

Eine Idee, die ich mir zur Lösung des zweiten Problems ausgedacht habe, ist das Hinzufügen und Zuordnen von PRODUCT COMPONENT zum Hauptprodukt für die Combo (dh Hamburger). Fragen Sie dann beim Ausführen des Preisfindungsprozesses ab, welche Produkte in der Bestellung die Hauptprodukte in einem "Paket" sind, und beziehen Sie die Abfrage auf den in der Tabelle PRICE COMPONENT angegebenen Rabatt und die Bestellung nach diesem Wert (absteigend). Überprüfen Sie in dieser Reihenfolge die Pakete um zu sehen, ob Sie mit einer Abfrage ein "Paket" mit den verbleibenden Nicht-Hauptprodukten erstellen und den Prozess wiederholen können, bis keine Hauptprodukte mehr vorhanden sind oder im Rest keine Nicht-Hauptprodukte mehr vorhanden sind.

cml
quelle
Was hast du bis jetzt gemacht ? Zeigen Sie uns ein ER-Diagramm.
Tulains Córdova
@ user61852 Ich mache die meisten meiner ERDs von Hand. Können Sie ein Tool empfehlen, um sie auf dem Computer auszuführen, damit ich sie freigeben kann? (hoffentlich kostenlos :)
cml
@ user61852 Ich habe gliffy.com gefunden, was sich als ziemlich nützlich erweist. Ich arbeite daran, das zusammenzustellen, woran ich gearbeitet habe, um meine Frage zu aktualisieren.
cml
@ user61852 Ich habe Update Nr. 1 hinzugefügt, um ERD, Flussdiagramm, Fortschritte und Beispieltabellendaten anzuzeigen.
cml

Antworten:

2

Das könnte kompliziert werden ...

1) Wie strukturiere ich die Tabellen, damit ich die verschiedenen Pakete oder Werbeaktionen auf eine Weise erstelle, die sehr flexibel ist, um verschiedene Arten von Werbeaktionen mit unterschiedlichen Anforderungen hinzuzufügen?

Sie können mit einer packaged_withTabelle beginnen, um zu bestimmen, welche Produkte gruppiert und verpackt werden können:

Paket
-------
  id (PK)
  Name

package_group
-------------
  package_id (FK zu package.id)
  Name

verpackt_mit
-------------
  package_group_id (FK zu package_group.id)
  product_id (FK zu product.id)
  can_be_packaged_with (FK zu product.id)

package_groupbezieht sich auf a package. packaged_withbezieht sich auf productsund package_groups, sodass eine Zeile in packaged_withzeigt, mit welchen Produkten ein Produkt verpackt werden kann, und eine Verpackung aus mehreren Gruppen bestehen kann.

Die Daten würden folgendermaßen aussehen:

Paket
-------
ID | Name
------------
1 | Combo

package_group
------------
ID | Name
---------
1 | QR-Gruppe
2 | XYZ-Gruppe

verpackt_mit
-------------
package_group_id | product_id | can_be_packaged_with
----------------------------------------------
1 | A | Q.
1 | A | R.
2 | A | X.
2 | A | Y.
2 | A | Z.
1 | B | Q.
1 | B | R.
2 | B | X.
2 | B | Y.
2 | B | Z.

Dies hilft Ihnen bei den Produktpaketen selbst. Ich habe einige Ideen für den Rest Ihrer Frage, aber ich habe momentan keine Zeit, diese Antwort zu beenden ...


Promotions

Sie listen viele Arten von Werbeaktionen auf. Vielleicht möchten Sie sich eine Art Regel-Engine ansehen, aber ich werde versuchen, die Dinge einfacher zu halten, aber trotzdem ... Das wird kompliziert.

Beginnen wir mit einfachen Werbeaktionen, bei denen ein Preis um einen bestimmten Prozentsatz reduziert wird:

Prozent_Discount
----------------
  id (PK)
  Name
  Prozent_Betrag

product_promotions
------------------ ------------------.
  id (PK)
  product_id (FK zu product.id)
  Promotion_id (FK zu Prozent_Discount.id)
  Anfangsdatum
  Endtermin

Hier haben wir eine Tabelle, in der gespeichert ist, wie viel Prozent Sie für das Produkt erhalten. Eine andere Tabelle verknüpft Produkte tatsächlich mit dem Abzinsungssatz und enthält auch ein Start- und Enddatum, damit Sie wissen, ob der Abschlag an einem bestimmten Datum gilt.

Ideen für die anderen Aktionen kommen später ...

FrustratedWithFormsDesigner
quelle
Ich freue mich darauf, den Rest Ihrer Antwort zu lesen, wenn Sie Zeit haben, sie zu schreiben. Danke für Ihre Hilfe.
cml
Ich werde mich auf jeden Fall mit "Regel-Engines" befassen! Wenn Sie gute Ressourcen-Links haben, senden Sie sie mir! Mein größtes Problem ist, zu bestimmen, welche Werbeaktionen für eine ungeordnete, nicht gruppierte Liste von Bestellartikeln gelten (Fall B).
cml
@cml: Ich weiß, dass es kommerzielle Produkte gibt, die wahrscheinlich bereits die gewünschten Funktionen haben. Eine, die ich kenne, heißt Hybris. Ich habe gehört, dass sie ein sehr ausgeklügeltes Werbesystem hat.
FrustratedWithFormsDesigner
Ich habe Update # 1
cml
1

Obwohl es ein 3 Jahre alter Thread ist, antworte ich immer noch und denke, dass es für jemanden hilfreich sein könnte.

Table Structure
Table_Offer
--------
ID FK
Name   
start time  
end time   

MandatoryGroup
--------
ProductId (FK to product)

MixGroup1
--------
ProductId (FK to product)


MixGroup2
--------
ProductId (FK to product)


Table_offerDetails
------------------
ID PK
offerId (FK to table_offer)
MandatoryProduct(FK to MandatoryProducts.productID
firstProduct ( fk to MixGroup1.productId)
secondProduct (FK to MixGroup2.productId)

Offer
----
 ID    name    startDate  EndDate 
---    ----     --------   ------
1       COMBO   


MandatoryGroup
-------------
 ID    name 
 ---   ---- 
1      A
2      B


MixGroup1
---------
 ID    name 
 ---   ---- 
 3      P      
 4      Q

MixGroup2
---------
 ID    name 
 ---   ---- 
 5      x      
 6      Y
 7      Z



 OfferHeader
-------------
ID  Customer count(B) B_disc time_disc  stat_disc DiscTotal orderPayableTotal
--  --------- -------  ----   --------  ---------  --------  ------------    
1     BOB     2         20      5         2             

OfferDetails ------------

 ID   offerID   MandatoryProduct     1stProduct    2ndProduct
----  -------    ---------------     ----------    ----------
1       1         A                     P              X
2       1         A                     P              Y
3       1         A                     P              Z
4       1         A                     Q              X
5       1         A                     Q              Y
6       1         A                     Q              Z
7       1         B                     P              X
8       1         B                     P              Y
9       1         B                     P              Z
10      1         B                     Q              X
11      1         B                     Q              Y
12      1         B                     Q              Z

Um ein OfferDetails zu erstellen, müssen Sie ein obligatorisches, ein mixgropu1 und ein amixGropu2 angeben. Also hat caseB nur 2 Angebote wie folgt:

1 A and 2 B, 2 Q, 1 S, 2 X and 1 Z
2B 2Q and 2X =2 offers
1A 1Q and 1X=1st offer
1B 1Q and 1X=2nd Offer ... etc other combinations are vivid.

Andere Angebote basieren auf Geschäftslogik: Für Mengenangebotsrabatt: Erstellen Sie eine Abfrage, um die Anzahl von B in einem Angebot für einen Kunden zu ermitteln. Nennen wir es QTYB. Finden Sie QTYB% 2 und multiplizieren Sie es mit dem Wert von QuantityOffer ($ 20).

Fügen Sie für ein Statistikangebot einfach ein weiteres Bit namens EarnedPoint für den Kauf eines Kunden hinzu. und setzen Sie dem EarnedPoint ein Ablaufdatum. Der verdiente Punkt kann dem gekauften Betrag entsprechen. Überprüfen Sie, ob der gekaufte Betrag> = $ X ist. Sie gewähren einen Rabatt gemäß den Richtlinien.

Ähnlich ist der Vergleich der Bestellzeit, wenn vor 17 Uhr und nach 10 Uhr 5% ausgegeben werden, andernfalls 10% Rabatt.

123456
quelle