我正在构建一个使用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
取决于任务是否重复。
在伪代码,下面的查询会更合适:
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语法为每个任务提供一个非常精确的重复间隔,这将需要在应用程序代码中进行大量的处理,以计算出所有任务的日期。
我很欣赏你的想法,因为我最近有一种倾向,以避免复杂的查询和存储过程。也许这是矫枉过正?
是啊,这很可能在那里我使用MySQL> 5.1,在这种情况下,我不是那种情况下工作。实质上,CRON工作的原则与填充表格一样 - 这是一件常见的事情,为什么最好从您的角度使用视图或使用存储过程编写复杂查询? – dianovich 2011-04-29 20:49:15
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