작업 스케줄링 데이터베이스 디자인

질문:

나는 규정된 시간과 일수 내에 중복 집행해야 하는 임무가 있다.예를 들어, 작업 A는 월요일 오후 1시, 2시 및 3시, 금요일 오후 2시, 8시 및 11시에 수행해야 합니다.임무 B는 월요일 새벽 4시에 수행해야 한다.기본적으로 모든 임무는 언제든지 집행할 수 있다.만약 현재 시간의 모든 임무가 이미 집행되었다면, 우리는 다시 모든 임무를 집행할 것이다.그래서 시간당 우선순위 대열과 같다.
저는 Postgres를 사용하고 있습니다. 지금은 JSONB 시설입니다.나는 임무와 관련된 정보와 시간표를 포함하는 표tasks를 가지고 있다.각 작업의 계획은 다음과 같습니다.
{
  "Mo": [
    1,
    2,
    3
  ],
  "Fr": [
    4,
    5,
    6
  ]
}
그러나 나는 json이 강한 유형이 아니라는 것을 좋아하지 않는다. 임무를 선택한 검색은 보기에 매우 보기 흉하고 검색의 성능이 더욱 좋을 것이라고 생각한다.
나는 매주 매시간, 예를 들어 시간과 테이블을 저장하고 시간 id와 관련된 작업 id를 저장하는 테이블을 만들 수 있다고 생각한다.작동은 가능하지만 스토리지 공간은 매우 형편없는 것 같습니다. (현재 작업 양은 약 10만 개에 달하며 계속 증가하고 있습니다.)
그래서 나는 어떻게 이런 상황을 위해 데이터베이스를 정확하게 설계하는지 알고 싶다.

답안

네, 전체 달력이 아닌 작업을 저장해야 합니다. (데이터를 추출할 때 달력을 동적으로 만듭니다.)
각 이벤트/작업에 대해 시작 날짜 및 기간 또는 종료 날짜 시간을 저장해야 합니다.
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