HealthSync_BE/design/데이터설계서 - Goal Service.txt

291 lines
9.1 KiB
Plaintext

!theme mono
skinparam classAttributeIconSize 0
skinparam classFontSize 12
skinparam classAttributeFontSize 11
title HealthSync 역설계 - Goal Service 데이터 설계서
package "Goal Service Database Schema" as goal_db #lightcoral {
entity "user_mission_goals" as user_mission_goal {
* goal_id : VARCHAR(50) <<PK>>
--
* user_id : VARCHAR(50)
* is_active : BOOLEAN
* created_at : TIMESTAMP
* updated_at : TIMESTAMP
--
+ 인덱스: idx_user_id_active
+ 인덱스: idx_created_at
}
entity "user_missions" as user_mission {
* id : BIGINT <<PK>>
--
* goal_id : VARCHAR(50) <<FK>>
* user_id : VARCHAR(50)
* mission_id : VARCHAR(50)
* mission_title : VARCHAR(200)
* mission_description : TEXT
* category : VARCHAR(50)
* difficulty : VARCHAR(20)
* estimated_time_minutes : INTEGER
* is_active : BOOLEAN
* current_streak_days : INTEGER
* total_completed_count : INTEGER
* start_date : DATE
* created_at : TIMESTAMP
* updated_at : TIMESTAMP
--
+ 인덱스: idx_goal_id
+ 인덱스: idx_user_id_active
+ 인덱스: idx_mission_id
+ 인덱스: idx_category
+ 인덱스: idx_start_date
}
entity "mission_progress" as mission_progress {
* id : BIGINT <<PK>>
--
* user_id : VARCHAR(50)
* mission_id : VARCHAR(50) <<FK>>
* completed_at : TIMESTAMP
* notes : TEXT
* earned_points : INTEGER
* consecutive_days : INTEGER
* created_at : TIMESTAMP
--
+ 인덱스: idx_user_mission_date
+ 인덱스: idx_completed_at
+ 인덱스: idx_mission_id
+ 인덱스: idx_earned_points
}
entity "mission_completion_history" as mission_completion_history {
* id : BIGINT <<PK>>
--
* user_id : VARCHAR(50)
* mission_id : VARCHAR(50)
* goal_id : VARCHAR(50)
* completion_date : DATE
* completion_time : TIME
* completion_status : VARCHAR(20)
* notes : TEXT
* earned_points : INTEGER
* streak_days_at_completion : INTEGER
* created_at : TIMESTAMP
--
+ 인덱스: idx_user_id_date
+ 인덱스: idx_mission_completion
+ 인덱스: idx_goal_id_date
}
note right of user_mission_goal
**사용자 목표 관리**
• 사용자별 목표 설정 단위
• 한 번에 하나의 활성 목표만 가능
• 목표 재설정 시 기존 목표 비활성화
• goal_id는 UUID 형태로 생성
end note
note right of user_mission
**사용자별 미션 정보**
• 목표에 포함된 개별 미션들
• Intelligence Service에서 추천받은 미션
• 최대 5개 미션까지 선택 가능
• 난이도별 포인트 차등 적용
• 연속 달성 일수 추적
end note
note right of mission_progress
**미션 수행 기록**
• 일별 미션 완료 기록
• 같은 날 중복 완료 방지
• 연속 달성 일수 계산 기준
• 포인트 적립 내역
end note
note right of mission_completion_history
**미션 완료 이력 (분석용)**
• 장기간 통계 분석용 테이블
• 사용자별 달성 패턴 분석
• 미션별 효과성 분석
• 시간대별 완료 패턴 추적
end note
}
package "관계 정의" as relationships {
user_mission_goal ||--o{ user_mission : goal_id
user_mission ||--o{ mission_progress : mission_id
user_mission ||--o{ mission_completion_history : mission_id
user_mission_goal ||--o{ mission_completion_history : goal_id
note as n1
**외래키 관계**
user_missions.goal_id → user_mission_goals.goal_id
mission_progress.mission_id → user_missions.mission_id
mission_completion_history.mission_id → user_missions.mission_id
mission_completion_history.goal_id → user_mission_goals.goal_id
**참조 무결성**
• CASCADE 업데이트
• RESTRICT 삭제 (이력 보존)
**논리적 관계**
• User Service users ↔ user_mission_goals (사용자별 목표)
• Intelligence Service ↔ user_missions (미션 추천)
• 한 사용자는 하나의 활성 목표만 보유
• 하나의 목표는 여러 미션을 포함
end note
}
package "데이터 타입 및 제약조건" as constraints {
note as n2
**user_mission_goals 제약조건**
• goal_id: UUID 형태, PRIMARY KEY
• user_id: User Service와 일치, NOT NULL
• is_active: DEFAULT TRUE
• 사용자당 활성 목표는 1개만 (UNIQUE 제약)
**user_missions 제약조건**
• id: AUTO_INCREMENT
• goal_id: NOT NULL, 존재하는 goal_id
• mission_id: Intelligence Service에서 제공
• mission_title: 최대 200자, NOT NULL
• category: 'EXERCISE', 'NUTRITION', 'STRESS_MANAGEMENT', 'SLEEP', 'PREVENTIVE_CARE'
• difficulty: 'EASY', 'MEDIUM', 'HARD'
• estimated_time_minutes: 1~180분 범위
• current_streak_days: 0 이상
• total_completed_count: 0 이상
• 목표당 최대 5개 미션 (체크 제약)
**mission_progress 제약조건**
• id: AUTO_INCREMENT
• user_id: NOT NULL
• mission_id: 존재하는 mission_id
• completed_at: NOT NULL
• earned_points: 0 이상
• consecutive_days: 1 이상
• 같은 날 같은 미션 중복 완료 방지 (UNIQUE 제약)
**mission_completion_history 제약조건**
• completion_status: 'COMPLETED', 'PARTIAL', 'SKIPPED'
• earned_points: 0 이상
• streak_days_at_completion: 0 이상
• completion_time: 00:00~23:59
end note
}
package "미션 카테고리 및 난이도" as mission_categories {
note as n3
**미션 카테고리별 예시**
**EXERCISE (운동)**
• 계단 오르기 10분
• 산책 30분
• 스트레칭 15분
• 홈트레이닝 20분
**NUTRITION (영양)**
• 물 8잔 마시기
• 금연하기
• 금주하기
• 건강한 간식 선택
**STRESS_MANAGEMENT (스트레스 관리)**
• 명상 10분
• 심호흡 연습
• 일기 쓰기
• 취미 시간 갖기
**SLEEP (수면)**
• 규칙적인 취침시간
• 11시 전 잠들기
• 수면 8시간 유지
• 카페인 섭취 줄이기
**PREVENTIVE_CARE (예방관리)**
• 혈압 측정하기
• 체중 기록하기
• 건강검진 예약
• 병원 방문하기
**난이도별 포인트**
• EASY: 10~20 포인트
• MEDIUM: 25~40 포인트
• HARD: 50~80 포인트
• 연속 달성 보너스: +5 포인트/일
end note
}
package "성능 및 운영 고려사항" as performance {
note as n4
**인덱스 전략**
• user_mission_goals: (user_id, is_active) 복합 인덱스
• user_missions: (user_id, is_active) 복합 인덱스
• mission_progress: (user_id, mission_id, DATE(completed_at)) 복합 인덱스
• mission_completion_history: (user_id, completion_date) 복합 인덱스
**파티셔닝**
• mission_progress: completed_at 기준 월별 파티셔닝
• mission_completion_history: completion_date 기준 월별 파티셔닝
**아카이빙**
• 1년 이상 된 mission_progress 데이터 아카이빙
• 비활성 목표 데이터는 history 테이블로 이관
**캐싱 전략**
• 활성 미션 목록: Redis 캐싱 (30분)
• 오늘 완료한 미션: Redis 캐싱 (실시간)
• 연속 달성 일수: Redis 캐싱 (6시간)
• 미션별 통계: Redis 캐싱 (1시간)
**배치 처리**
• 매일 자정에 연속 달성 일수 재계산
• 주간/월간 달성률 통계 생성
• 장기 미완료 미션 알림 발송
**모니터링 지표**
• 일일 미션 완료율
• 평균 연속 달성 일수
• 카테고리별 인기도
• 사용자별 참여율
• 목표 재설정 빈도
end note
}
package "데이터 분석 및 인사이트" as analytics {
note as n5
**사용자 행동 분석**
• 미션 완료 시간대 패턴
• 요일별 달성률 차이
• 연속 달성 중단 요인 분석
• 난이도별 지속 가능성
**미션 효과성 분석**
• 카테고리별 건강 개선 효과
• 직업군별 선호 미션 유형
• 연령대별 적합한 미션 난이도
• 계절별 미션 선호도 변화
**개인화 추천 개선**
• 과거 달성 패턴 기반 추천
• 유사 사용자 그룹 분석
• 실패 미션 유형 회피
• 성공 확률 높은 미션 우선 추천
**동기부여 전략**
• 포인트 시스템 효과성
• 연속 달성 보상 최적화
• 사회적 비교 효과 분석
• 축하 메시지 반응 측정
**KPI 지표**
• 월간 활성 사용자 수 (MAU)
• 평균 목표 지속 기간
• 미션 완료율 (전체/개인별)
• 사용자 리텐션율
• 건강 개선 지표 상관관계
end note
}