Поиск следующего запуска задачи с учетом пользовательских расписаний, хранящихся в базе данных - PullRequest
0 голосов
/ 29 января 2012

У меня есть приложение, в котором человеку разрешено устанавливать будильник для определенных событий в течение определенного времени и дней. Например: Есть два события - A & B, и эти события происходят неоднократно в определенные дни недели, график этих событий выглядит следующим образом:

СОБЫТИЕ A - происходит каждое воскресенье, понедельник и среда в 7 утра и 9 вечера.
СОБЫТИЕ B - происходит каждое воскресенье и вторник в 6 утра и 8 вечера.
СОБЫТИЕ C - происходит каждый понедельник, среда и четверг в 8 утра 9 вечера.

Пользователю показывается форма, в которой он может выбрать дни и ввести время, одинаковое для всех выбранных дней. Он может создать столько событий, сколько он хочет.

В БД на данный момент я создал 7 столбцов для каждого дня и один столбец для времени. Я знаю, что могу сделать это излишне сложным. Приведенные выше данные представлены как

EventNAME SUN MON TUE WED THU FRI SAT Timings
 A         1  1    0   1  0    0   0   7,21
 B         1  0    1   0  0    0   0   6,20
 C         0  1    0   1  1    0   0   8,21

Теперь по какой-то причине я должен найти следующий ближайший день и время, когда произойдет событие. Например: если сегодня утро 6 утра, я должен получить следующее ближайшее событие как утро 7 утра. и в среду утром 8:00 я должен получить следующее ближайшее событие как событие C в утро 8:00.

Как получить следующий ближайший день и время из такой схемы? Есть ли лучший способ оформления стола?

1 Ответ

1 голос
/ 29 января 2012

Я бы использовал второй стол с двумя столбцами: (event_id, next_run_time)

Всякий раз, когда вы добавляете событие в таблицу расписания, рассчитайте, когда оно должно сработать в следующий раз. Создайте функцию для этого. Логика будет:

  • Проверьте, нужно ли запускать задачу сегодня (сегодняшняя колонка - 1, а один из сроков - в будущем)
  • Если нет, ищите следующий день, когда он должен сработать, первый раз.

Тогда вычисление того, что нужно запустить, является простым делом (псевдо-sql):

select (for update) event_id from next_run_times where next_run_time < now

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

Осторожно: вам понадобится какая-то форма блокировки, чтобы не запускать задачу дважды, если «планировщик» запускается одновременно.

Я не уверен, полезно ли иметь столбец для каждого дня недели, если, например, вы не хотите специально запрашивать «задания, запланированные по средам». Более компактный формат (например, простая строка с 0101100 для вашей последней задачи) может оказаться более практичным в зависимости от вашего языка программирования и точных потребностей запросов. (Или, возможно, измените эту таблицу с помощью (event_id, day_number, timing) (единственное «время»), выбор «следующего времени выполнения» будет проще.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...