Skip to content

design ERD

Seoyoung Cho edited this page Jan 19, 2026 · 8 revisions

Cherrish ERD

Current Version: v2 Database Type: PostgreSQL DBDiagram Link: https://dbdiagram.io/d/6954e82d39fa3db27bdeb888


ERD Diagram

스크린샷 2026-01-20 오전 12 19 07

Database Schema

아래는 Cherrish 프로젝트의 전체 데이터베이스 스키마입니다. DBDiagram.io 형식으로 작성되었으며, Core 도메인, Challenge 도메인, Demo 도메인으로 구성됩니다.

Schema Definition

  // 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"

Version History

v1 - Initial ERD Design

ERD Diagram (v1)

image

Schema (v1)

// 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`]
}

Clone this wiki locally