Я строю систему с использованием MySQL, которая позволяет управлять задачами и создавать их.Задачи могут быть либо
- одноразовым заданием, которое должно быть выполнено к фиксированной дате
- , повторяя задачи, начиная с фиксированной даты и повторяя каждые N дней
Упрощенная схема выглядит как
Tasks
========================
| id | name | date | repeats |
| 1 | Backup X | 2011-... | 0 |
| 2 | Backup Y | 2011-... | 1 |
Теперь предположим, что я хочу выполнить запрос для этого набора данных:
SELECT $N - mod(datediff(NOW(), Task.date), $N) AS datediff, Task.name
FROM tasks Task
ORDER BY datediff, Task.date;
где N - интервал повторения для задачи.
Как видите, мне нужно отсортировать по или Task.date
или datediff
.Что мне действительно нужно, так это уметь сортировать по одному полю, а datediff
зависеть от того, повторяется ли задача.
В psuedocode следующий запрос будет более уместным:
SELECT
IF(Task.repeats = 1)
// Get the number of days until next repeat on a repeating event
$N - mod(datediff(NOW(), Task.date), $N) AS datediff
ELSE
// Get number of days until non-repeating task expires
datediff(NOW(), Task.date) AS datediff
- Хранимые процедуры - это один из вариантов, но ими сложнее управлять, чем в коде приложения.
- Представления - это еще один вариант.Но представления MySQL не очень эффективны.
Итак, Я думаю о настройке задания CRON, которое заполняет таблицу обновляемыми данными каждые 5 минут или около того.Тогда я смогу запросить эту таблицу в соответствующих полях.
Я думаю, что этот метод будет лучше масштабироваться, когда задачи станут более сложными:
например, пользователи могут дать каждой задаче оченьточный интервал повторения с использованием синтаксиса crontab, который потребовал бы довольно большой обработки в коде приложения для обработки датировки всех задач.
Я ценю ваши мысли по этому поводу, поскольку в последнее время у меня была склонность кИзбегайте сложных запросов и хранимых процедур.Возможно, это излишне?