Способ отслеживать снижение цен на продукт в списке желаний пользователя? - PullRequest
3 голосов
/ 27 декабря 2010

Допустим, у меня есть эти таблицы / модели:

Product
- id
- last_updated_date
- name
- price

User
- id
- name

WishlistItem
- id
- user_id
- product_id

Таблица Product содержит несколько миллионов записей и обновляется автоматически каждую ночь посредством импорта данных (вставка в новую таблицу, удаление старой). Я в основном имею доступ только для чтения к этой таблице / модели.

Если товар находится в списке пожеланий пользователя и цена снижается, я бы хотел уведомить этого пользователя. Какие методы могут быть использованы для этого?

У меня есть пара идей:

  1. Следите за Product.last_updated_date в модели списка пожеланий и периодически опрашивайте таблицу продукта, чтобы узнать, обновлялся ли он. Это звучит как ужасное / немасштабируемое решение.

  2. Какой-то вид или функция Postgres, которая срабатывает при обновлении таблицы Product? Я новичок в postgres, поэтому я еще не уверен, возможно ли это вообще.

  3. Что-то удивительное, что вы предположите, что я не подумал:)

Любая помощь в правильном направлении очень ценится!


UPDATE: Одна идея, которая возникла, заключалась в кешировании текущей цены внутри самой записи списка желаний, т.е.

WishlistItem
- id
- user_id
- product_id
- price

... затем, после импорта, я мог сравнить WishlistItem.price с Product.price и уведомить соответствующим образом. Несмотря на то, что он будет работать, этот подход кажется немного расточительным, поскольку каждый WishlistItem для каждого пользователя будет по существу иметь одну и ту же кэшированную копию данных о ценах, и мне придется обновлять каждый список новой ценой, если есть обновление. Я не уверен, что есть способ обойти это.


UPDATE: В конце концов я решил, что мне, вероятно, следует просто отслеживать все версии данных, чтобы я мог использовать стандартные триггеры обновления. Это также позволяет мне регистрировать все изменения цен, чтобы я мог отслеживать ценовые тренды и т. Д.

Ответы [ 2 ]

2 голосов
/ 27 декабря 2010

Вы можете использовать триггер обновления на Product, но похоже, что таблица Product на самом деле не обновляется, она заменяется; если это так, то нет обновления для запуска триггера, поэтому вам придется сделать это сложным путем, кэшируя цену в Wishlist (как отмечает пользователь 247245) и сканируя Product на предмет изменения цены.

Если Products обновляется, а не заменяется оптом, тогда можно использовать триггер обновления, чтобы отмечать изменение цены и организовывать уведомление заинтересованных сторон. Триггер, вероятно, поставит уведомления в очередь, вставив их в отдельную таблицу (чтобы не блокировать обновление Products), с именем, скажем, Product_price_changes; затем, когда обновление Products выполнено, отдельная задача может сравнить Product_price_changes с Wishlist, уведомить заинтересованных пользователей и завершить, удалив все в Product_price_changes.

Обратите внимание, что в последних версиях PostgreSQL вы можете ограничить запуск триггера обновлением только при изменении столбца, а не при каждом изменении строки.

2 голосов
/ 27 декабря 2010

Я бы добавил поле "цена" в таблицу пожеланий. После обновления таблицы продуктов запросите более низкие цены и сгенерируйте в результате таблицу уведомлений

С уважением, / Т

...