我正在为一家公司开发一个新的销售点,该公司根据产品组合以不同的价格提供产品。
所有产品都有底价。
为了解释我的问题,我将使用以下信息:
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
该公司有套餐,例如套餐“Combo”:对于产品 A 或 B,如果您选择 Q 或 R 中的 1 个以及 X、Y 或 Z 中的 1 个,您将获得 20 美元的折扣。
案例 A:有时客户在下订单时会添加基本产品,例如:他们不想要产品 A,然后将产品 Q 和产品 P 添加到其中以创建具有折扣价的包装。然后他们可能会补充说他们想要产品 B 的 1 个具有 1 个 R 和 1 个 Z。
案例B:有时客户会添加1个A和2个B,2个Q,1个S,2个X和1个Z。根据“组合”套餐规定的规则,只有2个组合适用,因为S不是组合项目。
其他促销取决于数量,因此如果您购买 2 件 B,您将获得 20% 的折扣和/或取决于时间,它仅在下午 5 点之后有效,如果在上午 10 点之前有效,则在 10% 之前有效。另一个促销活动可能取决于您上次购买的时间,或者您在 Y 时间范围内购买的金额是否超过 $X。
我的问题:
1) 我如何构建表格,以便以一种非常灵活的方式创建不同的套餐或促销,以添加具有不同要求的不同类型的促销?
2)当他们像案例 B(或案例 A 和案例 B 的组合)一样订购时,我如何构建我的查询,以便我可以测试以查看订单中的产品组合,并相应地更新价格/描述? 最终,此查询的最佳结果将返回满足要求的包裹和促销的顺序,从而为客户带来最大的利益(即,他们订购的商品可能满足促销 1 和 3 的要求,但促销 3 更便宜。这必须与多个促销活动一起使用)。
在此先感谢您的帮助!
更新#1
为了更好地描述手头的问题并更新迄今为止为解决这些问题所做的工作,我将产品模型的 ERD 包含在影响问题的实体和属性中(即库存不在此处,因此没有库存实体存在)。
我还包括来自影响这个问题的实体和属性的样本数据(为了简化数据的读取,我用名称/描述代替外键):
这是一个流程图链接,给出了一个组合示例,这是一种快速直观地理解表结构的方法。
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 提出了一个很好的问题,导致了使用关系除法的可能解决方案,这本书帮助了很多。然而,目前这个解决方案,据我所知,一次只能处理“一个”记录(组合)。如果顾客走上前说他想要 2 个芝士汉堡、1 个汉堡、1 个小苹果汁、1 个可乐、1 个炸薯条和 2 个洋葱圈,我需要一种方法来检测混合物中只有一个组合并添加另一个基本价格的产品。如果有多个组合组合,我正在寻找(理想情况下用于 sql 查询)可以通过最大节省来优先考虑组合组合。
我想出解决问题二的一个想法是添加并归因于 PRODUCT COMPONENT 标记组合的主要产品(即汉堡包)。然后在运行定价过程时,查询订单中的哪些产品是“包裹”中的主要产品,将查询与 PRICE COMPONENT 表给出的折扣相关联并按该值排序(降序),并按包裹顺序检查查看您是否可以通过查询创建包含剩余非主要产品的“包”并循环该过程,直到不再有主要产品或剩余部分中不再有非主要产品。