定价产品的数据库架构(打包,促销,基于数量,限时提供…)


11

我正在为一家公司提供新的销售点,该公司根据产品组合提供不同的价格。

所有产品都有底价。

为了解释我的问题,我将使用以下信息:

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

该公司有Packages,例如Package“ Combo”:对于产品A或B,如果选择Q或R中的1个以及X,Y或Z中的1个,则可享受$ 20的折扣。

案例A:有时客户在下订单时会添加基本产品,例如:他们不使用产品A,而是在其中添加产品Q和产品P以创建打折的包装。然后,他们可能会补充说,他们想要1个具有1 R和1 Z的乘积B。

情况B:有时客户会添加1 A和2 B,2 Q,1 S,2 X和1Z。根据“组合”程序包规定的规则,由于S不是组合项目,因此仅适用2个组合。

其他促销取决于数量,因此,如果您购买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)提出了一个重要问题,提出了使用关系部门的可行解决方案(dba.stackexchange.com/questions/45829/what-is-the-name-of-this-type-查询和什么是高效示例)和这本书(www.amazon.com/books/dp/0471380237)起到了很大的作用。但是,据我所知,目前这种解决方案一次只能使用“一个”记录(组合)。如果客户走上来说他要2个芝士汉堡,1个汉堡包,1个小苹果汁,1个可乐,1个炸薯条和2个洋葱圈,我需要一种方法来检测混合物中只有一个组合,然后添加另一个基本价格的产品。如果有多个组合组合,我会

我提出来解决第二个问题的一个想法是,将组合的主要产品(即汉堡包)添加到PRODUCT COMPONENT标志中。然后在执行定价过程时,查询订单中的哪些产品是“包装”中的主要产品,将查询与PRICE COMPONENT表给出的折扣相关联,并按该值排序(降序),然后按包装的顺序检查看看是否可以使用查询来创建包含其余非主要产品的“包装”,并循环执行该过程,直到不再有主要产品或其余非主要产品为止。


到目前为止你做了什么 ?给我们看一些ER图。
图兰斯·科尔多瓦

@ user61852我手动完成大部分ERD。您可以推荐一种工具在计算机上执行这些操作,以便我共享吗?(希望是一个免费的:)
cml

@ user61852我发现gliffy.com证明是非常有用的。我正在努力汇总我所做的工作以更新我的问题。
cml

@ user61852我添加了更新#1以显示ERD,流程图,进度和示例表数据。
cml

Answers:


2

这可能会变得复杂...

1)如何构造表,以便以非常灵活的方式创建不同的包装或促销以添加具有不同要求的不同类型的促销?

您可以从一张packaged_with表开始,以确定可以将哪些产品分组和包装在一起:

包
-------
  id(PK)
  名称

package_group
-------------
  package_id(从FK到package.id)
  名称

packaged_with
-------------
  package_group_id(从FK到package_group.id)
  product_id(从FK到product.id)
  can_be_packaged_with(FK到product.id)

package_group指一个packagepackaged_withproductspackage_groups,因此一行packaged_with显示可以包装产品的产品,包装可以由多个组组成。

数据如下所示:

包
-------
ID | 名称
------------
1 | 组合

package_group
------------
ID | 名称
---------
1 | QR组
2 | XYZ集团

packaged_with
-------------
package_group_id | product_id | can_be_packaged_with
----------------------------------------------
1 | A | 问
1 | A | [R
2 | A | X
2 | A | ÿ
2 | A | ž
1 | B | 问
1 | B | [R
2 | B | X
2 | B | ÿ
2 | B | ž

这将帮助您自己包装产品。对于您余下的问题,我有一些想法,但是我现在没有时间完成此答案...


促销活动

您列出了许多促销活动。您可能想研究某种规则引擎,但是我将尝试使事情比这更简单,但是……这会变得很复杂。

让我们从简单的促销开始,将价格打折一定百分比:

percent_discount
----------------
  id(PK)
  名称
  percent_amount

product_promotions
------------------
  id(PK)
  product_id(从FK到product.id)
  Promotion_id(从FK到percent_discount.id)
  开始日期
  结束日期

在这里,我们有一个表格,用于存储您获得产品的百分比。另一个表实际上将产品链接到折扣率,并且还包括开始和结束日期,因此您知道折扣在任何给定日期是否适用。

其他促销活动的想法将在稍后...


如果您有时间写信,我希望能阅读其余的答案。谢谢你的帮助。
cml

我一定会研究“规则引擎”!如果您有任何好的资源链接,请发送给我!我最大的问题是要确定哪些促销适用于无序,无分组的订单清单(案例B)。
cml

@cml:我知道有些商业产品可能已经具有您想要的功能。我知道的一个叫Hybris,听说它有一个非常复杂的促销系统。
FrustratedWithFormsDesigner

我添加了更新#1
cml

1

尽管它有3年的历史了,但我仍在答复它,认为它可能对某人有所帮助。

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             

OfferDetails ------------

 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

要构造一个offerDetails,您必须提供一个required,mixgropu1和amixGropu2。因此caseB,只有以下两个要约:

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.

其他报价基于业务逻辑:对于数量报价折扣:创建查询以查找针对客户的报价中B的数量。让我们称之为QTYB。找到QTYB%2并乘以quantageOffer值($ 20)

对于统计信息,只需为客户的购买再添加一个称为EarnedPoint即可。并将赚取积分设置为有效日期。赚取的积分可以与购买的金额相同。检查是否购买的金额> = $ X,他们会按照保单折扣。

如果订购时间在下午5点之前和上午10点之后比较,则订单时间的比较类似,然后发出5%,否则发出10%的折扣。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.