2011-01-10 3 views
3

나는 이벤트 캘린더를 만들고있다. 기본 기능은 다음과 같습니다.이벤트 캘린더의 데이터 모델을 최적화하는 방법은 무엇입니까?

매일 3 가지 상태, "사용 가능", "사용할 수 없음"및 "확인 필요"가 있습니다. 매일을 단일 상태 (즉, 이벤트)로 설정할 수 있습니다. 각 이벤트는 매주 또는 매달 반복되거나 전혀 반복되지 않도록 설정할 수 있습니다.

각 일정은 개체에 따라 다릅니다 (각 개체에는 고유 한 일정이 있습니다).

캘린더에는 "종료 날짜"가 없습니다. 미래의 특정 날짜에 일정이있을 수 있습니다.

상상 데이터 모델이되었다 :

Table: Calendar 
id 
user_id 

Table: Status 
id 
label 

Table: Event 
id 
calendar_id 
start_date 
status_id 
recurring -- enum type: NULL, W, or M for weekly or monthly 

이 데이터를 저장하는 매우 우아한 방법이 될 것 같다,하지만 난 검색 걱정 :에 대한 상태를 얻을 상당히 복잡 할 것 주어진 하루.

더 나은 방법이나 표준 방법이 있습니까?

+0

nullable bool 상태로 충분하지 않았습니까? 또는 나중에 다른 주를 추가 할 수있는 가능성을 예약 하시겠습니까? –

+0

예, 일부 다른 주에서 나중에 올 수 있습니다. – jihi

답변

2

그 날을 start_date라고 가정하고 (그렇지 않으면 오해 한 것 같습니다.) 형식이 나에게 나쁜 것 같지 않습니다. 나중에 어쩌면 시작/종료 날짜가 있어야하고 시작/종료 시간이 필요할 수도 있습니다.이 경우 시간 소인을 입력해야합니다.

+------------+ 
| cday (PK) | 
+------------+ 
| ...  | 
| 2011-01-01 | 
| 2011-01-02 | 
| 2011-01-03 | 
| 2011-01-04 | 
| 2011-01-05 | 
| 2011-01-06 | 
| ...  | 
+------------+ 

주어진 기간 (사용 가능) 상태 A의 약속을받을 필요가 있다면, 당신은 할 수 있습니다 :

데이터를 검색하기 위해, 나는 같은 날짜 테이블을 만든 것

CREATE FUNCTION CHECK_RECCUR(cday DATE, start_date DATE, recurring CHAR(1)) 
BEGIN 
    IF cday < start_date 
    THEN RETURN FALSE 
    END IF; 
    SET dformat = CASE recurring 
    WHEN 'W' THEN '%W' 
    WHEN 'M' THEN '%d' 
    WHEN 'Y' THEN '%m-%d' 
    ELSE '' 
    END; 
    RETURN (DATE_FORMAT(cday, dformat) == DATE_FORMAT(start_date, dformat)); 
END 
; 
012,351 :

SELECT ev.* 
FROM cdays AS cd 
JOIN event AS ev ON (
    CHECK_RECCUR(cd.cday, ev.day, cd.recurring) 
) 
WHERE TRUE 
    AND cd.cday BETWEEN "given_start" AND "given_end" 
    AND ev.day < "given_end" 
; 

CHECK_RECCUR (같은)는 그런 cday가 reccurence의 범위에 있는지를 확인하는 기능 것

테스트되지 않았지만 이것이 내가하는 일입니다.

관련 문제