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

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

【讨论】:

以上是关于如何为数据库中的项目建模折扣?的主要内容,如果未能解决你的问题,请参考以下文章

如何为事实表建模

如何为表上具有许多 m:n 关系的数据库建模

新的 Firebase Firestore DocumentDb 如何为大型子集合建模

Spring JPA:如何为百分比值建模

Django:如何为 MySQL VARBINARY HEX 字段建模?

Datomic 中的数据建模