2015-09-29 34 views
1

我正在一個項目上工作,但數據庫設計有問題。 我需要存儲一年中每天的價格,但我需要能夠更改特定日期的價格。如何在數據庫中存儲一年中每一天的價格?

我是否需要每天創建一列,在這種方法中,我必須在表中創建365列。

你有什麼更好的辦法解決這個問題,任何幫助將不勝感激,謝謝。

+0

不,除非你只是挑選號碼的開出一頂帽子的決定價格的任何給定的一天。我相信你有某種算法或協議可以定義任何一天的價格。在你的代碼中使用它。 –

+0

另請參閱本文,瞭解有關列數和數據庫引擎數對性能的影響:https://www.percona.com/blog/2009/09/28/how-number-of-columns-affects-performance/ – Shockwave

+0

爲什麼您需要爲每個產品每天存儲不同的價格?只需創建一個'price_history'表並在新價格發生變化時記錄。 –

回答

0

只是做一個表

id of the product | date | price 
+0

但以這種方式,每個產品都會有365個數據?這不會使數據庫如此之大嗎? – RecreatioN

+0

沒有。即使有數百萬條記錄,數據庫也可以執行得很好。 – Shockwave

+0

@RecreatioN - 這不是理想的解決方案,但是當您考慮Facebook擁有數億行數據庫時,表格中的365行很小 –

1

經典的解決辦法是每個日期使用結合表,以價格爲每產品:

CREATE TABLE product_prices (
    product_id INT REFERENCES products(id), 
    price DECIMAL (5, 2), 
    date DATE, 
    PRIMARY KEY (product_id, date) 
); 
5

你應該創建一個表6列。

CREATE TABLE IF NOT EXISTS priceHistory (
    `price` decimal(8,2) NOT NULL, 
    `date` datetime, 
    `productId` VARCHAR(50), 
    `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    `createdAt` TIMESTAMP DEFAULT NOW(), 
    `updatedAt` TIMESTAMP 
) ENGINE = INNODB; 

現在你可以插入日期和價格之間的每一天,列created_atupdatedAtid自動插入(和updatedAt自動更新),所以你不需要再費心機了他們。

如果您將這些價格保存在每日基數並稍後訪問數據,那麼您甚至不需要date列,只需使用createdAt即可自動在INSERT上創建該列。

一旦你的數據,你可以查詢它像

SELECT * FROM priceHistory WHERE DATE(`date`) = '2015-02-29'; 

您也可能會在日期函數有用找到mysql's documentation

編輯

正如他在答覆中提到@murenik的recomended的辦法是建立一個關係表牽着你的產品的細節,你可能有。要做到這一點,productId聲明改爲

productId INT PRIMARY KEY REFERENCES products(id), 

這將連接這些表,使得未來的查詢更方便,更有效。

SELECT ph.*, p.* 
FROM products p 
INNER JOIN priceHistory ph on p.id = ph.productId 

見mysql的JOIN

+0

謝謝你的答案,我不需要產品ID? – RecreatioN

+0

謝謝,你是對的。編輯它。 @RecreatioN – baao

+0

爲什麼不存儲算法的歷史,而不是..只是說... ..它更便宜 –

0

我們有一個複雜的費率表在一個地方,我的工作,而不是存儲每一天的速度,我們存儲在第一天就改變了速度。因此,如果1單元(例如汽車旅館)在旅遊旺季是$ 50一晚一至四月,然後$ 65一晚在夏季,再回到$ 50一晚在秋季,速度表將有3個記錄:

Start Date   Close Date   Unit # Rate 
------------  -----------------  ------- ------- 
January 1, 2015 March 30, 2015  Unit1 $50 
April 1, 2015  September 30, 2015 Unit1 $65 
October 1, 2015 December 21, 2015  Unit1 $50 

然後,所有你需要做的是找到一個速度記錄在您選擇的日期在開始和結束日期之間。

+0

謝謝你的答案,你是對的我需要這樣的東西,但我不明白如何使你的答案數據庫,你能告訴我更具體嗎? – RecreatioN

+0

我們使用的表格基本上是上面的示例,但也有一個唯一的標識符列。大部分費率處理都是通過代碼完成的。由於匯率表已保存,因此我們將跟蹤上次開始日期和匯率變化的下一個開始日期,以便我們可以計算結束日期。最後一個比率自動得到了2099年12月31日的結束日期。我們使用了一個網格控件(這一切都在PC軟件中,而不是網絡軟件中)來構建比率,並且代碼只是沿着逐行進行保存到數據庫。 –

相關問題