반복적 인 달력 작업을 데이터베이스에 어떻게 저장해야합니까?


14

소규모 관리를위한 소규모 개인 프로젝트 용입니다. 기본적으로 다음과 같은 SQLite3 데이터베이스에 작업을 저장합니다.

    id INTEGER PRIMARY KEY AUTOINCREMENT
    label TEXT
    deadline INTEGER

따라서 각 작업에는 마감 시간 (마감일)이 있으며 유닉스 타임 스탬프로 저장됩니다. 지금까지는 "내일 : 할머니 방문"과 같은 항목을 수행 할 수 있으며 레이블로 "할머니 방문"을 사용하여 새 행을 작성하고 내일은 마감일의 유닉스 시간으로 변환합니다.

이제 새로운 유형의 작업을 입력하고 싶습니다 : 루틴- "매일 : 깨끗한 부엌"과 같은 시간 패턴으로 반복되는 작업. 그러한 작업을 어떻게 저장하거나 모델링 할 수 있습니까?

현재 매일 수행 해야하는 작업의 경우 동일한 레이블을 가진 테이블에 새 행을 생성하고 마감일 필드를 하루 씩 늘려야한다고 생각합니다. 이 경우 앞으로 한도를 수정해야합니다. 예를 들어, 매일 루틴을 만들면 남은 해마다 매일 새 행을 만듭니다.

더 간단한 방법이 있습니까? 명확한 데이터베이스 디자인 원칙이 누락 되었습니까?


3
예. 또 다른 작업 스케줄러를 발명하는 대신 적절한 스케줄러 도구를 사용하십시오. SOPA 항의가 끝나면 en.wikipedia.org/wiki/Open_Source_Job_Scheduler를 읽으십시오 . 이것은 이미 많은 시간 동안 훌륭하게 해결되었습니다.
S.Lott

감사합니다 로트! 예, 이것에 대한 우아한 해결책이 있다고 의심했습니다! SOPA 끝을 기다리거나 다른 Wikipedia 국가에서 번역이 있는지 확인하십시오. 실제로 HTML 소스가 Wikipedia US에서 여전히 사용 가능하다는 것을 알았습니다. 블랙 아웃 화면은 CSS 트릭과 같습니다. :) 작은 그리스 몽키 스크립트 방법
프랑수아ッ베스파 ت

1
일반적인 참고 사항 : 아래의 대부분의 게시물은 데이터가 실제로 저장되는 방법에 대한 질문을 고려하지 않습니다. 나는 2 년 동안 매주 월요일마다 반복되는 작업이 주어지면 디스크에 몇 개의 행을 작성해야합니까?
NoChance

또는 이 답변을 참조하십시오 .
Kris Harper

@ root45의 좋은, 나는 실제로 명령 줄에서 살쾡이를 사용하여보다 쉽게 :)
프랑수아ッ베스파 ت

답변:


7

반복 할 별도의 테이블을 만들 수 있습니다. 그러나 솔직히 나는 Jut을 Type Field가있는 동일한 테이블에 넣을 것입니다.

이 같은:

ID - Int Pk

TaskDescription - TEXT

Type - Text - (Re-Occurring, or Single Occurrence) 

Due- TimeStamp - for Single Occurrence is the Date time

LastTimeCompleted - Time Stamp

ReoccurringUnit - Text - "Days", Weeks, Month, Ext

ReoccurringEveryX - Int - Reoccurring interval 

흥미롭게도, 실제로 이것과 비슷한 가능한 해결책을 모색하고 있습니다. 저는 여전히 SQL 기능을 사용하고 있습니다. 성공하면 게시하겠습니다
François ッ Vespa ت

흥미롭게도 되풀이되는 작업과 되풀이되지 않는 작업을 모두 가져온 다음 마감 날짜별로 정렬 할 수있는 쿼리를 만들려고합니다. 실마리?
Harshal Patil

2

S.Lott의 의견 외에도 Martin Fowler- 달력에 대한 되풀이 이벤트 PDF가 도움이 될 수 있습니다 (약간 어려웠습니다).

또한 여러 UI 도구는 간단한 작업 모델을 사용하여 즉시 설명하는 기능을 제공합니다. 이 도구가 없으면 데이터베이스 디자인 문제를 해결하기가 어렵다고 생각합니다.


1

내 관점에는 두 가지 옵션이 있습니다.

  • 반복되는 항목에 대해 많은 양의 동일한 행을 저장하십시오. 그러나 종료 날짜 또는 유한 항목 수를 통해 끝나야하며 반복 항목으로 표시되어야합니다. 이벤트를 변경하면 모두 업데이트해야하지만 한 번 이탈하려는 경우 한 이벤트 간의 연결을 '끊고'일반적인 이벤트로 만들 수 있습니다.
  • 특정 반복 구성표를 사용하여 이벤트를 반복 항목으로 저장하고 주어진 날짜에 대해 반복 항목이 예정된 특정 날짜에 대해 계산하십시오. 이것은 무한 반복 가능성을 제공합니다.

그것이 내가 보는 방법입니다
François ッ Vespa ت

1

이것이 개인 프로젝트이고 작업을 저장하는 방법을 원한다면 권장합니다. TaskCoach를 합니다 . 데스크톱 응용 프로그램, 다중 플랫폼, 오픈 소스이며 시작하기 쉽고 정말 좋은 기능을 제공합니다.

작업 응용 프로그램을 개발하는 경우 가장 반복적 인 방법은 각 반복 작업에 대해 새 행을 추가하는 것입니다. 논리는 각 작업 자체가 별도의 엔터티이며 다음 날 같은 작업을 시작하기 전에 완료해야합니다. 증분 만하면 작업 기록을 캡처 할 수 없습니다.

몇 가지 작업이 완료되지 않은 경우 큰 목록을 제공한다고 생각되는 경우 되풀이 작업이 완료되면 이벤트를 트리거하여 작업이있을 때만 새 작업이 새 행으로 생성되도록 할 수 있습니다 완료로 표시되었습니다. Morons가 제안한 것처럼 원본 테이블의 반복 작업에 대한 플래그가있는 별도의 테이블을 반복 데이터 (일, 주, 반복 시간)와 함께 사용하여 반복 작업을 생성 할 수있는 간단한 스크립트를 만들 수 있습니다. 날짜 또는 조건 또는 레이블.

그러나 작업이 매일 브러시와 같은 변경없이 확실하게 반복되는 작업이고 광범위한 추적이 필요하지 않다면 다음 구조를 시도하면됩니다.

  • 되풀이 플래그-작업이 되풀이되고 있음을 나타냅니다.
  • 되풀이 기간-일, 주, 월
  • 작성된 태스크 수-반복 기간에 따라 태스크가 증가합니다. 따라서 오늘 작업이 시작되고 하루의 반복 기간이 있으면 내일 1 씩 증가합니다.
  • 완료된 작업 수-작업이 완료되면 증가합니다.

논리는 작업이 항상 완료된 경우 완료된 작업과 생성 된 작업 간의 차이가 항상 되풀이 기간이어야한다는 것입니다. 따라서 일의 차이를 반복 기간으로 나누면 작업이 얼마나 오래 보류되었는지를 알 수 있습니다.

이것을 지적 해준 Kareem에게 감사합니다

IMHO는 작업 응용 프로그램을 대규모로 구축하기가 어렵습니다.


건설적인 답변에 감사드립니다! 이것은 재미를위한 프로젝트이며 '수요일 인 경우를 제외하고 4 일마다 반복되는'과 같은 쿼리를 사용하여 최대한 유연하게 만들고 싶습니다.
François ッ Vespa

1

지금까지 가장 빈번한 작업은 일정 기간 동안 발생하는 모든 이벤트를 나열하는 것입니다. 따라서 간단한 SQL 쿼리로 질문에 대답 할 수 있도록 데이터를 최적화하십시오. 두 개의 테이블을 만듭니다.

CREATE TABLE events(start TIMESTAMP, end TIMESTAMP, name TEXT, user_id LONG,
                    recurrence_id LONG, ...);
CREATE TABLE recurrences(id LONG, start TIMESTAMP, end TIMESTAMP, name TEXT, 
                         frequency ...);

시작 및 종료 시간별로 이벤트 테이블을 색인화하십시오. 그러면 모든 쿼리가 이벤트 테이블에서 매우 빠르게 응답 될 수 있습니다. 반복이 편집되면 해당하는 모든 이벤트를 삭제하고 다시 작성하십시오.

이 조언은 Tom Kite의 책에서 뻔뻔스럽게 반복됩니다.


1

반복되는 작업에는 시작 날짜와 종료 날짜가 있어야합니다. 단일 날짜 작업의 경우 날짜가 같습니다.

당신이 원하는만큼 미래에 당신의 필요의 시작부터 관련이 있다고 생각하는 매일 하나의 레코드를 가진 일종의 "날짜"테이블을 생성하십시오 : 12/31/2100 예를 들어 당신의 형식으로 변환하십시오.

쿼리는 다음과 같습니다.

Select 
  t.id
  , t.label
  , d.UnixDate
from Tasks as t
inner join Dates as d
on d.UnixDate >= t.StartDate
  and d.UnixDate <= t.EndDate
where t.id = [ID Param]

0

필자는 몇 년 전에 Windows 작업 스케줄러와 같은 인터페이스를 구현했으며 기본적으로 작업을 예약 해야하는 요일이 포함 된 StartDate, EndDate (널일 수 있음), StartTime 및 RecurringDays가있는 각 작업에 대해 수행했습니다.


그 흥미 롭군요. 설계 한계, 즉 수행 할 수없는 쿼리 (예 : '매주 반복')가 있습니까?
François ッ Vespa

0

두 가지 테이블을 사용할 수 있습니다. 하나는 작업 설명 용이고 다른 하나는 상태 (완료 / 완료되지 않은 것 및 기타 정보 : 소요 시간, 종료 상태, 로그 파일 위치 등)입니다. 설명 테이블에는 다음이 포함됩니다. 작업 이름, 작업을 수행 할 날짜 또는 빈도 : 작업 당 하나의 행만 있습니다. 매일 프로세스가 설명 테이블에서 오늘 수행 할 작업의 상태 테이블을 채 웁니다 (일주일 또는 한 달 전에 미리 채울 수 있음).

상태 테이블을 프로그래밍 방식으로 생성하면 빈도에 원하는 모든 유연성이 제공됩니다 (예 : "국가 X의 공휴일을 제외한 모든 요일"-문자열로 저장할 수도 있음). 상태 테이블을 사용하면 작업이 실패하는 빈도 또는 빈도를 확인할 수 있습니다 (예 : "매일 실행해야하는데 시간이 얼마나 걸렸습니까?").

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.