gpt4 book ai didi

sql - 任务调度的数据库设计

转载 作者:行者123 更新时间:2023-11-29 13:50:38 30 4
gpt4 key购买 nike

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

我正在使用 Postgres,现在它是 JSONB 工具。我有表 tasks,其中包含与任务相关的信息和时间表。每个任务的时间表看起来像这样:

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

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

我想可能是我创建了一个表,我在其中存储了一周中的每个小时,例如,小时和表执行,我在其中存储了与小时 ID 相关的任务 ID。可以工作,但它似乎对存储空间非常不利(目前任务量约为 100000 并且还在增长)。

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

最佳答案

好的,您需要存储任务,而不是完整的日历(提取数据时即时创建日历)...

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

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

关于sql - 任务调度的数据库设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41695303/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com