Я бы использовал второй стол с двумя столбцами: (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)
(единственное «время»), выбор «следующего времени выполнения» будет проще.)