A Free Database Designer for Developers and Analysts

Table user {
  id int [pk, increment, note: '유저 고유 ID']
  nickname varchar [note: '유저 닉네임']
  cooking_level varchar [note: '요리 실력 (초보자, 숙련자, 전문가)']
  household_type varchar [note: '가구 형태 (1인 가구, 2인 가구, 3인 이상, 기타)']
  job varchar [note: '직업 (학생, 주부, 직장인, 무직, 자영업자, 기타)']
  social_login_id int [ref: > social_login.id, note: '소셜 로그인 정보 참조']
  created_at datetime [note: '생성일시']
  updated_at datetime [note: '수정일시']

  note: '유저 테이블'
}

Table social_login {
  id int [pk, increment, note: '소셜 로그인 고유 ID']
  type varchar [note: '소셜 로그인 제공자 (카카오, 네이버, 애플 등)']
  sid varchar [note: '소셜 제공자가 발급한 고유 식별자']
  created_at datetime
  updated_at datetime

  note: '소셜 로그인 정보 테이블'
}

Table recipe {
  id int [pk, increment, note: '레시피 고유 ID']
  title varchar [note: '레시피 제목']
  description text [note: '레시피 간단 소개']
  duration varchar [note: '소요 시간 (ex. 30분, 1시간 등)']
  level varchar [note: '난이도 (초급, 중급, 고급)']
  main_ingredients text [note: '메인 재료 (쉼표로 구분된 태그 형태)']
  seasoning text [note: '조미료 (쉼표로 구분된 태그 형태)']
  type varchar [note: '레시피 타입 (simple, step-by-step)']
  views int [note: '조회수']
  created_by int [ref: > user.id, note: '레시피 작성자 참조']
  main_category_id int [ref: > main_category.id, note: '상위 카테고리 참조']
  sub_category_id int [ref: > sub_category.id, note: '하위 카테고리 참조']
  created_at datetime
  updated_at datetime

  note: '레시피 테이블'
}

Table recipe_image {
  id int [pk, increment, note: '레시피 이미지 고유 ID']
  recipe_id int [ref: > recipe.id, note: '레시피 참조']
  image_url varchar [note: '레시피 이미지 (S3 경로 등)']
  created_at datetime
  updated_at datetime

  note: '레시피 완성 사진 테이블'
}

Table main_category {
  id int [pk, increment, note: '메인 카테고리 고유 ID']
  name varchar [note: '메인 카테고리 이름 (ex. 든든한 한 끼, 건강식 등)']
  created_at datetime
  updated_at datetime

  note: '레시피의 상위 카테고리 테이블'
}

Table sub_category {
  id int [pk, increment, note: '서브 카테고리 고유 ID']
  main_category_id int [ref: > main_category.id, note: '메인 카테고리 참조']
  name varchar [note: '서브 카테고리 이름 (ex. 밥, 국/탕 등)']
  created_at datetime
  updated_at datetime

  note: '레시피의 서브 카테고리 테이블'
}

Table recipe_reservation {
  id int [pk, increment, note: '레시피 예약 고유 ID']
  user_id int [ref: > user.id, note: '예약한 유저 참조']
  recipe_id int [ref: > recipe.id, note: '예약된 레시피 참조']
  reservation_time datetime [note: '알림 예약 시간']
  status boolean [note: '알림 전송 여부 (true = 전송됨)']
  created_at datetime
  updated_at datetime

  note: '레시피 해먹기 예약 테이블'
}

Table search_list {
  id int [pk, increment, note: '검색 기록 고유 ID']
  user_id int [ref: > user.id, note: '검색한 유저 참조']
  keyword varchar [note: '검색어']
  created_at datetime
  updated_at datetime

  note: '유저의 최근 검색어 테이블'
}

Table total_search_list {
  id int [pk, increment, note: '인기 검색어 고유 ID']
  rank int [note: '해당 날짜 기준 순위']
  keyword varchar [note: '검색어']
  search_count int [note: '해당 날짜 기준 검색 횟수']
  date date [note: '기준 날짜']
  created_at datetime
  updated_at datetime

  note: '전체 인기 검색어 테이블(우선 Redis에서 갖고 있다가 배치 업데이트)'
}

Table simple_content {
  id int [pk, increment, note: '간단 레시피 콘텐츠 고유 ID']
  text text [note: '단순 텍스트 형태의 요리 설명']
  recipe_id int [ref: > recipe.id, note: '레시피 참조']
  created_at datetime
  updated_at datetime

  note: '레시피 타입이 simple일 경우, 내용을 저장하는 테이블'
}

Table step_by_step_content {
  id int [pk, increment, note: '단계별 콘텐츠 고유 ID']
  order int [note: '단계 순서']
  text text [note: '해당 단계 설명']
  recipe_id int [ref: > recipe.id, note: '레시피 참조']
  created_at datetime
  updated_at datetime

  note: '레시피 타입이 step-by-step일 경우 단계별 내용 저장'
}

Table step_image {
  id int [pk, increment, note: '단계 이미지 고유 ID']
  step_id int [ref: > step_by_step_content.id, note: '단계 콘텐츠 참조']
  image_url varchar [note: '단계별 이미지 URL (여러 장 가능)']
  created_at datetime
  updated_at datetime

  note: 'step-by-step 레시피 단계에서 사용된 사용된 이미지들 저장 테이블'
}

## 북마크 테이블 추가
## 리뷰 테이블 추가: 댓글, 별점 준다고 생각했고 (레시피에도 별도로 저장)

## 커먼 코드 추가: 
Table common_code_group {
  group_code varchar(3) [pk, note: '코드 그룹 (예: C01, H01, J01)']
  group_name varchar(30) [note: '그룹 이름 (예: COOKING_LEVEL, JOB)']
  remark varchar(100) [note: '설명 또는 비고']
  use_yn char(1) [note: '사용 여부(Y/N)']
  created_at datetime [note: '생성일시']
  updated_at datetime [note: '수정일시']
  created_by varchar(20) [note: '생성자']
  updated_by varchar(20) [note: '수정자']

  note: '공통 코드 그룹 테이블'
}

Table common_code {
  code varchar(6) [pk, note: '전역 유일 6자리 코드값 (예: C01001, H01002)']
  group_code varchar(3) [ref: > code_group.group_code, note: '코드 그룹 참조']
  name varchar(20) [note: '표시 이름 (예: 초보자, 1인 가구, 학생 등)']
  remark varchar(100) [note: '설명 또는 비고']
  sort_order int [note: '정렬 순서']
  use_yn char(1) [note: '사용 여부(Y/N)']
  depth int [note: '계층 깊이 (기본값 1)']
  parent_code varchar(6) [note: '상위 코드값 (nullable)']
  created_at datetime [note: '생성일시']
  updated_at datetime [note: '수정일시']
  created_by varchar(20) [note: '생성자']
  updated_by varchar(20) [note: '수정자']

  note: '공통 코드 상세 테이블'
}
-- 요리 실력 (COOKING_LEVEL)
INSERT INTO common_code (
  code, group_code, name, remark, sort_order, use_yn, depth, created_at, created_by
) VALUES
  ('C01001', 'C01', '초보자', '요리 실력', 1, 'Y', 1, NOW(), 'SYSTEM'),
  ('C01002', 'C01', '숙련자', '요리 실력', 2, 'Y', 1, NOW(), 'SYSTEM'),
  ('C01003', 'C01', '전문가', '요리 실력', 3, 'Y', 1, NOW(), 'SYSTEM');

-- 가구 형태 (HOUSEHOLD_TYPE)
INSERT INTO common_code (
  code, group_code, name, remark, sort_order, use_yn, depth, created_at, created_by
) VALUES
  ('H01001', 'H01', '1인 가구', '가구 형태', 1, 'Y', 1, NOW(), 'SYSTEM'),
  ('H01002', 'H01', '2인 가구', '가구 형태', 2, 'Y', 1, NOW(), 'SYSTEM'),
  ('H01003', 'H01', '3인 이상', '가구 형태', 3, 'Y', 1, NOW(), 'SYSTEM'),
  ('H01004', 'H01', '기타', '가구 형태', 4, 'Y', 1, NOW(), 'SYSTEM');

-- 직업 (JOB)
INSERT INTO common_code (
  code, group_code, name, remark, sort_order, use_yn, depth, created_at, created_by
) VALUES
  ('J01001', 'J01', '학생', '직업', 1, 'Y', 1, NOW(), 'SYSTEM'),
  ('J01002', 'J01', '주부', '직업', 2, 'Y', 1, NOW(), 'SYSTEM'),
  ('J01003', 'J01', '직장인', '직업', 3, 'Y', 1, NOW(), 'SYSTEM'),
  ('J01004', 'J01', '무직', '직업', 4, 'Y', 1, NOW(), 'SYSTEM'),
  ('J01005', 'J01', '자영업자', '직업', 5, 'Y', 1, NOW(), 'SYSTEM'),
  ('J01006', 'J01', '기타', '직업', 6, 'Y', 1, NOW(), 'SYSTEM');


<aside> 💡

궁금한거(진태)

  1. 메인 재료가 있다면 서브 재료도 따로 있어야 하는 거 아닌지? 입력하는 곳이 따로 안보임
  2. 초기 회원 가입할때에 나중에 입력하기를 한다면, 당장 닉네임 등이 없으면 UI에 어떻게 보여줄 것 인지 (취소)
  3. 만약 메인 재료 기반, 조미료 기반 조회가 추가된다면, 별도로 이것들을 테이블로 분리해야 함
  4. 소켓이 필요하다고 생각했는데, 인기 검색어가 오전 10시에 한번 업데이트되는거면, 필요 없을 것 같기도 함 (근데 인기 검색어가 굳이 10시에 업데이트되어야 하는 이유는?)

  1. 인기 검색어가 오전 10시에 한번 업데이트되는 건지, 1시간 마다 업데이트되는 걸로 하자라고 전달할게요
  2. 비회원 로그인 시 어디까지 허용해줄것인지?
  3. 모든 메시지 좀 지정해달라 200, 401
  4. 백오피스 언제까지 일정인지
  5. 레시피 등록 시 바로 등록이되는 건지?
  6. 최근 검색어를 갖고 있어야하는건지 (가지고 있는다면 몇 개까지?)
  7. 알림 관련해서 저게 무슨 의미인지 물어볼게요 (내가 작성한 레시피에 리뷰가 달린 알림인지) : 별도의 테이블을 만들어줘야함
  8. 단계별 레시피 입력에는 소제목이 들어가야 하는 거 아닌가 (보여주기를 나눠줬으면 입력하는 데도 나눠줘야지)
  9. 소셜에서 제공해주는 이미지를 가져올 것인지, 아니면 별도로 등록하는 곳에 추가할 것인지
  10. 레시피 작성 중에 나가면 그 정보들 어떻게 갖고 있어야 하는 지 </aside>

결과물 공유하는 자리는 전체적으로

유저테이블: deletedAt, fcm_token,

admin_user를 위한 테이블 하나 id, passid, password

리프레시토큰 (회원 탈퇴에 쓰는 컬럼 추가)