如何在数据库中对商品进行折扣建模?

15

我正在建立一家电子商务网站,希望能够在有限的时间内为某些商品提供折扣。

我的产品表(MySQL)如下:

Product
    - productId
    - 名称
    - 重量
    - 价格(商品封面上的价格)

我应该再建立另一个交易表吗:

Deals
 - 交易ID
 - 产品ID(外键)
 - 折扣(小数值:百分比)
 - 描述

用于检索商品:

  • q1:找到所有在产品中具有productID = deals表中所有productIDs的商品
  • q2:使用deals表中的折扣更新价格
  • q3:返回所有产品

还有更好的方法吗?另外,我如何处理仅在有限时间内存在的折扣情况?

编辑: 我想显示我们为每个产品提供的折扣金额。因此,我需要每个产品的两个值,原始价格和给定持续时间的折扣价格。

我对crontab提出的解决方案进行了跟进,在这里

4个回答

11

你可以考虑在 Deals 表中添加起始时间戳和结束时间戳。这样,你就可以检查当前日期是否在交易的开始和结束日期之间。

你的 Deals 表不需要 dealID - 它可以使用 productID 和折扣开始日期作为键值。此外,根据给定物品的价格可能有多高,记得让你的 discount 字段具有足够精度(例如像 DECIMAL 12,8)。

如果是我,我会实际上遗漏掉 Product 表中的价格,并创建一个 ProductPricing 表来代替创建一个 Deals 表。那个 ProductPricing 表将由 productID 和起始时间戳作为关键字段组成,然后还要有一个结束时间戳来指示价格何时更改。当然也要包括商品的价格。


1
@Randy:这就是为什么我说“而不是创建一个交易表”的原因。 ;) - WWW
@Crontab ProductPricing 方法是一个不错的解决方案,因为它还可以让您调整未来自促销/交易的产品价格(例如提价)。您甚至可以在 ProductPricing 表中存储最后一次价格更改的原因。 - Tom Mac
@Crontab 我想确保我理解得正确,ProductPricing表中的productID是外键,start和end时间戳以及价格是该表的字段。没有交易的产品将具有常规价格,并且其endTimestamp为(假设)当前日期后1年。要应用%折扣,我们使用折扣更新此价格,并在交易有效期内更新endTimestamp。我有遗漏什么吗? - brainydexter
那么,一旦交易到期了,您如何恢复endTimeStamp?您有某种触发器吗?也许我应该提出另一个问题,或者我应该编辑这个问题? - brainydexter
1
通常,订单历史记录都有自己的价格字段,而不是依赖于产品当前的价格。 - jonathancardoso
显示剩余6条评论

5
另一个需要考虑的问题是,如果某个商品没有折扣,如何对其进行建模?在这种情况下,您可以使用Null Object模式 - 基本上,在创建产品时,您还会为该产品添加一个0%折扣和无限时间的交易。这样,您可以简化产品检索逻辑(查询中没有外连接,没有用于计算价格的if)。

2

我会在折扣列中使用小数。

价格 * 折扣 = 折扣金额

价格 - 折扣金额 = 购物车中的价格

为了限时,您可以添加一个到期日期列,并仅返回未过期的行。


0

我会在产品表中添加discountPrice、discountPercentage和endDiscountDate列,并创建折扣历史记录表以跟踪折扣

然后在选择时无需连接表格,您可以通过检查endDiscountDate来选择正确的价格。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接