任务调度的数据库设计

时间:2017-01-17 10:57:20

标签: sql postgresql

我有需要在指定的时间和日期重复执行的任务。例如,任务A应在下午1点,2点和3点执行。周一和下午2点,8点,11点。在周五。任务B应在星期一凌晨4点执行,依此类推。基本上每项任务都可以在任何一天的任何时间执行。如果当前小时的所有任务都已执行,我们将再次执行它们。所以它就像每小时的优先队列一样。

我使用的是Postgres,现在是JSONB的设施。我有表tasks,其中包含与任务相关的信息和日程安排。每项任务的时间表如下所示:

{
  "Mo": [
    1,
    2,
    3
  ],
  "Fr": [
    4,
    5,
    6
  ]
}

但是我不喜欢json没有强类型,选择任务的查询看起来真的很难看,我认为查询的性能可能会更好。

我想可能是我创建了一个表,我存储了每周的每个小时,例如,小时和表执行,我存储与小时id相关的任务ID。可以工作,但对于存储空间来说似乎非常糟糕(任务量现在约为100000且不断增长)。

所以我想知道如何为这种情况正确设计数据库?

1 个答案:

答案 0 :(得分:0)

好的,您需要存储任务,但不能存储完整的日历(在提取数据时动态创建日历)......

对于每个事件/任务,您需要存储开始日期时间以及持续时间或结束日期时间。

create table TASKS (ID integer constraint TASK_ID primary key,
                    TASK_NAME varchar(200),
                    REPEAT_DAY int not null,
                    REPEAT_TIME time not null);

选择数据,使用CTE即时填充日历

with TODAY_CAL as
(
select current_date + (n || ' hour')::INTERVAL as CalTime -- use an appropriate date here, adjust for granularity (hour/minute/second)
from generate_series(0, 23) n 
)
select c1.CalTime, t2.TaskName
from TODAY_CAL c1
left join TASKS t2
  on datepart('DOW', c1.CalTime) = t2.Repeat_Day
  and datepart('Hour', c1.CalTime) = t2.Repeate_Time