最好是將所有這些點放到一張表中,還是將它們分成不同的表格會更有效率?
normalize your data總是更有效率。
如果我添加更多的時間點和價格會顯着減慢查詢速度?
這取決於您使用的數據庫類型。關係數據庫是爲規範化數據設計的。
對於有很多價格的物品,這裏是你將如何建模數據。
Item
----
Item ID
Item Name
Price
...
ItemPrice
---------
ItemPrice ID
Item ID
Price
From Time Stamp
To Time Stamp
表中第一列的ID字段是主聚類鍵,是一個自動遞增的int或long。
在Item
表中,價格是通常的價格。
在ItemPrice
表中,您也有一個唯一索引(項目ID,從時間戳降序)。時間戳記和時間戳記將定義更改的價格的日期和時間。
因此,每當您在您的網站應用程序代碼中查找價格時,都會先檢查ItemPrice
表格。如果您沒有更改價格行,則可以使用Item
表中的價格。
您還必須確保在您的網站應用程序代碼中,對於給定的日期/時間範圍只有一個更改的價格。
從時間戳到時間戳工作,當你想每隔一段時間更改價格時,比如每月一次。如果您想要定期更改週日價格,則還需要calendar table,以便您的網站應用程序可以從日曆中生成時間戳記。
這可能是值得一提的,一個好的索引是什麼,可以優化查找當前適用的物品更改價格。可能是ItemPrice(ItemID,ToTime)'?爲'FromTime'和'ToTime'優化WHERE條件會很好,但據我所知,對於同一個查詢,RDBMS不能從2個不同範圍條件的索引中受益。在這個查詢中也應該有一個「LIMIT 1」,這樣一旦RDBMS找到匹配的行就可以返回。 –
@Alex D:我糾正了ItemPrice索引。您也可以將To Time Stamp作爲索引的一部分,但我不確定這足以提高性能。您不想限制查詢。如果您返回給定日期/時間的多行,您希望標記錯誤。 –
我想過了,我認爲'(ItemID,ToTime)'可能比'(ItemID,FromTime)'表現得更好。條件將是'WHERE FromTime <= NOW()AND ToTime> = NOW()'。隨着越來越多的記錄積累在DB中,'FromTime'子句的匹配記錄數量將增加。但匹配'ToTime'子句的記錄數量可能總是很少(除非「將更改的價格」保存在將來的日期)。除非從數據庫中刪除過時的「變更價格」......在這種情況下'FromTime'會更好。 –