如何为数据库中的项目建模折扣?
Posted
技术标签:
【中文标题】如何为数据库中的项目建模折扣?【英文标题】:how to model discount on items in a database? 【发布时间】:2012-01-24 11:32:21 【问题描述】:我正在建立一个电子商务网站,并希望在有限的时间内为某些商品提供折扣。
我的产品表(mysql)如下所示:
产品 - 产品编号 - 姓名 - 重量 - 价格(商品封面上的价格)我是否应该为交易制作另一张桌子:
交易 - 交易ID - productID(外键) - 折扣(分数:百分比) - 描述用于检索项目:
q1:在 products 中查找 productID = 交易表中所有 productID 的所有产品 q2:使用交易表中的折扣更新价格 q3:退回所有产品有没有更好的方法来做到这一点?另外,如果交易只存在有限的时间,我该如何处理?
编辑: 我想显示我们为每种产品提供多少折扣。因此,我需要每个产品的两个值,原价和给定持续时间的折扣价。
我发布了对 crontab here 提出的解决方案的跟进
【问题讨论】:
【参考方案1】:您可以考虑在Deals
表中添加开始时间戳和结束时间戳。这样,您可以检查以确保当前日期在交易的开始日期和结束日期之间。
您的Deals
表实际上并不需要dealID
- 它可以使用productID
和折扣开始日期进行键入。此外,根据给定商品的价格可能有多高,请记住使您的 discount
字段足够精确(例如 DECIMAL 12,8
)。
如果是我,我实际上会关闭Product
表并创建ProductPricing
表而不是创建Deals
表。 ProductPricing
表将包含 productID
和作为关键字段的起始时间戳,然后还有一个结束时间戳来指示价格何时发生变化。当然,还有商品的价格。
【讨论】:
有了产品价格表,您甚至可能不需要交易表。日期是关键。 @Randy:这就是我说“而不是创建交易表”的原因。 ;) @Crontab ProductPricing 方法是一个不错的解决方案,因为它具有允许对并非源自交易/促销的产品进行价格调整(例如价格上涨)的额外好处。您甚至可以将上次价格变化的原因存储在 ProductPricing 表中。 谢谢,在过去的 6 个月里,我们一直在生产环境中使用它,到目前为止它运行良好。我喜欢这个原因的想法,我可能会将其添加到我们的定价表中。 @Green 一般来说,订单历史有自己的价格字段,而不是依赖于当前的产品。【参考方案2】:要考虑的另一件事是,当给定商品没有折扣时,您如何模拟情况?您可以在这里使用Null Object 模式 - 基本上,在创建产品时,您还可以在该产品上添加 0% 折扣和无限时间的交易。这样,您可以简化产品检索逻辑(查询中没有外连接,没有if
用于计算价格)。
【讨论】:
【参考方案3】:我会为折扣列使用小数。
价格 * 折扣 = $amount off
价格 - $amount off = 购物车中的价格
您可以在有限的时间内放入过期日期列,并且只返回未过期的行。
【讨论】:
【参考方案4】:我会将 discountPrice、discountPercentage、endDiscountDate 列添加到表 Product 并创建表折扣历史记录以保持折扣跟踪
然后选择无需连接表,您可以选择正确的价格 通过检查 endDiscountDate
【讨论】:
以上是关于如何为数据库中的项目建模折扣?的主要内容,如果未能解决你的问题,请参考以下文章
新的 Firebase Firestore DocumentDb 如何为大型子集合建模