-
Notifications
You must be signed in to change notification settings - Fork 1
design ERD
Seoyoung Cho edited this page Jan 19, 2026
·
8 revisions
Current Version: v2 Database Type: PostgreSQL DBDiagram Link: https://dbdiagram.io/d/6954e82d39fa3db27bdeb888
아래는 Cherrish 프로젝트의 전체 데이터베이스 스키마입니다. DBDiagram.io 형식으로 작성되었으며, Core 도메인, Challenge 도메인, Demo 도메인으로 구성됩니다.
// Cherrish Project ERD
// Visit: https://dbdiagram.io
Project Cherrish {
database_type: 'MySQL'
Note: 'Cherrish 서버 데이터베이스 스키마'
}
// ===== Core Entities =====
Table users {
id bigint [pk, increment]
name varchar(50) [not null]
age int [not null]
created_at datetime [not null]
updated_at datetime
Note: '사용자 정보'
}
Table procedures {
id bigint [pk, increment]
name varchar(100) [not null]
category varchar(50) [not null]
min_downtime_days int [not null]
max_downtime_days int [not null]
created_at datetime [not null]
updated_at datetime
Note: '시술 정보 (마스터 데이터)'
}
Table worries {
id bigint [pk, increment]
content varchar(100) [not null]
created_at datetime [not null]
updated_at datetime
Note: '걱정거리 (마스터 데이터)'
}
// ===== Relationship Tables =====
Table user_procedures {
id bigint [pk, increment]
user_id bigint [not null, ref: > users.id]
procedure_id bigint [not null, ref: > procedures.id]
scheduled_at datetime [not null]
downtime_days int [not null]
recovery_target_date date
created_at datetime [not null]
updated_at datetime
Note: '사용자가 예약한 시술'
indexes {
(user_id, scheduled_at)
procedure_id
}
}
Table procedure_worries {
id bigint [pk, increment]
procedure_id bigint [not null, ref: > procedures.id]
worry_id bigint [not null, ref: > worries.id]
created_at datetime [not null]
Note: '시술별 관련 걱정거리 매핑 (M:N)'
indexes {
(procedure_id, worry_id) [unique]
}
}
// ===== Challenge Domain =====
Table challenges {
id bigint [pk, increment]
user_id bigint [not null, note: 'FK not mapped in JPA']
homecare_routine varchar(50) [not null, note: 'ENUM: HomecareRoutine']
title varchar(100) [not null]
is_active boolean [not null, default: true]
total_days int [not null, default: 7]
start_date date [not null]
end_date date [not null]
created_at datetime [not null]
updated_at datetime
Note: '7일 챌린지'
indexes {
user_id
(user_id, is_active)
start_date
}
}
Table challenge_routines {
id bigint [pk, increment]
challenge_id bigint [not null, ref: > challenges.id]
name varchar(100) [not null]
scheduled_date date [not null]
is_complete boolean [not null, default: false]
created_at datetime [not null]
updated_at datetime
Note: '챌린지 루틴 (일별 실천 항목)'
indexes {
(challenge_id, scheduled_date) [name: 'idx_challenge_scheduled']
(challenge_id, is_complete) [name: 'idx_challenge_complete']
}
}
Table challenge_statistics {
id bigint [pk, increment]
challenge_id bigint [not null, unique, ref: - challenges.id]
completed_count int [not null, default: 0]
total_routine_count int [not null]
cherry_level int [not null, default: 1]
version bigint [not null, default: 0, note: 'Optimistic Lock']
created_at datetime [not null]
updated_at datetime
Note: '챌린지 통계 및 진행률 (1:1)'
}
// ===== Demo Challenge Domain =====
Table demo_challenges {
id bigint [pk, increment]
user_id bigint [not null, note: 'FK not mapped in JPA']
homecare_routine varchar(50) [not null, note: 'ENUM: HomecareRoutine']
title varchar(100) [not null]
is_active boolean [not null, default: true]
total_days int [not null, default: 7]
start_date date [not null]
end_date date [not null]
current_virtual_date date [not null, note: '데모용 가상 날짜']
created_at datetime [not null]
updated_at datetime
Note: '데모 챌린지 (가상 날짜 진행 가능)'
indexes {
user_id
(user_id, is_active)
}
}
Table demo_challenge_routines {
id bigint [pk, increment]
demo_challenge_id bigint [not null, ref: > demo_challenges.id]
name varchar(100) [not null]
scheduled_date date [not null]
is_complete boolean [not null, default: false]
created_at datetime [not null]
updated_at datetime
Note: '데모 챌린지 루틴'
indexes {
(demo_challenge_id, scheduled_date) [name: 'idx_demo_challenge_scheduled']
(demo_challenge_id, is_complete) [name: 'idx_demo_challenge_complete']
}
}
Table demo_challenge_statistics {
id bigint [pk, increment]
demo_challenge_id bigint [not null, unique, ref: - demo_challenges.id]
completed_count int [not null, default: 0]
total_routine_count int [not null]
cherry_level int [not null, default: 1]
version bigint [not null, default: 0, note: 'Optimistic Lock']
created_at datetime [not null]
updated_at datetime
Note: '데모 챌린지 통계 (1:1)'
}
// ===== Table Groups =====
TableGroup core_domain {
users
procedures
worries
user_procedures
procedure_worries
}
TableGroup challenge_domain {
challenges
challenge_routines
challenge_statistics
}
TableGroup demo_domain {
demo_challenges
demo_challenge_routines
demo_challenge_statistics
}
Ref: "users"."id" < "challenges"."user_id"
Ref: "users"."id" < "demo_challenges"."user_id"
v1 - Initial ERD Design
// 1. 사용자 관리
Table users {
id bigint [pk, increment]
name varchar(50) [not null]
age int [not null, note: '한국 나이']
created_at datetime [not null, default: `CURRENT_TIMESTAMP`]
updated_at datetime [not null, default: `CURRENT_TIMESTAMP`]
}
// 2. 시술 관리
Table procedures {
id bigint [pk, increment]
name varchar(100) [not null, note: '레이저 토닝 등']
category varchar(50) [not null, note: '레이저, 보톡스/필러, 리프팅, 필링, 스킨케어']
min_downtime_days int [not null, default: 0]
max_downtime_days int [not null, default: 0]
created_at datetime [not null, default: `CURRENT_TIMESTAMP`]
updated_at datetime [not null, default: `CURRENT_TIMESTAMP`]
}
Table worries {
id bigint [pk, increment]
content varchar(100) [not null, note: '여드름/트러블, 색소/잡티 등']
}
Table procedure_worries {
id bigint [pk, increment]
procedure_id bigint [not null, ref: > procedures.id]
worry_id bigint [not null, ref: > worries.id]
created_at datetime [not null, default: `CURRENT_TIMESTAMP`]
}
Table user_procedures {
id bigint [pk, increment]
user_id bigint [not null, ref: > users.id]
procedure_id bigint [not null, ref: > procedures.id]
scheduled_at datetime [not null, note: '예약 날짜/시간']
downtime_days int [null, note: '개인 다운타임 (일)']
created_at datetime [not null, default: `CURRENT_TIMESTAMP`]
updated_at datetime [not null, default: `CURRENT_TIMESTAMP`]
}
Table care_messages {
id bigint [pk, increment]
date int [not null, note: '시술 후 날짜']
care_message varchar(100) [not null]
}
// 3. 캘린더 관리
Table important_events {
id bigint [pk, increment]
user_id bigint [not null, ref: > users.id]
title varchar(100) [not null, note: '웨딩 촬영, 여행, 면접 등']
scheduled_date date [not null]
created_at datetime [not null, default: `CURRENT_TIMESTAMP`]
updated_at datetime [not null, default: `CURRENT_TIMESTAMP`]
}
// 4. 챌린지 관리
Table challenges {
id bigint [pk, increment]
user_id bigint [not null, ref: > users.id]
homecare_routines_id bigint [not null, ref: > homecare_routines.id]
title varchar(100) [not null, note: '챌린지 제목']
is_active boolean [not null, default: true]
total_days int [not null, default: 7]
start_date date [not null]
end_date date [not null]
created_at datetime [not null, default: `CURRENT_TIMESTAMP`]
updated_at datetime [not null, default: `CURRENT_TIMESTAMP`]
}
Table challenge_statistics {
id bigint [pk, increment]
challenge_id bigint [not null, ref: > challenges.id]
completed_count int [not null, default: 0, note: '완료한 루틴 개수']
total_routine_count int [not null, note: '전체 루틴 개수']
created_at datetime [not null, default: `CURRENT_TIMESTAMP`]
updated_at datetime [not null, default: `CURRENT_TIMESTAMP`]
}
Table beauty_directions {
id bigint [pk, increment]
content varchar(100) [not null, note: '전체적으로 밝아보이게, 톤 개선 등']
created_at datetime [not null, default: `CURRENT_TIMESTAMP`]
}
Table challenge_beauty_directions {
id bigint [pk, increment]
challenge_id bigint [not null, ref: > challenges.id]
direction_id bigint [not null, ref: > beauty_directions.id]
created_at datetime [not null, default: `CURRENT_TIMESTAMP`]
}
Table homecare_routines {
id bigint [pk, increment]
content varchar(100) [not null, note: '피부 컨디션, 회복·다운타임 케어 등']
created_at datetime [not null, default: `CURRENT_TIMESTAMP`]
}
Table challenge_routines {
id bigint [pk, increment]
challenge_id bigint [not null, ref: > challenges.id]
name varchar(100) [not null, note: '루틴명']
scheduled_date date [not null, note: '루틴 예정일']
is_complete boolean [not null, default: false, note: '완료 여부']
created_at datetime [not null, default: `CURRENT_TIMESTAMP`]
updated_at datetime [not null, default: `CURRENT_TIMESTAMP`]
}