Правильно ли я использую задание cron с этим дизайном БД?

avatar
Future44
8 апреля 2018 в 07:24
28
1
0

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

Мне нужно сохранить:

Данные пользователя (id/email/info/email)

Видеокарты (идентификатор товара/цена)

Пользователи, отслеживающие видеокарты (userID/Video Card/PriceAlertAtThisPRice)

Затем запустите 2 задания cron. 1, чтобы постоянно обновлять таблицу цен на видеокарты (а также удалять элементы из списка отслеживаемых графических процессоров, когда их не отслеживает ни один пользователь) и 1, чтобы просмотреть отслеживаемые товары каждого пользователя и отправить электронное письмо, когда требуется оповещение о цене (возможно, каждые 5 минут)

Это правильно или есть лучший способ сделать это?

Источник

Ответы (1)

avatar
Cyclonus
8 апреля 2018 в 07:48
0

Я бы:

  1. В таблице отслеживания должен использоваться идентификатор видеокарты.

  2. Имейте только 1 задание cron для обновления всех цен каждые X минут.

  3. В конце этой работы проверьте цены на каждый графический процессор и сравните их со всеми целевыми. Отправьте только 1 электронное письмо каждому подписчику для всех его подписок, цели которых достигнуты. Затем отмените подписку этого пользователя на каждую подписанную комбинацию GPU+цель (удалит строку).

Редактировать: уточнить последнюю часть. Вероятно, у вас больше пользователей, чем графических процессоров.

  • Выберите каждый GPU, currentPrice из таблицы GPU.
  • Выберите каждого пользователя из таблицы UsersTrackingGPUs, где целью является >= GPU.currentPrice.
  • Отслеживайте, что вы выбираете, чтобы отправлять только 1 электронное письмо для каждого пользователя, независимо от того, сколько отслеживаемых графических процессоров он сопоставил. Что-то вроде:

    discovered = { user1: [GPU1: 50 долларов, GPU2: 200 долларов], ... }

Для каждого обнаруженного пользователя: Отправьте 1 электронное письмо со всеми подходящими графическими процессорами.

Для каждой обнаруженной комбинации пользователь+GPU: - Удалить строку из UsersTrackingGPUs.

Извините за плохое форматирование, я не очень хорошо разбираюсь в этом на мобильных устройствах..

Редактировать еще раз: подробнее.

Что-то вроде этого: выберите * из UsersTrackingGPUs utg, присоедините GPU g к группе gtu.id=g.id с помощью utg.user_id, имеющего g.price <= utg.tracking_price

Извините, я не собираюсь получать доступ к ПК в течение некоторого времени, но я думаю, что это должно быть близко к тому, что вам нужно - все пользователи со всеми графическими процессорами, которые они отслеживают, так что их цена отслеживания выше текущая цена.

Надеюсь, это поможет :-)

Future44
8 апреля 2018 в 07:51
0

в худшем случае для API (максимальное количество запросов/максимальное количество gpus) должно занять около 10-15 секунд, чтобы не было дросселировано для заполнения «полной» таблицы графических процессоров, так что я думаю, что это нормально. Как мне справиться с выполнением последней части задания для каждого пользователя? Выберите каждого пользователя, а затем запросите таблицу UsersTrackingGPU один раз для каждого пользователя, когда я перебираю список пользователей?

Future44
8 апреля 2018 в 07:54
0

Итак, обновите таблицу. Затем выберите * из таблицы, сохраните результаты в диктофоне в памяти. Выберите * среди пользователей, затем просмотрите этот список, выбрав GPUS, которые они отслеживают, затем проверьте и при необходимости отправьте электронное письмо? Итак, 1 запрос/пользователь?

Cyclonus
8 апреля 2018 в 08:09
0

1 запрос / GPU дешевле, так как у вас, вероятно, больше пользователей, чем GPU. Проверьте мое редактирование.

Future44
8 апреля 2018 в 20:13
0

Есть ли лучший способ выполнить это? Если я выполняю запросы для каждого графического процессора, я получу несколько наборов результатов с повторяющимися пользователями, и мне придется фильтровать их в коде. Это идеально? И кстати спасибо :)

Cyclonus
8 апреля 2018 в 21:39
0

Проверьте мое редактирование, я думаю, это то, что вам нужно (или достаточно близко!)