2013-06-06 24 views
0

這裏是場景: 我試圖創建一個網站,將允許商店輸入產品和價格。我希望他們能夠根據一週中的不同日子和時間設置不同的價格。然後用戶可以訪問該網站,選擇商店和物品,並返回當前價格。基於星期幾和時間的項目價格的最有效的設計

原想: 在表格上,我會讓表格允許正常的價格和銷售價格,並且他們每天可以選擇銷售開始時間和結束時間,如果他們想。這在數據庫方面是最小的,但是非常嚴格,並且不允許很大的靈活性(多個時間點不超過一天的銷售價格)。

如果我添加更多時間點和價格會顯着減慢查詢速度?將所有這些點放在一張表中最好嗎?還是將它們分成不同的表格會更有效?任何建議表示讚賞!

回答

2

最好是將所有這些點放到一張表中,還是將它們分成不同的表格會更有效率?

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,以便您的網站應用程序可以從日曆中生成時間戳記。

+1

這可能是值得一提的,一個好的索引是什麼,可以優化查找當前適用的物品更改價格。可能是ItemPrice(ItemID,ToTime)'?爲'FromTime'和'ToTime'優化WHERE條件會很好,但據我所知,對於同一個查詢,RDBMS不能從2個不同範圍條件的索引中受益。在這個查詢中也應該有一個「LIMIT 1」,這樣一旦RDBMS找到匹配的行就可以返回。 –

+0

@Alex D:我糾正了ItemPrice索引。您也可以將To Time Stamp作爲索引的一部分,但我不確定這足以提高性能。您不想限制查詢。如果您返回給定日期/時間的多行,您希望標記錯誤。 –

+0

我想過了,我認爲'(ItemID,ToTime)'可能比'(ItemID,FromTime)'表現得更好。條件將是'WHERE FromTime <= NOW()AND ToTime> = NOW()'。隨着越來越多的記錄積累在DB中,'FromTime'子句的匹配記錄數量將增加。但匹配'ToTime'子句的記錄數量可能總是很少(除非「將更改的價格」保存在將來的日期)。除非從數據庫中刪除過時的「變更價格」......在這種情況下'FromTime'會更好。 –

相關問題