我希望以一种很好的方式跟踪网站上某个项目的价格。一种选择是只在每次我更新价格正好在这个表中创建一个新的行时间像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