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

Mysql 复杂数据库查询与数据和存储过程的计划存储,mysql,database-design,stored-procedures,views,Mysql,Database Design,Stored Procedures,Views,我正在使用MySQL构建一个允许管理和创建任务的系统。任务可以是 在固定日期内完成的一次性任务 重复任务,从固定日期开始,每N天重复一次 简化的模式如下所示 Tasks ======================== | id | name | date | repeats | | 1 | Backup X | 2011-... | 0 | | 2 | Backup Y | 2011-... | 1 | 其中N是任务的重复间隔 如您

我正在使用MySQL构建一个允许管理和创建任务的系统。任务可以是

  • 在固定日期内完成的一次性任务
  • 重复任务,从固定日期开始,每N天重复一次
简化的模式如下所示

Tasks ======================== | id | name | date | repeats | | 1 | Backup X | 2011-... | 0 | | 2 | Backup Y | 2011-... | 1 | 其中N是任务的重复间隔

如您所见,我必须按排序,要么按
排序,要么按
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分钟左右用更新的数据填充一个表。然后,我将能够在相关字段上查询此表

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

e、 g.用户可以使用crontab语法为每个任务指定一个非常精确的重复间隔,这将需要应用程序代码中大量的处理来计算所有任务上的datediff


我很欣赏您的想法,因为我最近倾向于避免复杂的查询和存储过程。也许这太过分了

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


在本例中,我可能因为没有充分研究MySQL的控制流函数而使可行的选项过于复杂

我现在要考虑的一个解决方案是

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

啊,是的,在我使用MySQL>5.1的情况下,这可能很有效,但在这种情况下,我不是。从本质上讲,填充表与CRON作业的原理相同——这是一件常见的事情吗?从您的角度来看,为什么编写复杂的查询、使用视图或使用存储过程更可取?
SELECT IF(Task.repeat, repeats_expression, non_repeats_expression) as date_diff;