Schéma de base de données pour la tarification des produits (packages, promotions, quantité basée, offre à durée limitée…)

11

Je travaille sur un nouveau point de vente pour une entreprise qui produit à des prix différents selon le mix produit.

Tous les produits ont un prix de base.

Pour expliquer mon problème, j'utiliserai les informations suivantes:

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

La société propose des packages, par exemple le package "Combo": pour le produit A ou B, si vous choisissez 1 de Q ou R et 1 de X, Y ou Z, vous bénéficiez d'une remise de 20 $.

Cas A: Parfois, les clients ajoutent un produit de base lors de la commande, par exemple: ils ne font pas partie du produit A, et ils y ajoutent le produit Q et le produit P pour créer un package à prix réduit. Ensuite, ils pourraient ajouter qu'ils veulent 1 produit B avec 1 R et 1 Z.

Cas B: Parfois, les clients ajoutent 1 A et 2 B, 2 Q, 1 S, 2 X et 1 Z. Selon les règles énoncées dans le package "Combo", seuls 2 combos s'appliqueraient car S n'est pas un élément combo.

Les autres promotions dépendent de la quantité, donc si vous achetez 2 de B vous obtenez 20% de réduction et / ou en fonction du temps, elle n'est valable qu'après 17 h ou avant 10% si avant 10 h. Une autre promotion peut dépendre du moment où votre dernier achat a eu lieu ou si vous avez acheté plus de X $ sur une période Y.

Mes problèmes:

1) Comment puis-je structurer les tableaux afin que je puisse créer les différents packages ou promotions d'une manière très flexible pour ajouter différents types de promotions avec des exigences différentes?

2) Quand ils commandent comme le cas B (ou un mélange de cas A et de cas B), comment puis-je structurer ma requête afin de pouvoir tester pour voir quel (s) mix produit (s) sont dans la commande et mettre à jour les prix / descriptions en conséquence ? En fin de compte, le meilleur résultat pour cette requête retournerait quels packages et promotions ont des exigences remplies dans l'ordre qui donne le plus d'avantages au client (c'est-à-dire que ce qu'ils ont commandé répond aux exigences des promotions 1 et 3, mais la promotion 3 est moins chère. doit fonctionner avec plusieurs promotions).

Merci d'avance pour l'aide!

MISE À JOUR # 1

Pour mieux décrire les problèmes et mettre à jour le travail effectué jusqu'à présent pour les résoudre, j'inclus une ERD du modèle de produit limitée aux entités et aux attributs qui affectent le problème (c'est-à-dire que l'inventaire n'est pas en jeu ici, donc pas d'inventaire) sont présentes).

entrez la description de l'image ici

J'inclus également des exemples de données des entités et des attributs qui affectent cette question (pour simplifier la lecture des données, je mets le nom / les descriptions à la place des clés étrangères):

Voici un lien vers un organigramme donnant un exemple de combo, une manière rapide et visuelle de comprendre la structure de la table.

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

Ainsi, grâce à la recherche et au soutien fournis par la communauté jusqu'à ce que je sache, j'ai pu résoudre le problème n ° 1. En fait, je l'ai fait avec plus de flexibilité que je ne le pensais dans le premier déploiement du système.

Bien qu'il y ait eu des progrès avec le problème 2, il n'est pas résolu à la satisfaction. Il y a eu quelques idées sur la façon de le faire, Neil McGuilgan a posé une grande question menant à une solution possible en utilisant la division relationnelle (dba.stackexchange.com/questions/45829/what-is-the-name-of-this-type- of-query-and-what-is-an-efficient-example) et ce livre (www.amazon.com/books/dp/0471380237) ont beaucoup aidé. Cependant, cette solution à l'heure actuelle, et si je comprends bien, ne fonctionne qu'avec "un" enregistrement (combo) à la fois. Si un client se rapproche et dit qu'il veut 2 hamburgers au fromage, 1 hamburger, 1 petit jus de pomme, 1 coca, 1 frite et 2 rondelles d'oignon, j'ai besoin d'un moyen pour détecter qu'il n'y a qu'un seul combo dans le mélange et ajouter l'autre produits au prix de base. S'il y a plusieurs combinaisons de combos, je '

Une idée que j'ai trouvée pour résoudre le problème deux est d'ajouter et d'attribuer au marqueur COMPOSANT PRODUIT le produit principal du combo (c.-à-d. Hamburger). Ensuite, lors de l'exécution du processus de tarification, recherchez les produits de la commande qui sont les produits principaux d'un "package", en reliant la requête à la remise accordée par la table PRICE COMPONENT et la commande par cette valeur (décroissante), et dans cet ordre de packages, vérifiez pour voir si vous pouvez créer un "package" avec les produits non principaux restants avec une requête et boucler le processus jusqu'à ce qu'il n'y ait plus de produits principaux ou qu'il n'y ait plus de produits non principaux dans le reste.

cml
la source
Qu'avez-vous fait jusqu'à présent ? Montrez-nous un diagramme ER.
Tulains Córdova
@ user61852 Je fais la plupart de mes ERD à la main. Pouvez-vous recommander un outil pour les faire sur l'ordinateur afin que je puisse le partager? (j'espère un gratuit :)
cml
@ user61852 J'ai trouvé gliffy.com qui s'avère plutôt utile. Je travaille à rassembler ce sur quoi j'ai travaillé pour mettre à jour ma question.
cml
@ user61852 J'ai ajouté la mise à jour # 1 pour afficher la DRE, l'organigramme, les avancées et les exemples de données du tableau.
cml

Réponses:

2

Cela pourrait se compliquer ...

1) Comment puis-je structurer les tableaux afin que je puisse créer les différents packages ou promotions d'une manière très flexible pour ajouter différents types de promotions avec des exigences différentes?

Vous pouvez commencer par un packaged_withtableau pour déterminer quels produits peuvent être regroupés et emballés ensemble:

paquet
-------
  id (PK)
  Nom

package_group
-------------
  package_id (FK à package.id)
  Nom

packaged_with
-------------
  package_group_id (FK à package_group.id)
  product_id (FK à product.id)
  can_be_packaged_with (FK vers product.id)

package_groupfait référence à a package. packaged_withfait référence à productset package_groups, de sorte qu'une ligne dans packaged_withindique les produits avec lesquels un produit peut être conditionné et un package peut être composé de plusieurs groupes.

Les données ressembleraient à ceci:

paquet
-------
ID | Nom
------------
1 | Combo

package_group
------------
ID | Nom
---------
1 | Groupe QR
2 | Groupe XYZ

packaged_with
-------------
package_group_id | product_id | can_be_packaged_with
----------------------------------------------
1 | A | Q
1 | A | R
2 | A | X
2 | A | Oui
2 | A | Z
1 | B | Q
1 | B | R
2 | B | X
2 | B | Oui
2 | B | Z

Cela vous aidera avec les packages de produits eux-mêmes. J'ai quelques idées pour le reste de votre question, mais je n'ai pas le temps de terminer cette réponse tout de suite ...


Les promotions

Vous listez de nombreux types de promotions. Vous voudrez peut-être examiner une sorte de moteur de règles, mais je vais essayer de garder les choses plus simples que cela, mais quand même ... Cela deviendra compliqué ..

Commençons par des promotions simples où un prix est réduit d'un certain pourcentage:

pourcentage_discount
----------------
  id (PK)
  Nom
  pourcentage_montant

promotions_produits
------------------
  id (PK)
  product_id (FK à product.id)
  promotion_id (FK à percent_discount.id)
  date de début
  date de fin

Ici, nous avons un tableau qui stocke le pourcentage que vous obtenez pour le produit. Un autre tableau relie en fait les produits au taux d'actualisation et comprend également une date de début et de fin afin que vous sachiez si la remise est applicable à une date donnée.

Idées pour les autres promotions à venir plus tard ...

FrustratedWithFormsDesigner
la source
J'ai hâte de lire le reste de votre réponse lorsque vous aurez le temps de l'écrire. Merci de votre aide.
cml
Je vais certainement me pencher sur les "moteurs de règles"! Si vous avez de bons liens vers des ressources, envoyez-les moi! Mon plus gros problème est de savoir quelles promotions s'appliquent à une liste non ordonnée et non groupée d'articles de commande (cas B).
cml
@cml: Je sais qu'il existe des produits commerciaux qui ont probablement déjà les capacités que vous souhaitez. Celui que je connais s'appelle Hybris, j'ai entendu dire qu'il avait un système de promotions très sophistiqué.
FrustratedWithFormsDesigner
J'ai ajouté la mise à jour # 1
cml
1

Bien que ce soit un fil de 3 ans, je réponds toujours en pensant que cela pourrait être utile à quelqu'un.

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             

OffreDétails ------------

 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

Pour construire une offreDétails, vous devez fournir un obligatoire, un mixgropu1 et un amixGropu2. Donc caseB, n'a que 2 offres comme suit:

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.

Les autres offres sont basées sur la logique métier: Pour la remise sur l'offre de quantité: créez une requête pour trouver le nombre de B dans une offre pour un client. appelons-le QTYB. trouver QTYB% 2 et le multiplier par la valeur quantityOffer (qui est de 20 $)

Pour l'offre de statistiques, ajoutez simplement un autre bit appelé wonPoint pour l'achat d'un client. et définissez le point gagné une date d'expiration. le point gagné peut être le même que le montant acheté. Vérifiez si le montant acheté> = $ X, émettez une remise conformément à la politique.

La comparaison du temps de commande est similaire si c'est avant 17 heures et après 10 heures, puis émettez 5% sinon émettez 10% de réduction.

123456
la source