假设我有这些表/模型:
Product
- id
- last_updated_date
- name
- price
User
- id
- name
WishlistItem
- id
- user_id
- product_id
Product 表有几百万条记录,每晚通过数据导入自动更新(插入新表,删除旧表)。我基本上对该表/模型具有只读访问权限。
如果某个产品在用户的愿望 list 上并且价格下降,我希望能够通知该用户。有哪些方法可以做到这一点?
我有几个想法:
跟踪愿望 list 模型中的 Product.last_updated_date 并定期轮询产品表以查看它是否已更新。这听起来像是一个可怕的/不可扩展的解决方案。
更新产品表时触发的某种 Postgres View 或函数?我是 postgres 的新手,所以我不确定这是否可行。
你会提出一些我没想到的令人惊奇的事情:)
非常感谢任何正确方向的帮助!
更新: 出现的一个想法是将当前价格缓存在心愿单条目本身中,即:
WishlistItem
- id
- user_id
- product_id
- price
...然后,在导入之后,我可以将 WishlistItem.price 与 Product.price 进行比较并相应地进行通知。虽然它可行,但这种方法似乎有点浪费,因为每个用户的每个 WishlistItem 基本上都具有相同的价格数据缓存副本,如果有更新,我将不得不用新价格更新每个列表。不过,我不确定是否有解决方法。
更新: 最后我决定我应该只跟踪所有版本的数据,这样我就可以在更新触发器上使用标准。这也使我能够记录所有价格变化,以便跟踪价格趋势等。
最佳答案
您可以在 Product
上使用更新触发器,但听起来 Product
表实际上并没有被更新,而是被替换了;如果是这种情况,则没有更新来触发触发器,因此您必须通过在 Wishlist
中缓存价格(如 user247245 注释)并扫描 Product
价格变动。
如果 Products
正在更新而不是批发替换,则可以使用更新触发器来记录价格何时发生变化并安排通知相关方。触发器可能会通过将通知插入一个单独的表(以避免锁定 Products
更新)来排队通知,例如 Product_price_changes
;然后,当 Products
更新完成时,一个单独的任务可以将 Product_price_changes
与 Wishlist
进行比较,通知感兴趣的用户,并通过删除所有内容来完成在 Product_price_changes
中。
请注意,在最新版本的 PostgreSQL 中,您可以将更新触发器限制为仅在列更改时触发,而不是在每行更改时触发。
关于ruby-on-rails - 跟踪用户愿望 list 上产品 Markdown 的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4535748/