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).
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):
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.
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.