web-dev-qa-db-fra.com

Schéma de base de données pour les produits de tarification (forfaits, promotions, Qté basé sur une offre limitée ...)

Je travaille sur un nouveau point de vente pour une entreprise qui produit des prix différents en fonction du mélange de produits.

Tous les produits ont un prix de base.

Pour expliquer mon problème, je vais utiliser 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é dispose de forfaits, 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 obtenez une réduction de 20 $.

Case A: Parfois, les clients ajoutent un produit de base lors de la commande, par exemple: ils ne sont pas un des produits A, et ils ajoutent du produit Q et produit p à cela pour créer un package qui a un prix réduit. Ensuite, ils pourraient ajouter qu'ils veulent 1 de produit B avec 1 R et 1 Z.

cas B: Parfois, les clients ajouteront 1 A et 2 B, 2 Q, 1 S, 2 x et 1 Z. Selon les règles énoncées par Package "Combo", seuls 2 combos s'appliqueraient car s n'est pas un élément combo.

D'autres promotions dépendent de la quantité, donc si vous achetez 2 de b, vous obtenez 20% de réduction et/ou dépendant du temps, il n'est valable qu'après 5 PM ou avant 10% de réduction si 10h00 . Une autre promotion pourrait dépendre du moment où votre dernier achat s'est produit ou si vous avez acheté plus de $ x dans Y.

Mes problèmes:

1) Comment structurer les tables pour que je crée les différents packages ou promotions de manière très flexible pour ajouter différents types de promotions avec des exigences différentes?

2) Quand ils commandent comme une case B (ou un mélange de cas A et B) Comment structurer ma requête afin que je puisse tester pour voir quel mélange de produits sont dans l'ordre et mettre à jour les prix/descriptions en conséquence ? En fin de compte, le meilleur résultat de cette requête reviendrait quels packages et promotions ont des exigences remplies dans l'ordre qui donne le plus d'avantage au client (c.-à-d. Ce qu'ils ont ordonné de remplir les exigences de la promotion 1 et 3, mais la promotion 3 est moins chère. Ce doit travailler avec plusieurs promotions).

Merci d'avance pour l'aide!

Mise à jour n ° 1

Pour mieux décrire les problèmes à portée de main et mettre à jour le travail effectué jusqu'à ce que les résoudre j'inscrite 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 Au jeu ici, aucune entité d'inventaire n'est présente).

enter image description here

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

Voici un lien vers un organigramme donnant un exemple de combo, un moyen rapide et visuel 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, avec la recherche et le soutien fourni 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 pouvoir faire dans le premier déploiement du système.

Tout cependant, il y a eu des avancées avec le problème 2, il n'est pas résolu à satisfaction. Il y a eu quelques idées sur la façon de faire cela, Neil McGuilgan a posé une excellente question menant à une solution éventuelle à l'aide de la division relationnelle (dba.stackexchange.com/questions/45829/what-is-the-name-of-Cet Exemple de Query-and-What-Is-Effice) et ce livre (www.amazon.com/books/dp/0471380237) a aidé beaucoup. Cependant, cette solution actuelle, et comme je le comprends, ne fonctionne qu'avec un enregistrement "un" (combo) à la fois. Si un client marche et dit qu'il veut 2 cheeseburgers, 1 hamburger, 1 petit Apple Juice, 1 coke, 1 frites et 2 bagues d'oignons, j'ai besoin d'un moyen de détecter qu'il n'y a que Un combo dans le mélange et ajoutez les autres produits au prix de base. S'il existe plusieurs combinaisons combo, je cherche (idéalement pour une requête SQL) pouvant hiérarchiser les combinaisons combo par des économies plus importantes.

Une idée que j'ai proposée pour résoudre le problème deux est d'ajouter et d'attribuer au composant produit GRAPAGIN Le produit principal pour le combo (c'est-à-dire hamburger). Ensuite, lors de l'exécution du processus de tarification, interrogez les produits de la commande sont des produits principaux dans un "package", reliant la requête à la remise donnée par la table des composants de prix et la commande par cette valeur (décroissante), et dans cet ordre des packages. Pour voir si vous pouvez créer un "paquet" avec les produits non principaux restants avec une requête et boucle le processus jusqu'à ce qu'il n'y ait plus de produits principaux ni plus de produits non principaux dans le reste.

11
cml

Cela pourrait se compliquer ...

1) Comment structurer les tables pour que je crée les différents packages ou promotions de manière très flexible pour ajouter différents types de promotions avec des exigences différentes?

Vous pouvez commencer par un packaged_with Table pour déterminer quels produits peuvent être regroupés et conditionné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 à product.id) 

package_group Fait référence à une package. packaged_with Fait référence à products et package_groups, De sorte qu'une ligne de packaged_with Montre quels produits un produit peut être livré avec, et un paquet peut être constitué de plusieurs groupes.

Les données ressemblerait à ceci:

[. .____] package [. .____] ------- [. .____] ID | nom 
 ------------ 
 1 | Combo [. .____] package_group 
 ------------ 
 ID 
 | nom 
 --------- 
 1 | QR groupe 
 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 | Y 
 2 | A | Z 
 1 | B | Q 
 1 | B | R 
 2 | B | X 
 2 | B | Y 
 2 | B | Z 
 

Cela vous aidera avec le produit eux-mêmes paquets. J'ai quelques idées pour le reste de votre question, mais je ne suis pas le temps de finir cette réponse en ce moment ...


promotions

Vous énumérer de nombreux types de promotions. Vous voudrez peut-être regarder dans une sorte de règles moteur, mais je vais essayer de garder les choses plus simples que cela, mais quand même ... Ce sera se compliquent ..

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

 Percent_discount 
 ---------------- 
 Id (PK) 
 Nom 
 Percent_amount 
 
 product_promotions 
 ------------------ 
 id (PK) 
 product_id (FK à product.id) 
 promotion_id (FK à percent_discount.id) 
 start_date 
 end_date 

Ici, nous avons une table qui stocke quel pourcentage vous descendez pour le produit. Une autre table relie réellement produits au taux d'actualisation, et comprend également un début et une date de fin afin de savoir si le rabais est applicable à une date donnée.

Des idées pour les autres promotions à venir plus tard ...

Bien que c'est un fil de 3 ans, je la réponds toujours à penser que cela pourrait être utile pour 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 AmixGroPu2. So Assideb, 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.

D'autres offres sont basées sur la logique commerciale: pour la quantité d'offre de quantité: Créez une requête pour trouver le nombre de B dans une offre pour un client. permet de l'appeler qtyb. Recherchez QTyB% 2 et multipliez-la de la valeur QUANTINITYOFFER (qui est de 20 $)

Pour l'offre de statistiques, ajoutez simplement un autre bit appelé gagné d'achat pour un achat d'un client. et définir la date d'expiration du point d'expiration. Le point gagné peut être le même que celui acheté. Vérifiez si le montant acheté> = $ x, ils émettent des rabais conformément à la stratégie.

Similaire est la comparaison de la durée de commande si elle a précédemment 17 heures et après 10h, puis émettez 5% d'autre édition de 10% de réduction.

1
123456