用于调度的数据库 - 使用cron根据重复计划安排单个任务?

时间:2012-05-30 14:59:52

标签: database database-design

我目前正在设计一个数据库:

1)有一个任务列表,例如:

Clean the floor.
Wipe the sink.
Take swabs.

2)有一个区域列表,例如:

Kitchen.
Servery.

3)针对某个区域安排任务,可以是“每小时”,“每日”,“每周”,“每月”或“每年”。我将这个AreaTask(区域,任务,频率)称为: -

Kitchen, Clean the floor, Daily

4)AreaTask将在一个工作日开始时(如果是每日,每周,每月或每年),或者在小时开始时根据时间表到期。例如,如果“清理地板”在周三安排为“每周”,那么在每个星期三开始时它将成为截止日期,并且在完成之前保持到期(工作,签名等) - 或者如果它超过一定时间,它将变为OverDue。

5)当针对AreaTask完成工作时,它会记录在数据库中(区域,任务,用户[完成工作],DateTime [工作完成]): -

Kitchen, Clean the floor, Joe Bloggs, 2012-05-23 10:50:00

以下是我要做的决定:

我可以单独通过查询确定任何特定时间的AreaTask的各种状态,因为所有数据都存在(即我可以确定AreaTask将在周三成为截止日期,而我如果在设定的时间之前没有对该AreaTask进行过工作,则可以确定它已过期。但是,我想知道是否应该有一个可能由CRON作业或其他方法填充的AreaTaskDue表。

这样我在数据库中有一个正式的条目来查询和存储数据,例如:

ScheduledTask(Area,Task,ScheduledDateTime)     厨房,清洁地板,2012-05-23 06:00:00

这也可以在需要时手动安排任务。

然后,当针对ScheduledTask完成工作时,可以针对ScheduledTask本身记录它:

ScheduledTaskWork(Area,Task,ScheduledDateTime,User,DateTime)     厨房,清洁地板,2012-05-23 06:00:00,Joe Bloggs,2012-05-23 11:30:00

我希望这是有道理的。

PS这是基于RDBMS的数据库 - 而不是OO。我倾向于使用Views来从不同的角度看数据。

感谢。

也许PS也许CRON工作也会将ScheduledTask标记为OverDue而不是确定。我想问题是关于这些正式状态是应该存储在数据库中还是确定的。我可以存储它们的唯一方法是运行某种CRON作业(这很好,只要我知道没有更好的方法)。

编辑:反对推导国家的一个论点是时间表可能会改变 - 但是我确实在数据库中保留了历史记录,所以我仍然可以得出 - 但我想的越多,我就越倾向于使用CRON根据时间表安排任务的工作。

1 个答案:

答案 0 :(得分:0)

看看这个模型:

enter image description here

每次启动任务时,都会在WORK表中插入一个新行。完成后,设置WORK.COMPLETED_AT。

您可以找到今天尚未完成的日常任务(及其区域):

SELECT *
FROM SCHEDULE
WHERE
    FREQUENCY = 'daily'
    AND NOT EXIST (
        SELECT * FROM WORK
        WHERE
            SCHEDULE.AREA_ID = WORK.AREA_ID
            AND SCHEDULE.TASK_ID = WORK.TASK_ID
            AND DAY(COMPLETED_AT) = TODAY
    )

将DAY和TODAY替换为您的数据库特有的任何内容,并且您可能希望使用整数而不是字符串来进行FREQUENCY。

可以为其他频率设计类似的查询。

手动计划的任务可以通过类似于SCHEDULE的表建模,但FREQUENCY由显式时间替换。