我希望以一種很好的方式跟蹤網站上某個項目的價格。一種選擇是隻在每次我更新價格正好在這個表中創建一個新的行時間像postgresql 9.5 - 隨着時間的推移跟蹤對一個值的更改
create table prices (
name text,
price decimal,
updated timestamp
)
一張桌子和。 不過,我認爲這種做法是不是在我的處境很「好」,有以下原因:
- 我跟蹤的幾個1000個項目在任何給定的時間,
- 我更新價格每上漲5或等分鐘,
- 價格通常不會變化很多,有時根本不會改變。
由於這些原因,對於一個特定的項目,說:dove bodywash
,我的價格表可以包含200列,所有看起來像
'dove soap' | 3.00 | <a new timestamp every 5 minutes>
這似乎有點可笑。 在我看來,一個更好的解決方案是增加一個額外的price_history
表格,該表格存儲了一個物品具有特定價格的時間範圍。例如,price_history
可能有列
name | price | created_at | updated_at
和期望的行爲是,每當我更新的dove soap
價格,會有一個觸發器,它會自動檢查,如果價格發生了變化 - 如果它不,那麼只需更改prices_history中相應條目的updated_at
,如果有,則爲新價格在prices_history中創建一個新行。作爲執行的例子,我想要:
1)在時間1我做insert into prices ('dove soap', 3.00)
。在這一點上,price_history表將包含在時間2行
|'dove soap' | 3.00 | time1 | null |
2)我做update prices set price = 3.00 where name = 'dove soap'
。現在price_history表看起來像
'dove soap' | 3.00 | time1 | time2
3)在時間3的價格仍然是3.00。 price_history應該看起來像
'dove soap' | 3.00 | time1| time3
4)在時間4價格是3.50。 price_history現在應該是這樣的:
'dove soap' | 3.00 | time1 | time3
'dove soap' | 3.50 | time4 | null
我的問題是
- 我不知道這是否是去了解一個很好的方式,並且
- 我不是100%確定是什麼一個好的方法來實現這一點將是。
任何意見上述任何一點都非常感謝!
感謝:-)
編輯:我應該包括一兩件事,我看着是temporal_tables
PostgreSQL的擴展,它採用了類似的價格/ price_history /套起。問題在於,它似乎會在價格每次更新時在price_history表中創建一個新行,如果它沒有更改則會創建一個新行,這會破壞目的。在我看來,沒有辦法修改這種默認行爲,但如果有人知道更好,請讓我知道!
我有類似的情況。我的每條記錄都有開始日期和結束日期。無論何時添加記錄(帶有新的開始日期),都會觸發一個觸發器,以適當的日期更新先前記錄的結束日期。在你的情況下,我會在插入之前添加一個觸發器,如果價格相同,則不插入。如果沒有改變,不會麻煩改變updated_at。最後,我會將你所謂的price_history作爲你唯一的表格和一個提取當前記錄的視圖。 – mlinth
感謝您的回覆!你有沒有機會鏈接到創建這種觸發器的例子?我對sql相當陌生,對事物的工作原理沒有很好的理解。 – ira