mysql – Followup:如何对数据库中的项目进行折扣建模?
作者:互联网
我正在建立一个电子商务网站,并希望在限定时间内提供某些商品的折扣.我想展示我们为每件产品提供多少折扣.因此,我需要每个产品两个值,原始价格和给定持续时间的折扣价格.
架构:
>产品
> 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.
我应该删除交易刚刚过期的产品的最新记录吗?
解决方法:
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$
我们在这里做的是:
>使用2038时间戳更新现有记录,更改endDateTimeStamp字段以反映销售的开始
>插入新记录以定义销售
>插入另一条新记录以再次反映正常价格
如果没有重叠的时间戳,当您查询数据库中的价格时,您可以保证获得单个记录.从而,
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
能为您提供当前价格的产品清单.
标签:mysql,database-design,entity-relationship 来源: https://codeday.me/bug/20190613/1234838.html