如何存储有生效日期的价格?


21

我有一个产品清单。每个都由N个提供者提供。

每个提供商都为我们提供特定日期的价格。该价格一直有效,直到该提供商决定设置新价格。在这种情况下,提供商将使用新日期给出新价格。

MySQL表标头当前看起来像:

provider_id, product_id, price, date_price_effective

每隔一天,我们会汇总当天有效的产品/价格列表。对于每种产品,该列表包含具有该特定产品的提供者的排序列表。这样,我们可以从碰巧提供最佳价格的任何人那里订购某些产品。

为了获得有效的价格,我有一条SQL语句返回所有具有的行date_price_effective >= NOW()。该结果集由ruby脚本处理,该脚本进行必要的排序和过滤以获取如下所示的文件:

product_id_1,provider_1,provider_3,provider8,provider_10...
product_id_2,provider_3,provider_2,provider1,provider_10...

对于我们的目的来说,这很好用,但是我仍然觉得SQL表可能不是存储此类信息的最佳方法。我感到这种问题以前已经以其他更具创造性的方式解决了。

除了在SQL中,还有其他更好的方法来存储此信息吗?或者,如果使用SQL,是否有比我正在使用的方法更好的方法?


lal00:正如我在评论中提到的那样,我会定期处理有效的约会。请参阅我的答案,以获取一种简单有效的日期处理方法。创建新的价格行时,不需要知道价格有效的期限,创建新的行时,也不需要返回修改最新的前一行。
玩意儿

Answers:


17

对于随时间变化的物品(例如能够回答“日期D的X的价格是多少”或“日期E的饲养场Q中的那头母牛是什么”之类的东西),我建议您阅读《发展面向时间的书》 SQL中的数据库应用程序。” 当本书绝版时,作者在其网站上热情地提供了该书的PDF以及相关的CD。

http://www.cs.arizona.edu/~rts/publications.html(在“书籍”下查找第一项)。

有关在线简要介绍,请参见:


1
好吧,这不是我问的时候想到的,更好!:)
edmz 2011年

3

我当然会将生效日期存储在数据库中。毕竟,人们很可能希望能够运行查询以查看价格如何随时间变化,或根据历史产品价格表交叉检查订单中的奇数。根据您正在运行的查询类型和价格变化的频率,为当前价格和历史价格创建单独的表可能很有意义。

在大多数存储价格的系统中,除了有效日期外,您还需要一个到期日期列,以便更轻松地确定当前有效的价格,因为它免除了您查看上一行或下一行的麻烦。在给定时间点哪个价格有效。我不清楚您的NOW() >= date_price_effective状况如何-大概会返回当前价格以及所有以前的历史价格,这对我来说似乎很奇怪。我认为“有效价格”将是当前价格,其定义如下NOW() BETWEEN date_price_effective AND date_price_expired

我也不确定您的文件应该是什么样子。对我来说,尚不清楚provider_1代表什么(provider_id = 1价格?)或您如何订购提供商数据-为什么provider_1出现在的第一位product_id_1和第三位product_id_2


贾斯汀,有效期很有意义。您是对的,相反我有SQL。输出文件与我的问题不是很相关,我只是添加了一种方法,以举例说明我需要按价格对产品进行排序。
edmz 2011年

不需要在每一行中包含到期日期,因为这样做只会增加额外的开销,因为通常不会在创建行时给定价格有效期。如果我们在一个表中的每个producer_id / product_id对有N行,每行在特定日期生效,则date_price_effective值最大的行小于或等于给定日期的行是该行的有效价格那个日期。如果查看我的帖子,您将看到执行这种查询的SQL代码。我必须定期处理生效日期。
比特币2011年

@ bit-twiddler-当然,没有必要指定截止日期。但是,具有到期日期通常会使查询表变得更加容易和高效。由于有效日期查询通常比价格更改更为常见,因此我很乐意做出权衡。
贾斯汀·凯夫

3

如果我正确理解了您的问题说明,则需要一种方法来处理世代数据(即,该表为每个provider_id / product_id对包含多个行,每个对都是日期日期)。在这种情况下,您正在寻找date_price_effective值小于或等于今天的产品的最新价格。使用SQL子选择很容易处理这种情况。

 SELECT 
   provider_id, product_id, price, date_price_effective 
 FROM 
   price_table a 
 WHERE 
   date_price_effective = 
     (
       SELECT 
         MAX(date_price_effective) 
       FROM 
         price_table b 
       WHERE 
         b.provider_id = a.provider_id AND 
         b.product_id = a.product_id AND
         b.date_price_effective <= NOW() 
     );

只要价格的最大date_price_effective值小于或等于执行查询的日期,该价格即有效。大于今天的date_price_effective值是将来的生效日期。上面列出的代码返回每个provider_id / product_id对的行数据,它们对的date_price_effective值最接近但不晚于查询执行的日期。该解决方案会自动将价格放入有效日期范围内。该表的主键为三元组{provider_id,product_id,date_price_effective};

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.