2011-01-27 94 views
3

基本上,我的問題是 - 我有一個價格清單,其中一些是歷史的(即我希望能夠在3月11日搜索該產品X爲0.99美元,4月1日爲1.99美元等)。什麼是存儲這些信息的最佳方式?在MySQL表中存儲歷史價格表的最佳方式是什麼?

我想我可能會有一個產品表,有一個外鍵到價格表。我最初認爲存儲當前價格可能是最好的選擇,但我認爲我希望能夠存儲歷史價格數據,那麼更好的途徑是存儲類似以下價格表的表格:

CREATE TABLE prices (
     id BIGINT auto_increment not null, 
     primary key (id), 
     price DECIMAL(4,2) not null, 
     effectiveStartDate DATETIME NOT NULL, 
     effectiveEndDate DATETIME 
); 

我在這裏有點虧了。我希望能夠高效地搜索產品並查看產品價格隨時間變化的情況。我如何有效地將一組這些價格與產品相關聯?我想我所問的是'爲了能夠提供跨越特定日期的查詢的高效搜索,將這個索引編製成最佳方式是什麼?'

+0

您是否真的想看到歷史價格或知道訂單時產品的價格。我看不到爲什麼我需要看到這部分是2008年的12美元,現在是17美元。 – HLGEM 2011-01-27 23:08:06

+0

我會用product_id替換id,並考慮將主鍵設置爲product_id,price和effectivestartdate。 – 2011-01-27 23:09:28

回答

9

將需要的歷史數據與當前價格分開。這意味着:

1)將當前價格保留在產品表中。

2)當價格變化時,只將新價格插入歷史表中,僅包含開始日期。你並不需要結束日期,因爲你可以從前一行中得到它。 (您仍然可以放入它,這使得查詢更容易)

還請記住,您的訂單歷史記錄提供了另一種歷史記錄,即以一定的價格隨時間推移的實際購買量。

4

首先,請確保你真的需要這樣做。您是否將訂單存儲在同一個數據庫中?如果是這樣,您可以隨時查看訂單中物料的價格,隨時查看歷史價格趨勢。這也將使您能夠在價格變化和訂購模式的變化之間進行關聯;唯一不會解決的情況是價格變化導致沒有訂單被放置。

這就是說,如果你想要一個獨立的價格變化記錄,你呈現的是好的。我建議的唯一的事情是消除結束日期;除非您計劃在產品有價格或重疊價格的時間上存在差距,否則開始日期已足夠,並且會使您的邏輯更加輕鬆。

1

結束日期可能適用於更復雜的系統,您可以在此計劃產品價格(即各種季節性促銷等)。 (哦,這是BS,應該更多地考慮它......好吧,只有當你同時計劃多個產品價格時,你才需要結束日期,通過別的方式來區分......仍然通常很方便當前的記錄,而不是看前一個/下一個)

實際上,對於大多數複雜系統而言,僅有幾個當前價格僅通過「尺寸」進行區分(例如,某種屬性可能由實際運輸地點決定或客戶所在的國家等)

在您省略[product_id,starting_date,..?。的自定義「id」主鍵之前,我還會檢查兩次您的平臺/語言/框架/工作風格。 。]複合PK。後者是更合乎邏輯的選擇(至少我個人更喜歡它),但它有時可能適得其反,例如,如果您的數據庫庫只能使用更復雜的主鍵的方法有限。

相關問題