291 lines
9.1 KiB
Plaintext
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
|
|
} |