2009-12-17 135 views
0

情况是这样的:最低价格选择

我们有产品'A123',我们必须记住它的最低价格。 单个产品的价格来自随机数量的商店,并且没有办法知道商店x何时会将'A123'的价格发送给我们。

所以,我曾与列SQL表:

product_number 
price 
shop (from which shop this price comes) 

用于更新产品价格的SQL函数看起来像这样(这是SQL伪代码,语法并不重要):

function update_product(in_shop, in_product_number, in_price) 
    select price, shop into productRow from products where product_number = in_product_number; 
    if found then 
     if (productRow.price > in_price) or (productRow.price < in_price and productRow.shop = in_shop) then 
      update row with new price and new shop 
     end if; 
    else 
     insert new product that we didn't have before 
    end if; 

(productRow.price < in_price and productRow.shop = in_shop)条件是为了防止这样的情况:

在产品表中我们有

A123 22.5 amazon 

然后从亚马逊又来了信息:

A123 25 amazon 

由于上述条件,我们更新的价格更高,这是正确的行为。

但算法在这种情况下失败:我们再次在产品表中的一行:

A123 22.5 amazon 

则来自梅林信息

A123 23 merlin (we don't update because price is higher) 

则来自亚马逊信息

A123 35 amazon 

我们更新表格,现在我们有:

A123 35 amazon 

但这是错误的,因为merlin早些时候该产品的价格较低。

任何想法如何避免这种情况?

+0

因此,您是最低的每个供应商的最高价格?您需要为所有供应商保存(供应商,maxprice_vendor),然后从所有maxprice_ *值中选择最小值。 – 2009-12-17 08:22:23

+0

像在其他答案一样的评论;)为所有供应商保持最高价格的解决方案是显而易见的,但在这样的表将少数百万记录,我恐怕会查询它会慢... – Kuba 2009-12-17 08:37:34

+0

不是最高价格,但最新价格。如果你使用数据库,查询不会很慢。数据库使用索引访问而不是搜索所有记录。 – PauliL 2009-12-17 09:07:58

回答

3

你要解决你的问题的唯一方法是跟踪每个商店的价格,然后只返回最低的当前价格。因此,例如,你需要像你已经有一个表,但是当你的表像中选择出来:

select min(price) 
    from products 
    where product_number = :my_product 

个人如果是我,我会继续当您收到的时间戳产品价格更新,以便您能够确定何时获得更新。

+0

是的,我可以做到这一点,但没有保持所有供应商的价格的原因是性能。在我将保留所有供应商的所有价格的表中,将有几百万条记录 – Kuba 2009-12-17 08:36:10

+0

对于现代数据库,几百万条记录对于任何事情都没有多大意义。 – phoebus 2009-12-17 08:37:43

+0

同意,在产品编号上有一个索引,这将是相对微不足道的。除非你有很多(如10,000+)商店,那么在这几行处理最小或甚至更新也是微不足道的。 – Kitson 2009-12-17 10:50:50

2

为了使这项工作,你应该维护一个包含以下内容的表:

  • 产品
  • 供应商
  • LatestPrice

然后通过查询表确定当前最佳供应商 - 您可以在请求时执行此操作,也可以在更新表格时以简化问题的方式以稍微更复杂的架构和查询的价格进行更新

附加(以下注释):

好吧,这将意味着你需要存储更多的数据 - 但你没有一个巨大的选择的数量 - 要解决这个问题,因此数据需要您可以:a)必须同时更新所有供应商的价格,然后从该快照中选择最佳价格,或者b)在获取价格时存储价格,并从您获得的数据中选择最佳价格。前者意味着在获取和处理数据方面存在相当大的开销,而后者基本上是一个相当温和的存储问题,任何体面的数据库都可以轻松应对。

+0

是的,我可以,但没有保持所有供应商价格的原因是性能。在我将保留所有供应商的所有价格的表格中,将有几百万条记录。 – Kuba 2009-12-17 08:34:56

+1

只有几百万条记录 - 数据库管理系统不应该对这个小表有任何问题。 – 2009-12-17 08:40:22

1

基本上,问题是您只存储来自1个供应商的最低价格。您必须保留所有供应商的价格记录,并使用选择查询来选择最小值。

例如,如果您有:

A123 22.5 Amazon 

和你有:

A123 23 Merlin 

您必须插入它,即使它是用更高的价格,因为它是一个不同的供应商。所以你会有:

A123 22.5 Amazon 
A123 23 Merlin 

当你从亚马逊获得新的价格,例如:25,你只需更新它。所以你会得到:

A123 25 Amazon 
A123 23 Merlin 

然后在这种情况下选择最低价格,梅林。