跟进:如何为数据库中的项目建模折扣?

时间:2011-12-20 16:39:50

标签: mysql database-design entity-relationship

我正在建立一个电子商务网站,并希望在限定时间内提供某些商品的折扣。我想展示我们为每件产品提供多少折扣。因此,我需要每个产品两个值,原始价格和给定持续时间的折扣价格。

这是对answer我问过

question的后续跟进

架构:

  • 产品

    • 的productId
    • 名称
  • ProductPricing

    • productId(FK)
    • startDateTimeStamp
    • endDateTimeStamp
    • 原价仅适用于我们使用方法A(稍后出现)

数据:

Product:
    1   |   Apple
    2   |   Banana

T1:2011年12月21日:目前没有优惠

ProductPricing
    1   |   Dec 20, 2011, 00:00 |   Jan 1, 2038, 00:00  |   10$ |   10$
    2   |   Dec 20, 2011, 00:00 |   Jan 1, 2038, 00:00  |   20$ |   20$

T2:2011年12月24日:交易!从12月25日14:00 - 12月26日14:00开始,对苹果享受25%的折扣

接近A。 - 查询更新给定持续时间的苹果价格

ProductPricing
    1   |   Dec 25, 2011, 14:00 |   Dec 26, 2011, 14:00 |   7.5$|   10$
    2   |   Dec 20, 2011, 00:00 |   Dec 25, 2038, 00:00 |   20$ |   20$

接近B。 - 查询在给定的持续时间内添加另一条带苹果价格的记录

ProductPricing
    1   |   Dec 20, 2011, 00:00 |   Jan 1, 2038, 00:00  |   10$ |   10$
    2   |   Dec 20, 2011, 00:00 |   Dec 25, 2038, 00:00 |   20$ |   20$
    1   |   Dec 25, 2011, 14:00 |   Dec 26, 2011, 14:00 |   7.5$|   10$

T3:2011年12月27日 - 选项

接近A。 此时,交易已过期,我应该使用触发器重置endTimeStamp吗?

接近B。 我应该删除交易刚过期的产品的最新记录吗?

1 个答案:

答案 0 :(得分:7)

ProductPricing表的设计使我们永远不必删除旧的定价数据(有时管理层需要基于该数据的报告)。根据你上面所描述的,你就是这样开始的(我改变了开始日期,因此很容易找出是的,这是系统启动时的原始价格):

ProductPricing
   1   |    Jan 1, 1970, 00:00:00 |   Jan 1, 2038, 00:00:00  |   10$ |   10$

现在让我们假设您给出了苹果的折扣价,并且您希望积极主动并在销售结束时设置系统:

ProductPricing
   1   |    Jan 1, 1970, 00:00:00 |  Dec 20, 2011, 00:00:00  |   10$ |   10$
   1   |   Dec 20, 2011, 00:00:01 |  Dec 26, 2011, 00:00:00  |  7.5$ |   10$
   1   |   Dec 26, 2011, 00:00:01 |   Jan 1, 2038, 00:00:00  |   10$ |   10$

我们在这里做的是:

  1. 使用2038时间戳更新现有记录,更改endDateTimeStamp字段以反映销售的开始
  2. 插入新记录以定义销售
  3. 再次插入新记录以反映正常价格
  4. 如果没有重叠的时间戳,当您查询数据库中的价格时,您可以保证获得单个记录。因此,

    SELECT p.Name, pp.price, pp.original_price
    FROM Product p
    INNER JOIN ProductPricing pp ON pp.productId = p.productId
    WHERE NOW() BETWEEN pp.startDateTimeStamp AND pp.endDateTimeStamp
    

    会为您提供当前价格的产品清单。