-
반복 일정 설계공부/Database 2023. 7. 3. 23:09
일정 관리 앱 개발을 하면서 어려움을 느꼈던 부분이 ERD 설계에서 일반 일정은 괜찮으나, 반복적인 일정은 어떻게 설계를 해야할지 어려웠다.
어떤 방식으로 설계를 하는게 좋은지, 계속 생각을 하고 다른 분들이 설계했던 부분들을 참고하기도 했다.
물론 어떤 방식이 100%답이다고 말하고 있지 않지만, 어떻게 설계하고 사용하는지 중요하다는 것을 깨달았다.
정말 많은 사람들이 내가 생각하는 부분의 고민을 가지고 있었다는 사실을 알게 되었다.
1. 일정, 반복 테이블 각각 분리 하였다.(schedule: 일정, repeat: 반복)
2. 일정 테이블은 일정과 관련된 부분만 값을 가지도록 하며, 반복은 반복에 필요한 부분들만 설계하였다.
일정 테이블 Table Schedule { id int [pk, increment] // auto-increment user int // 유저 id title varchar // 일정 제목 memo text // 일정 메모 start_date date // 시작 날짜 end_date date // 종료 날짜 alarm_time timestamp // 알람 시간 }반복 테이블 Table Repeat { id int schedule int // 스케줄 id repeat_type varchar // 반복 유형 ('W','매주 특정 요일 or 주중'),('M','매월 특정 날짜'),('Y','매년'),('D','매일'), repeat_day varchar // 반복일 }- 반복일은 repeat_type에 따라 달라진다고 보면 된다.
더보기repeat_type이 'Y'일 때 '7-13'을 입력하여 월과 일을 등록하였다.
repeat_type이 'M'일 때 '13' 숫자를 등록하여, 매달 13일에 일정을 한다.repeat_type이 'W'일 때 일(0), 월(1), 화(2), 수(3), 목(4), 금(5), 토(6), 주중(7)repeat_type이 'D'일 때 Null 값을 전달하였다.3. 반복 테이블은 일정 테이블의 id를 외래키로 가지는 구조로 설계한다.
설계는 마쳤지만, 반복적인 부분을 어떻게 해야 할지 고민을 많이 했다. 그때 python에서 dateutil 라이브러리를 알게 되었고, 실제로 적용까지 할 수 있었다.
# 사용법
더보기def repeat_list(obj):
if obj.repeat_type == 'Y':
month= obj.repeat_day[0:2]
day = obj.repeat_day[3:5]
return list(rrule(YEARLY,count=1,bymonth=int(month),bymonthday=(int(day)),dtstart=parse(str(obj.start_date))))
if obj.repeat_type == 'M':
return list(rrule(MONTHLY,count=1,bymonthday=(int(obj.repeat_day)),dtstart=parse(str(obj.start_date))))
if obj.repeat_type == 'W':
weekday = [SU,MO,TU,WE,TH,FR,SA,(MO,TU,WE,TH,FR)]
return list(rrule(WEEKLY,wkst=SU,byweekday=(weekday[int(obj.repeat_day)]),dtstart=parse(str(obj.start_date)),until=parse(str(obj.end_date))))
if obj.repeat_type == 'D':
return list(rrule(DAILY,dtstart=parse(str(obj.start_date)),until=parse(str(obj.end_date))))설정된 기간까지의 원하는 일자를 전달 할 수 있었다.
Ref.
https://dateutil.readthedocs.io/en/stable/examples.html#rrule-examples
https://okky.kr/questions/1209733
https://www.phpschool.com/gnuboard4/bbs/board.php?bo_table=qna_db&wr_id=124295
https://okky.kr/questions/350584
https://vertabelo.com/blog/again-and-again-managing-recurring-events-in-a-data-model/
https://www.erdcloud.com/d/dgngeD9jG6qDguzmh
- 어떤 문제를 해결하기 위해 검색하고 블로그에 작성한 글입니다. 부족한점이 많지만 틀린점이나 부족한점이 있다면 말씀해주시면 감사하겠습니다.
'공부 > Database' 카테고리의 다른 글
[PostgreSQL] PERCENTILE_CONT 함수를 이용한 중앙값 계산 (0) 2025.05.06 [SQL] FK를 이용하여 여러 Row data를 컬럼과 값으로 Group by 하려면..... (0) 2024.02.27 MongoDB - 배열 식별자를 통한 다중 update(feat.arrayFilters) (0) 2022.10.24 ORM(Object Relational Mapping) (0) 2021.12.24 MySQL 데이터 추가, 수정, 삭제 (0) 2021.09.01