2012-04-25 3 views
1

프런트 엔드로 FullCalendar를 사용하는 캘린더 시스템을 구축 중입니다. 백엔드는 MySQL/PHP가 될 것입니다.iCal 백엔드 - 되풀이 날짜

응용 프로그램에서 생성 및 삽입 한 사용자의 공개 약속 목록을 저장합니다. 이 임명은 같은 날에 시작하고 끝낼 단일 사건이 될 것입니다. 또한 사용자는 개인적인 약속으로 인해 달력에서 사용할 수 없음을 표시 할 수 있습니다. 이 후자의 기능을 사용하려면 되풀이 이벤트를 사용해야합니다. 휠을 다시 발명하기보다는 iCal을 기반으로 한 구조를 사용하고 있습니다. 이 게시물은 데이터베이스 구조를 결정할 때 매우 도움이되었습니다 ical-field-list-for-database-schema-based-on-ical-standard.

저는 개인/단발 약속을 저장하기 위해 필요한 데이터를 입력 할 수있는 신청서 양식을 만들었습니다. 양식을 제출하면 Ajax를 통해 서버로 데이터가 전송됩니다. 나는 네이티브 형식이나 RRULE을 사용하여 사용자가 입력 한 매개 변수를 기반으로 되풀이 날짜 배열을 생성하는 훌륭한 PHP 스크립트를 발견했습니다.

이 반복 날짜를 저장/검색하는 가장 좋은 방법은 무엇인지 알 수 없습니다. 응용 프로그램은 공용 및 개인 날짜를 포함하여 사용자에 대한 일정보기를 렌더링 할 수 있어야합니다. 응용 프로그램은 또한 주어진 시간/날짜 기간 동안 무료 일 수있는 모든 사용자를 반환 할 수 있어야합니다.

모든 이벤트를 iCal 형식으로 저장하고 필요에 따라 이벤트를 검색하는 것으로 충분합니까? 예상 할 수있는 문제는 반복되는 이벤트를 매개 변수를 즉시 확장해야하므로 쉽게 검색 할 수 없다는 것입니다. 나는 그것을 생성 한 원래의 RRULE에 대한 참조를 가진 모든 개별 이벤트 (생성 된)의 두 번째 테이블을 만드는 것을 고려하고 있었다. 앞으로 100 년 동안 매일 사용자가 이벤트에 참가할 수 없도록하기 위해 사용자가 입력 할 수있는 되풀이 날짜 수를 제한하려고합니다! 나는이 접근법이 반복적 인 규칙에 의해 원래 생성 된 개별 사건을 편집 할 것이라고 생각한다.

좋은 접근 방법입니까 아니면 더 좋은 방법입니까?

다음
CREATE TABLE RecurringAppointments (
    startdate DATE NOT NULL, 
    enddate DATE, 
    freq  INT NOT NULL, -- contains #days between each occurrence 
    -- etc. 
) 

가 주어진 thedate에서 발생하는 이러한 모든 약속을 가져올 : 다음과 같은 라인을 따라 테이블에 대해 어떻게

답변

1

when building a calendar app, should i store dates or recurrence rules in my database?에서보세요.

유효성 정보와 관련된 rrule, exrule, rdate 및 exdate를 저장해야합니다. 시간 경과에 따른 변경 사항을 추적하려면 사용자가 특정 이벤트가 발생했을 때 과거를 되돌아보고 싶을 수도 있고 occurence와 발생 시각이 바뀌었을 때), 유한 발생 횟수가있는 이벤트의 경우보다 쉬운 쿼리를 위해 시간 창에 대한 시작과 끝의 사전 계산을 수행하고 당신은 테이블에 모든 사건이 발생했습니다. 사용자가 시간 창 (나중에 1 년 이상 또는 1 년 이상보고있는 사람을 갖는 경우는 드물다)에서 사용자가 발생하는 시간을 찾으면 사용자가 요청한 시간 창에 해당하는 관련 이벤트를 계산하여 즉시 생성합니다 .

+0

이 사이트를 검색했지만 많은 유용한 정보가 담긴 링크 된 페이지를 찾지 못했습니다. - 감사합니다. 나는 2 테이블 접근법이 정확하다고 생각한다. 하나는 사건 테이블을 생성하는 rrule을위한 것이다. 끝나지 않는 (또는 장기간에 걸친) 이벤트와 그 이벤트를 제한 할 것인지 또는 주기적으로 확장 할 것인지에 대한 생각을해야 할 것입니다 (아마 cron 작업 일 것입니다). 달력은 달력을 만든 사용자 만 사용할 수있는 것이 아니며 시스템에서 '빈 슬롯'을 찾기 위해 쿼리해야하므로 관련 시간 프레임을 다루는 모든 사용자에 대해 달력을 완전히 확장해야합니다 (에스). – Dave

1

SELECT * FROM RecurringAppointments 
WHERE 
     thedate BETWEEN startdate AND enddate 
    AND DATEDIFF(thedate, startdate) % freq = 0; 
+0

답장을 보내 주셔서 감사합니다. 귀하의 예를 사용합니다. 나는 추가 테이블을 갖는 개념과 이것이 올바른 접근법인지 여부에 더욱 관심이있다. iCal에는 많은 예제가 있지만 이벤트를 관리하는 가장 좋은 방법은 많지 않습니다. – Dave

+0

iCal은 시스템 간의 캘린더 데이터 교환에 적합한 형식이지만 캘린더 데이터를 시스템 내에 구성하는 데 가장 적합하지 않다고 생각하십니까? 위의 기술을 별도의 테이블로 구현하든 더 일반적인'Appointments' 테이블에 추가 할 것인지는 전적으로 당신에게 달려 있습니다. – eggyal

+0

귀하의 회신이 감사되었지만, iCal 형식 및 일정표 시스템에 대한 RRULES 사용에 관한 질문과 두 번째 표가 필요 (필요했는지) 여부, 그리고 내 생각과 접근 방식에 대한 질문에 실제로 대답하지 않았습니다. 실제로 좋은 생각이었습니다 .FyI iCal 및 RRULES 형식을 사용하여 미래 날짜 목록을 생성하기로 결정했습니다. 그런 다음 별도의 테이블에 저장됩니다. 복잡성은 사용자가 시퀀스의 일부 또는 모든 날짜를 업데이트하려고 할 때 발생합니다. – Dave