复杂数据库查询与计划存储数据和存储过程

时间:2011-04-29 18:06:57

标签: mysql database-design stored-procedures views

我正在使用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.datedatediff排序。我真正需要的是能够对一个字段进行排序,并且datediff依赖于任务是否重复。

在伪代码中,以下查询更合适:

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分钟左右用一个表格填充更新的数据。然后,我将能够在相关字段中查询此表。

我认为当任务变得更复杂时,这种方法会更好地扩展:

  

e.g。用户可以使用crontab语法为每个任务提供非常精确的重复间隔,这需要在应用程序代码中进行大量处理才能计算出所有任务的日期。

我很感激您对此的看法,因为我最近有一种倾向,以避免复杂的查询和存储过程。也许这有点矫枉过正?

2 个答案:

答案 0 :(得分:0)

听起来像你应该用MySQL事件存储/运行这些事件

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

答案 1 :(得分:0)

在这种情况下,由于没有充分研究MySQL的控制流功能,我可能过于复杂了。

我现在正在处理的一个解决方案是

SELECT IF(Task.repeat, repeats_expression, non_repeats_expression) as date_diff;