我正在为一家公司的新销售点工作,该公司的产品价格取决于产品组合。
所有产品都有基价。
为了解释我的问题,我将使用以下信息:
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
公司有包裹,例如Package" Combo":对于产品A或B,如果您选择Q或R中的1和X,Y或Z中的1,您将获得20美元的折扣。
案例A:有时客户在下订单时会添加到基本产品,例如: 他们不是产品A之一,他们将产品Q和产品P添加到其中以创建具有折扣价格的包装。然后他们可能会补充说他们想要1个产品B,其中1个R和1个Z.
案例B 有时客户会添加1 A和2 B,2 Q,1 S,2 X和1 Z.根据" Combo"包装,只适用2个组合,因为S不是组合项目。
其他促销活动取决于数量,因此如果您购买B中的2个,您将获得20%的折扣和/或取决于时间,它仅在下午5点之后或在10点之前10%之前有效。另一次促销可能取决于您上次购买的时间,或者您是否在Y时间段内购买了超过$ X.
我的问题:
1)如何构建表格以便我以非常灵活的方式创建不同的包裹或促销,以添加具有不同要求的不同类型的促销?
2)当他们像案例B(或案例A和案例B的混合)一样订购时,如何构建我的查询以便我可以测试以查看订单中的产品组合,并更新价格/描述相应?最终,此查询的最佳结果将返回哪些包裹和促销活动满足要求,从而为客户带来最大利益(即,他们所订购的商品可满足促销1和3的要求,但促销3更便宜。必须使用多个促销活动。)
提前感谢您的帮助!
更新#1
为了更好地描述手头的问题并更新迄今为止所做的工作以解决它们I'm incluiding an ERD of the Product Model limited to the entities and attributes that affect the issue(即库存不在这里,因此没有库存实体)。
我还包括影响此问题的实体和属性的样本数据(为了简化数据读取,我将名称/描述放在外键中):
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
因此,在社区提供研究和支持之前,我已经能够解决问题#1。事实上,我在第一次部署系统时所做的灵活性比我想象的还要多。
尽管问题2已经取得了进展,但并不能解决问题。关于如何执行此操作有一些想法,Neil McGuilgan asked a great question leading towards a possible solution using Relational Division和this book帮了很多忙。然而,目前这个解决方案,据我所知,只适用于"一个"一次记录(组合)。如果顾客走路并说他想要2个芝士汉堡,1个汉堡包,1个小苹果汁,1个可乐,1个炸薯条和2个洋葱圈,我需要一种方法来检测混合物中只有一种组合并加入另一种产品基价。如果有多个组合组合,我正在查找(理想情况下是一个sql查询),它可以通过最大的节省来优先考虑组合组合。
我提出解决问题二的一个想法是将PRODUCT COMPONENT flaggin添加到属于组合的主要产品(即汉堡包)。然后在运行定价过程时,查询订单中的主要产品中的哪些产品是"包",将查询与PRICE COMPONENT表给出的折扣相关联,并按该值排序(降序),并在包的顺序检查你是否可以创建一个"包"对剩余的非主要产品进行查询并循环流程,直到没有更多的主要产品或剩余的非主要产品为止。