2011-04-29 69 views
0

我正在构建一个使用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视图效率不高。

所以,我想建立的是填充表每5分钟左右更新数据的cron作业的。然后,我将能够在相关字段中查询此表。

我觉得这个方法能更好地扩展时任务变得更加复杂:

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

我很欣赏你的想法,因为我最近有一种倾向,以避免复杂的查询和存储过程。也许这是矫枉过正?

回答

0

我大概用了没有看着MySQL的控制流功能远远不够复杂,在这种情况下,可行的方案。

一个解决方案我跟在一分钟布莱恩是

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

听起来像你对我应该存储/ MySQL的活动运行这些

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

+0

是啊,这很可能在那里我使用MySQL> 5.1,在这种情况下,我不是那种情况下工作。实质上,CRON工作的原则与填充表格一样 - 这是一件常见的事情,为什么最好从您的角度使用视图或使用存储过程编写复杂查询? – dianovich 2011-04-29 20:49:15

+0

http://publib.boulder.ibm.com/infocenter/db2luw/v8/index.jsp?topic=/com.ibm.db2.udb.dc.doc/dc/c_spbenefits.htm – Pentium10 2011-04-30 07:36:38