Сложные запросы к базе данных против запланированного хранения данных и хранимых процедур - PullRequest
0 голосов
/ 29 апреля 2011

Я строю систему с использованием 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, который потребовал бы довольно большой обработки в коде приложения для обработки датировки всех задач.

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

Ответы [ 2 ]

0 голосов
/ 30 апреля 2011

Я, вероятно, слишком усложнил жизнеспособные варианты в этом случае, не достаточно изучив функции потока управления MySQL.

Одно решение, с которым я собираюсь в данный момент, -

SELECT IF(Task.repeat, repeats_expression, non_repeats_expression) as date_diff; 
0 голосов
/ 30 апреля 2011

звучит для меня как будто вы должны хранить / запускать их с MySQL Events

http://dev.mysql.com/tech-resources/articles/mysql-events.html

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