2009-12-17 134 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 

然後在這種情況下選擇最低價格,梅林。