ERD 설계 - 100-hours-a-week/16-Hot6-wiki GitHub Wiki

ERD Cloud 보기

사용자 테이블 (Users)

컬럼명 컬럼ID 타입 및 길이 Domain Not Null Default PK FK 제약 조건
사용자식별자 id BIGINT   Y   Y   AUTO_INCREMENT
이메일 email VARCHAR(255)   Y        
권한 role VARCHAR(30)   Y        
카테부 닉네임 nickname_kakao VARCHAR(20)            
익명 닉네임 nickname_community VARCHAR(20)   Y        
포인트 point INT   Y 0     UNSIGNED
프로필 사진 image_path VARCHAR(255)   Y /basic.png      
활성상태 is_active BOOLEAN   Y TRUE      
인증여부 is_verified BOOLEAN   Y FALSE      
생성일자 created_at TIMESTAMP   Y        
수정일자 updated_at TIMESTAMP   Y created_at      
삭제일자 deleted_at TIMESTAMP     NULL      

내용

항목 설명
id 사용자를 식별하는 고유 번호입니다. BIGINT 타입으로 자동 증가하며 기본 키(PK)입니다.
email 사용자의 이메일을 나타냅니다.
role 사용자의 권한을 나타냅니다. (ADMIN, USER : 관리자, 사용자)
nickname_kakao 카카오 인증 후 사용하는 카테부 이름입니다. 로그인 후 첫 사용자 인증 이후 설정 가능하며 최대 20자까지 입력됩니다.
nickname_community 커뮤니티 활동 시 사용하는 익명 닉네임입니다. 회원가입 시 랜덤으로 기본값이 제공되며 변경 가능합니다. 최대 20자까지 입력됩니다.
point 사용자의 포인트입니다. 기본값은 0이며, 음수는 허용되지 않습니다.
image_path 사용자 프로필 이미지 경로입니다. 기본값은 "/basic.png" 입니다.
is_active 사용자의 활성 상태를 나타냅니다. 탈퇴 시 30일 유예기간이 제공되며 기본값은 true입니다.
is_verified 사용자 인증 여부입니다. 기본값은 false입니다.
created_at 사용자 가입 시각입니다. TIMESTAMP 타입입니다.
updated_at 마지막 수정 시각입니다. 기본값은 created_at과 같으며, 이후 수정 시 갱신됩니다.
deleted_at 회원 탈퇴 시각입니다. 기본값은 NULL입니다.
  • nickname_kakao가 nullable한 이유는 OAuth 가입 후 인증번호를 통한 카테부 사용자 인증 후 사용자가 카테부에서 사용하는 닉네임을 설정하도록 하기 위함이다.
    • 설정하지 않으면 포인트로 특가 제품 구매 시 수령 불가

  • 설명: 사용자 정보를 관리하는 테이블입니다.
  • 기능적 역할
    • 한 명의 사용자는 하나의 OAuth 토큰을 가질 수 있어 OAuthToken 테이블과 연결됨 (1 : 1)
    • 한 명의 사용자는 여러 주문을 진행할 수 있어 Order 테이블과 연결됨 (1 : N)
    • 한 명의 사용자는 여러 게시글을 작성할 수 있어 Post 테이블과 연결됨 (1 : N)
    • 한 명의 사용자는 여러 댓글을 작성할 수 있어 Comment 테이블과 연결됨 (1 : N)
    • 한 명의 사용자는 여러 대댓글을 작성할 수 있어 Recomment 테이블과 연결됨 (1 : N)
    • 한 명의 사용자는 여러 게시물에 좋아요를 누를 수 있어 Like 테이블과 연결됨 (1 : N)
    • 한 명의 사용자는 여러 게시물을 스크랩할 수 있어 Bookmark 테이블과 연결됨 (1 : N)
    • 한 명의 사용자는 여러 알림을 받을 수 있어 Notification 테이블과 연결됨 (1 : N)
    • 한 명의 사용자는 여러 생성 이미지를 가질 수 있어 AiImage 테이블과 연결됨 (1 : N)

OAuth 토큰 테이블 (OAuthTokens)

컬럼명 컬럼ID 타입 및 길이 Domain Not Null Default PK FK 제약 조건
OAuth식별자 id BIGINT   Y   Y   AUTO_INCREMENT
사용자식별자 user_id BIGINT   Y     Y ON DELETE CASCADE
제공기업명 provider VARCHAR(30)   Y        
제공기업번호 provider_id VARCHAR(50)   Y        
접근 토큰 access_token TEXT   Y        
리프레쉬 토큰 refresh_token TEXT   Y        
생성일자 created_at TIMESTAMP   Y        
수정일자 updated_at TIMESTAMP   Y created_at      

내용

항목 설명
id 각 토큰의 고유 식별자입니다. BIGINT 타입, 자동 증가, 기본 키(PK)입니다.
user_id 어떤 사용자에게 발급된 토큰인지 나타내는 외래 키(FK)입니다. user.id를 참조하며 ON DELETE CASCADE가 적용됩니다.
provider OAuth 제공자 이름입니다. (예: kakao) 일반적으로 12자 ~ 20자 이내로 구성되어 최대 30자로 지정합니다.
provider_id 해당 OAuth 제공자에서의 사용자 고유 ID입니다. 일반적으로 20자 ~ 30자 이내로 구성되어 최대 50자로 지정합니다.
access_token API 요청 시 사용하는 접근 토큰입니다.
refresh_token access_token이 만료되었을 때 새로 발급받기 위한 토큰입니다.
created_at 토큰 생성 시각입니다.
updated_at 토큰 수정 시각입니다. 생성 시 created_at과 같으며 이후 수정되면 갱신됩니다.
  • 설명: 사용자의 OAuth 토큰 정보를 관리하는 테이블입니다.
  • 기능적 역할
    • 한 명의 사용자는 하나의 OAuth 토큰을 가질 수 있어 User 테이블과 연결됨 (1 : 1)

주문 테이블 (ProductOrders)

컬럼명 컬럼ID 타입 및 길이 Domain Not Null Default PK FK 제약 조건
주문 식별자 id BIGINT   Y   Y   AUTO_INCREMENT
사용자 식별자 user_id BIGINT   Y     Y SET NULL(Soft delete)
제품 식별자 product_id BIGINT   Y     Y SET NULL(Soft delete)
제품 가격 price INT   Y       UNSIGNED
구매 수량 count INT   Y       UNSIGNED
주문상태 status VARCHAR(30)   Y PAID(주문완료)      
주문일시 ordered_at TIMESTAMP   Y        

내용

컬럼명 내용
id 주문 정보를 식별하는 고유 번호입니다. BIGINT 타입으로 자동 증가하며 기본 키(PK)입니다.
user_id 주문한 사용자 ID입니다. 외래 키(FK)로 user.id를 참조하며, 사용자 삭제 시 SET NULL로 설정됩니다.
product_id 주문된 상품의 ID입니다. 외래 키(FK)로 product.id를 참조하며, 상품 삭제 시 SET NULL로 설정됩니다.
price 주문 당시의 상품 가격입니다. 음수는 허용되지 않습니다.
count 주문 수량입니다. 음수는 허용되지 않습니다.
status 주문 상태입니다. (PAID, CONFIRMED, DELIVERED; 결제 완료, 주문 확인, 배송 완료)
ordered_at 주문한 시간입니다. TIMESTAMP 타입입니다.
  • price 반정규화(제품 정보 변경 시 이전 정보를 확인할 방법이 없다.)
    • 제품가격: 특가 당시에 구입한 품목이 다시 원가로 돌아 갔을 때, 이전에 구입했던 금액을 조회할 방법이 없다.

  • 설명: 사용자의 주문 정보를 관리하는 테이블입니다.
  • 기능적 역할
    • 한 명의 사용자는 여러 주문을 진행할 수 있어 User 테이블과 연결됨 (1 : N)
    • 하나의 주문은 하나의 상품을 구매할 수 있어 ServiceProduct 테이블과 연결됨 (1 : 1)

서비스 상품 테이블 (ServiceProducts)

컬럼명 컬럼ID 타입 및 길이 Domain Not Null Default PK FK 제약 조건
상품 식별자 id BIGINT   Y   Y   AUTO_INCREMENT
상품 분류 type VARCHAR(30)   Y        
상품명 name VARCHAR(30)   Y        
상품 설명 description TEXT   Y        
상품 가격 point INT   Y       UNSIGNED
수량 stock_quantity INT   Y       UNSIGNED
판매수 sold_count INT   Y 0     UNSIGNED
스크랩 수 scrap_count INT   Y 0     UNSIGNED
특가상태 is_discounted BOOLEAN   Y FALSE      
판매활성상태 is_active BOOLEAN   Y TRUE      
상품이미지 image_path VARCHAR(255)   Y        

내용

항목 내용
id 서비스 상품을 식별하는 고유 번호입니다. BIGINT 타입으로 자동 증가하며 기본 키(PK)입니다.
type 상품 분류입니다. (MOUSE, NOTEBOOK : 마우스, 키보드)
name 상품명입니다. 최대 30자까지 입력 가능합니다.
description 상품에 대한 상세 설명입니다. 최대 1000자까지 입력가능합니다.
point 상품 가격입니다. 포인트 단위이며 음수는 허용되지 않습니다.
stock_quantity 현재 판매 가능한 수량입니다.
sold_count 현재까지 팔린 상품의 수입니다.
scrap_count 현재 상품의 스크랩 수입니다.
is_discounted 상품이 현재 특가 상태인지 여부를 나타냅니다. 기본값은 ‘false'입니다.
is_active 상품의 판매 활성 상태입니다. 기본값은 'true'입니다.
image_path 상품 이미지 경로입니다.
  • 설명: 판매하는 상품 정보를 저장하는 테이블입니다.
  • 기능적 역할
    • 하나의 상품은 여러 주문에 포함될 수 있어 Order 테이블과 연결됨 (1 : N)
    • 하나의 상품은 하나의 특가 정보만 가져 ServiceDiscountProduct 테이블과 연결됨 (1 : 1)
    • 하나의 상품은 여러 스크랩을 가질 수 있어 Bookmark 테이블과 연결됨 (1 : N)

서비스 특가 상품 테이블 (ServiceDiscountProducts)

컬럼명 컬럼ID 타입 및 길이 Domain Not Null Default PK FK 제약 조건
서비스 특가 상품 식별자 id BIGINT Y Y AUTO_INCREMENT
서비스 상품 식별자 service_product_id BIGINT Y Y ON DELETE CASCADE
특가 종류 type VARCHAR(30) Y
할인가 price INT Y UNSIGNED
할인율 rate DECIMAL Y
특가 수량 count INT Y UNSIGNED
시작기간 started_at TIMESTAMP Y
만료기간 expires_at TIMESTAMP Y

내용

항목 내용
id 서비스 특가 상품을 식별하는 고유 번호입니다. BIGINT 타입으로 자동 증가하며 기본 키(PK)입니다.
service_product_id 어떤 상품이 특가 대상인지 나타내는 외래 키(FK)입니다. service_product.id 참조, ON DELETE CASCADE.
type 특가 종류입니다.(SPECIAL, BASIC : 깜짝특가, 일반특가)
price 할인 적용된 가격입니다. 상품 가격 - 상품 가격 x 할인율의 값으로 저장됩니다.
rate 할인율입니다. DECIMAL(2,1) 형식이며 0.1~1.0 범위를 갖습니다.
count 특가로 제공되는 수량입니다.
started_at 특가 시작 시각입니다.
expires_at 특가 종료 시각입니다.
  • 설명: 특가 상품 정보를 저장하는 테이블입니다.
  • 기능적 역할
    • 하나의 상품은 하나의 특가 이벤트만 가져 ServiceProduct 테이블과 연결됨 (1 : 1)

게시판 테이블 (Posts)

컬럼명 컬럼ID 타입 및 길이 Domain Not Null Default PK FK 제약 조건
게시글 식별자 id BIGINT Y Y AUTO_INCREMENT
사용자 식별자 user_id BIGINT Y Y ON DELETE CASCADE
분류 type VARCHAR(30) Y
제목 title VARCHAR(26) Y
본문 content TEXT Y
댓글수 comment_count INT Y 0 UNSIGNED
좋아요수 like_count INT Y 0 UNSIGNED
조회수 view_count INT Y 0 UNSIGNED
스크랩 수 scrap_count INT   Y 0     UNSIGNED
작성시간 created_at TIMESTAMP Y
수정시간 updated_at TIMESTAMP Y created_at

내용

항목 내용
id 서비스 특가 상품을 식별하는 고유 번호입니다. BIGINT 타입으로 자동 증가하며 기본 키(PK)입니다.
user_id 어떤 사용자가 게시글을 작성했는지 연결하는 외래 키(FK)입니다. user.id를 참조하며, 사용자 정보가 삭제될 경우 ON DELETE CASCADE로 설정합니다.
type 게시글 종류를 나타냅니다.(FREE, DESKSETUP : 자유, 데스크셋업)
title 게시글 제목을 나타냅니다. 최대 길이를 26자로 지정합니다.
content 게시글 내용을 나타냅니다. 타입은 TEXT로 지정합니다.
comment_count 게시글 댓글수를 나타냅니다. 기본값은 0으로 지정합니다.
like_count 게시글 좋아요수를 나타냅니다. 기본값은 0으로 지정합니다.
view_count 게시글 조회수를 나타냅니다. 기본값은 0으로 지정합니다.
scrap_count 추천 데스크 셋업 상품의 스크랩 수입니다.
created_at 게시글 작성일자를 나타냅니다. 서버 시간을 반영하기 위해 TIMESTAMP 타입을 사용합니다.
updated_at 게시글 수정일자를 나타냅니다. 기본값은 created_at으로 지정하고 자동 수정 일자 반영을 위해 TIMESTAMP 타입을 사용합니다.
  • is_deleted 추가하고 삭제 시 비즈니스 로직에서 type 체크 후 자유 게시판이면 CASCADE 날리고 생성형 AI 이미지가 포함된 게시글이면 update로 soft delete 진행

  • 설명: 게시글 정보를 관리하는 테이블입니다.
  • 기능적 역할
    • 한 명의 사용자는 여러 게시글을 작성할 수 있어 User 테이블과 연결됨 (1 : N)
    • 한 개의 게시글에는 여러 이미지 파일이 존재할 수 있어 PostImage 테이블과 연결됨 (1 : N)
    • 한 개의 게시글에는 하나의 AI 생성 이미지를 등록할 수 있어 AiImage 테이블과 연결됨 (1 : 1)
    • 한 개의 게시글에 여러 댓글이 달릴 수 있어 Comment 테이블과 연결됨 (1 : N)
    • 한 개의 게시글은 여러 좋아요를 가질 수 있어 Like 테이블과 연결됨 (1 : N)
    • 한 개의 게시글은 여러 스크랩을 가질 수 있어 Bookmark 테이블과 연결됨 (1 : N)
    • 한 개의 게시글에서 여러 알림을 보낼 수 있어 Notification 테이블과 연결됨 (1 : N)

게시글 이미지 테이블 (PostImages)

컬럼명 컬럼ID 타입 및 길이 Domain Not Null Default PK FK 제약 조건
이미지 식별자 id BIGINT   Y   Y   AUTO_INCREMENT
게시글 식별자 post_id BIGINT   Y     Y 게시글 type이 DESKSETUP일 경우
- SET NULL(Soft delete)
게시글 type이 FREE일 경우
- ON DELETE CASCADE
정렬 순서 sequence INT   Y       UNSIGNED
이미지 접근 경로 image_uuid VARCHAR(255)   Y        

내용

항목 내용
id 이미지를 식별하는 고유 번호입니다. BIGINT 타입으로 자동 증가하며 기본 키(PK)입니다.
post_id 이미지가 포함된 게시글 ID입니다. post.id를 참조하며 Post 테이블의 type에 따라 삭제 정책이 다릅니다.
type 이미지의 유형입니다. 이미지의 유형입니다.(ORIGINAL, AI, FREE : 원본, AI이미지, 자유게시판)
sequence 이미지의 정렬 순서입니다. 게시글 작성 경우에만 값을 입력합니다.
image_uuid 이미지 저장 경로입니다.
  • 설명: 서비스에 쓰이는 이미지를 관리하는 테이블입니다.(AI 생성, 게시글)
  • 기능적 역할
    • 한 개의 게시글은 여러 이미지를 포함할 수 있어 Post 테이블과 연결됨 (1 : N)

데스크 셋업 AI 이미지 테이블(AiImages)

컬럼명 컬럼ID 타입 및 길이 Domain Not Null Default PK FK 제약 조건
이미지 식별자 id BIGINT   Y   Y   AUTO_INCREMENT
사용자 식별자 user_id BIGINT   Y     Y ON DELETE CASCADE
게시글 식별자 post_id BIGINT   Y 0  
원본사진 before_image_path VARCHAR(255)   Y        
생성사진 after_image_path VARCHAR(255)   Y        
생성일시 created_at TIMESTAMP   Y        

내용

항목 내용
id 이미지를 식별하는 고유 번호입니다. BIGINT 타입으로 자동 증가하며 기본 키(PK)입니다.
user_id 이미지 소유 사용자 ID입니다. user.id를 참조하며 image_type에 따라 삭제 정책이 다릅니다.
post_id 이미지가 포함된 게시글 ID로 논리적 관계로 정의합니다.
before_image_id 원본 이미지 저장 경로입니다.
after_image_id AI 생성 이미지 저장 경로입니다.
created_at 이미지 생성 시간입니다.
  • 게시글 상세 조회 시 post.id와 AiImage의 post_id, user_id를 조인하여 이미지를 날리는 방식 사용
  • 게시글 작성 시 값이 제대로 들어갔는지 유효성 검사 필요

  • 설명: 서비스에 쓰이는 이미지를 관리하는 테이블입니다.(AI 생성, 게시글)
  • 기능적 역할
    • 한 명의 사용자는 여러 AI 이미지를 생성할 수 있어 User 테이블과 연결됨 (1 : N)
    • 한 개의 게시글은 여러 이미지를 포함할 수 있어 Post 테이블과 연결됨 (1 : 1)
    • 한 개의 이미지는 여러 추천 아이템을 포함할 수 있어 DeskProduct 테이블과 연결됨 (1 : N)

좋아요 테이블 (Likes)

컬럼명 컬럼ID 타입 및 길이 Domain Not Null Default PK FK 제약 조건
좋아요 식별자 id BIGINT   Y   Y   AUTO_INCREMENT
사용자 식별자 user_id BIGINT   Y     Y ON DELETE CASCADE
좋아요 종류 type VARCHAR(30)   Y        
좋아요 대상 target_id BIGINT   Y        
활성상태 is_active BOOLEAN   Y TRUE      
작성시간 created_at TIMESTAMP   Y        

내용

항목 내용
id 게시글을 식별하는 고유 번호입니다. BIGINT 타입으로 자동 증가하며 기본 키(PK)입니다.
user_id 좋아요를 누른 사용자 ID입니다. user.id 참조, ON DELETE CASCADE입니다.
type 좋아요의 유형입니다.(POST, COMMENT , REPLY: 게시글, 댓글, 답글)
target_id 좋아요 적용 대상의 pk 값입니다. (post_id, comment_id, reply_id)
is_active 좋아요 상태입니다. True 또는 False로 토글되며 재사용됩니다.
created_at 좋아요가 생성된 시각입니다.
  • 설명: 게시글에 달린 좋아요를 관리하는 테이블입니다.
  • 기능적 역할
    • 한 명의 사용자는 여러 좋아요를 누를 수 있어 User 테이블과 연결됨 (1 : N)
    • 한 개의 게시글은 여러 좋아요를 가질 수 있어 Post 테이블과 연결됨 (1 : N)

게시글 댓글 테이블 (Comments)

컬럼명 컬럼ID 타입 및 길이 Domain Not Null Default PK FK 제약 조건
댓글 식별자 id BIGINT Y Y AUTO_INCREMENT
사용자 식별자 user_id BIGINT Y Y ON DELETE CASCADE
게시글 식별자 post_id BIGINT Y Y ON DELETE CASCADE
본문 content TEXT Y
작성시간 created_at TIMESTAMP Y
수정시간 updated_at TIMESTAMP Y created_at

내용

항목 내용
id 댓글을 식별하는 고유 번호입니다. BIGINT 타입으로 자동 증가하며 기본 키(PK)입니다.
user_id 댓글 작성자 ID입니다. user.id 참조, ON DELETE CASCADE입니다.
post_id 댓글이 작성된 게시글 ID입니다. post.id 참조, ON DELETE CASCADE입니다.
content 댓글 본문입니다.
created_at 댓글 작성 시각입니다.
updated_at 댓글 수정 시각입니다. 생성 시 created_at과 동일하며 수정 시 자동 갱신됩니다.
  • 설명: 댓글을 관리하는 테이블입니다.
  • 기능적 역할
    • 한 명의 사용자는 여러 댓글을 작성할 수 있어 User 테이블과 연결됨 (1 : N)
    • 한 개의 게시글은 여러 댓글을 가질 수 있어 Post 테이블과 연결됨 (1 : N)
    • 한 개의 댓글은 여러 개의 대댓글을 가질 수 있어 Recomment 테이블과 연결됨 (1 : N)
    • 한 개의 댓글은 여러 알림을 보낼 수 있어 Notification 테이블과 연결됨 (1 : N)

게시글 대댓글 테이블 (Replies)

컬럼명 컬럼ID 타입 및 길이 Domain Not Null Default PK FK 제약 조건
대댓글 식별자 id BIGINT   Y   Y   AUTO_INCREMENT
사용자 식별자 user_id BIGINT   Y     Y ON DELETE CASCADE
댓글 식별자 comment_id BIGINT   Y     Y ON DELETE CASCADE
본문 content TEXT   Y        
작성시간 created_at TIMESTAMP   Y        
수정시간 updated_at TIMESTAMP   Y created_at      

내용

항목 내용
id 대댓글을 식별하는 고유 번호입니다. BIGINT 타입으로 자동 증가하며 기본 키(PK)입니다.
user_id 대댓글 작성자 ID입니다. user.id 참조, ON DELETE CASCADE입니다.
comment_id 대댓글이 작성된 댓글 ID입니다. post.id 참조, ON DELETE CASCADE입니다.
content 대댓글 본문입니다. 최대 500자 까지 작성 가능합니다.
created_at 대댓글 작성 시각입니다.
updated_at 대댓글 수정 시각입니다. 생성 시 created_at과 동일하며 수정 시 자동 갱신됩니다.
  • 설명: 대댓글을 관리하는 테이블입니다.
  • 기능적 역할
    • 한 개의 댓글은 여러 개의 대댓글을 가질 수 있어 Recomment 테이블과 연결됨 (1 : N)

스크랩 테이블 (Scraps)

컬럼명 컬럼ID 타입 및 길이 Domain Not Null Default PK FK 제약 조건
스크랩 식별자 id BIGINT   Y   Y   AUTO_INCREMENT
사용자 식별자 user_id BIGINT   Y     Y ON DELETE CASCADE
스크랩 종류 type VARCHAR(30)   Y        
스크랩 대상 target_id BIGINT   Y        
활성상태 is_active BOOLEAN   Y TRUE      
작성시간 created_at TIMESTAMP   Y        

내용

항목 내용
id 게시글을 식별하는 고유 번호입니다. BIGINT 타입으로 자동 증가하며 기본 키(PK)입니다.
user_id 스크랩을 한 사용자 ID입니다. user.id 참조, ON DELETE CASCADE입니다.
type 스크랩의 유형입니다.(POST, PRODUCT , RECOMMEND: 게시글, 상품, 추천 상품)
target_id 스크랩 적용 대상의 pk 값입니다. (post_id, service_product_id, desk_setup_id)
is_active 스크랩 상태입니다. True 또는 False로 토글되며 재사용됩니다.
created_at 스크랩이 생성된 시각입니다.
  • 설명: 사용자가 스크랩한 정보를 관리하는 테이블입니다.
  • 기능적 역할
    • 한 명의 사용자는 여러 스크랩을 가질 수 있어 User 테이블과 연결됨 (1 : N)
    • 한 개의 게시글은 여러 스크랩을 가질 수 있어 Post 테이블과 연결됨 (1 : N)
    • 한 개의 상품은 여러 스크랩을 가질 수 있어 ServiceProduct 테이블과 연결됨 (1 : N)

추천 상품 메인 카테고리 테이블 (ProductMainCategories)

컬럼명 컬럼ID 타입 및 길이 Domain Not Null Default PK FK 제약 조건
메인 카테고리 식별자 id BIGINT Y Y AUTO_INCREMENT
카테고리명 name VARCHAR(30) Y

내용

항목 내용
id 추천 상품 메인 카테고리를 식별하는 고유 번호입니다. BIGINT 타입으로 자동 증가하며 기본 키(PK)입니다.
name 추천 데스크 셋업 상품의 대분류 카테고리명입니다.
  • 설명: 상품의 메인 카테고리를 관리하는 테이블입니다.
  • 기능적 역할
    • 한 개의 메인 카테고리는 여러 서브 카테고리를 가질 수 있어 ProductSubCategory 테이블과 연결됨 (1 : N)

추천 상품 서브 카테고리 테이블 (ProductSubCategories)

컬럼명 컬럼ID 타입 및 길이 Domain Not Null Default PK FK 제약 조건
서브 카테고리 식별자 id BIGINT Y Y AUTO_INCREMENT
메인 카테고리 식별자 main_category_id BIGINT Y Y SET NULL(Soft delete)
카테고리명 name VARCHAR(30) Y

내용

항목 내용
id 추천 상품 서브 카테고리를 식별하는 고유 번호입니다. BIGINT 타입으로 자동 증가하며 기본 키(PK)입니다.
main_category_id 상위 메인 카테고리 ID입니다. ProductMainCategory.id를 참조하며, SET NULL입니다.
name 추천 데스크 셋업 상품의 소분류 카테고리명입니다.
  • 설명: 상품의 서브 카테고리를 관리하는 테이블입니다.
  • 기능적 역할
    • 한 개의 메인 카테고리는 여러 서브 카테고리를 가질 수 있어 ProductMainCategory 테이블과 연결됨 (1 : N)
    • 한 개의 서브 카테고리는 여러 추천 데스크 상품을 가질 수 있어 DeskProduct 테이블과 연결됨 (1 : N)

추천 데스크 셋업 상품 (DeskProducts)

컬럼명 컬럼ID 타입 및 길이 Domain Not Null Default PK FK 제약 조건
제품 식별자 id BIGINT   Y   Y   AUTO_INCREMENT
서브 카테고리 식별자 sub_category_id BIGINT   Y     Y SET NULL(Soft delete)
생성 이미지 식별자 ai_image_id BIGINT   Y     Y SET NULL(Soft delete)
상품명 name VARCHAR(50)   Y        
상품 가격 price INT   Y       UNSIGNED
스크랩 수 scrap_count INT   Y 0     UNSIGNED
가중치 weight DOUBLE   Y 0.0     UNSIGNED
판매처 purchase_place VARCHAR(30)   Y        
구매링크 purchase_url VARCHAR(255)   Y        
객체의 중심 좌표 x축 center_x INT   Y       UNSIGNED
객체의 중심 좌표 y축 center_y INT   Y       UNSIGNED
상품 이미지 image_path VARCHAR(255)   Y        

내용

항목 내용
id 추천 데스크 셋업 상품을 식별하는 고유 번호입니다. BIGINT 타입으로 자동 증가하며 기본 키(PK)입니다.
sub_category_id 서브 카테고리 ID입니다. ProductSubCategory.id를 참조하며 SET NULL입니다.
ai_image_id 관련된 AI 이미지 ID입니다. Image.id를 참조하며 SET NULL입니다.
name 추천 데스크 셋업 상품의 상품명입니다.
price 추천 데스크 셋업 상품의 가격입니다.
scrap_count 추천 데스크 셋업 상품의 스크랩 수입니다.
weight 추천 데스크 셋업 상품의 종합적인 노출 우선순위를 판단하기 위한 가중치 값입니다. 좋아요 수, 조회수, 스크랩 수 등 사용자 반응 요소를 기준으로 계산됩니다. 가중 합산 방식으로 주기적으로 업데이트되며, DOUBLE 타입을 사용합니다.
purchase_place 추천 데스크 셋업 상품의 판매처입니다.(Ex. 네이버, 쿠팡 등)
purchase_url 추천 데스크 셋업 상품의 판매 사이트입니다.
center_x 추천 데스크 셋업 상품의 이미지 내의 객체 x좌표입니다.
center_y 추천 데스크 셋업 상품의 이미지 내의 객체 y좌표입니다.
image_path 추천 데스크 셋업 상품의 이미지 경로입니다.
  • 설명: AI가 추천한 데스크 셋업 상품을 관리하는 테이블입니다.
  • 기능적 역할
    • 한 개의 서브 카테고리는 여러 추천 데스크 상품을 가질 수 있어 ProductSubCategory 테이블과 연결됨 (1 : N)
    • 한 개의 생성 이미지는 여러 추천 데스크 상품을 가질 수 있어 Image 테이블과 연결됨 (1 : N)
  • 이용
    • 추후에 생성된 빈도가 높은 데스크 셋업 상품을 구매해서 상품 판매에 이용가능합니다.

알림 테이블 (Notifications)

컬럼명 컬럼ID 타입 및 길이 Domain Not Null Default PK FK 제약 조건
알림 식별자 id BIGINT Y Y AUTO_INCREMENT
수신 사용자 식별자 receiver_user_id BIGINT Y Y ON DELETE CASCADE
송신 사용자 식별자 sender_user_id BIGINT Y Y ON DELETE CASCADE
게시글 식별자 post_id BIGINT Y Y ON DELETE CASCADE
댓글 식별자 comment_id BIGINT NULL Y ON DELETE CASCADE
알림 유형 type VARCHAR(30) Y
확인 상태 is_read BOOLEAN Y FALSE
삭제 상태 is_deleted BOOLEAN Y FALSE
생성일시 created_at TIMESTAMP Y

내용

항목 내용
id 알림을 식별하는 고유 번호입니다. BIGINT 타입으로 자동 증가하며 기본 키(PK)입니다.
receiver_user_id 알림을 받는 사용자 ID입니다. user.id 참조, ON DELETE CASCADE입니다.
sender_user_id 알림을 발생시킨 사용자 ID입니다. user.id 참조, ON DELETE CASCADE입니다.
post_id 알림이 발생한 게시글 ID입니다. post.id 참조, ON DELETE CASCADE입니다.
comment_id 알림이 발생한 댓글 ID입니다. comment.id 참조, ON DELETE CASCADE입니다. (nullable)
type 알림 유형입니다. (COMMENT, RECOMMENT, LIKE, SCRAP : 댓글, 대댓글, 좋아요, 스크랩)
is_read 알림 읽음 여부입니다. 기본값은 false입니다.
is_deleted 알림 삭제 상태입니다. 기본값은 false입니다.
created_at 알림 생성 시각입니다.
  • 설명: 알림 정보를 관리하는 테이블입니다.
  • 기능적 역할
    • 한 명의 사용자는 여러 알림을 받을 수 있어 Notification 테이블과 연결됨 (1 : N)
    • 한 개의 게시글에서 여러 알림을 보낼 수 있어 Notification 테이블과 연결됨 (1 : N)
    • 한 개의 댓글은 여러 알림을 보낼 수 있어 Notification 테이블과 연결됨 (1 : N)

포인트 내역 테이블 (PointHistories)

컬럼명 컬럼ID 타입 및 길이 Domain Not Null Default PK FK 제약 조건
포인트 사용 내역 식별자 id BIGINT   Y   Y   AUTO_INCREMENT
사용자 식별자 user_id BIGINT   Y     Y ON DELETE CASCADE
변화량 amount INT   Y       UNSIGNED
처리 후 포인트 balance_after INT   Y       UNSIGNED
처리 유형 type VARCHAR(20)   Y        
사용/적립 사유 description VARCHAR(30)   Y        
생성일시 created_at TIMESTAMP   Y        

내용

항목 내용
id 포인트 내역을 식별하는 고유 번호입니다. BIGINT 타입으로 자동 증가하며 기본 키(PK)입니다.
user_id 해당 포인트 내역의 사용자 ID입니다. user.id 참조, ON DELETE CASCADE입니다.
amount 포인트 변화량입니다.
balance_after 사용/적립 후 포인트입니다.
type 포인트 처리 유형입니다. (EARN, USE, REVERT : 적립, 사용, 복원)
description 사용/적립 사유입니다.
created_at 포인트 내역 생성 시각입니다.
  • 설명: 포인트 적립 내역을 관리하는 테이블입니다.
  • 기능적 역할
    • 한 명의 사용자는 여러 포인트 적립 내역을 가질 수 있어 User 테이블과 연결됨 (1 : N)

이미지 생성 내역 테이블 (ImageGenerationHistories)

컬럼명 컬럼ID 타입 및 길이 Domain Not Null Default PK FK 제약 조건
이미지 생성 내역 식별자 id BIGINT   Y   Y   AUTO_INCREMENT
사용자 식별자 user_id BIGINT   Y     Y ON DELETE CASCADE
이미지 생성 날짜 date_key DATE   Y        
생성 프롬프트 prompt_summary TEXT   Y        
생성시간 generated_at DATETIME   Y        
  • 설명: 이미지 생성 내역을 관리하는 테이블입니다.
  • 기능적 역할
    • 한 명의 사용자는 여러 이미지 생성 내역을 가질 수 있어 User 테이블과 연결됨 (1 : N)

조회 시 인덱스 전략

복합 인덱스는 1~3개 컬럼까지만 조합하는 게 가장 이상적입니다.
카디널리티 > WHERE > ORDER BY 순으로 우선 배치 고려

  • Posts 테이블: 게시글 조회
    • (created_at) - 전체 게시글 조회 (default: 최신순)
    • (type, created_at DESC) - 최신순 정렬
    • (type, view_count DESC) - 조회순 정렬
    • (type, like_count DESC) - 좋아요순 정렬
    • (user_id, created_at DESC) - 내 글 보기
  • Scraps 테이블: 스크랩 종류별 조회
    • (user_id, created_at DESC) - 전체 스크랩북 조회
    • (user_id, type, created_at DESC) - 게시글 또는 상품 스크랩북 조회
  • Comments 테이블
    • (post_id, created_at DESC) - 게시글별 최신순 댓글 조회
    • (user_id, post_id) - 특정 게시글 중복 댓글 방지
  • Replies 테이블
    • (comment_id, created_at DESC) - 댓글별 최신순 대댓글 조회
  • Likes 테이블
    • (target_id, user_id) - 특정 타겟(게시글, 댓글, 답글)에 좋아요를 눌렀는지 빠르게 조회
    • (user_id, is_active) - 유저가 눌렀던 좋아요 중 활성상태만 찾을 때 (soft-delete)
  • PostImages 테이블
    • (post_id, sequence) - 게시글에 첨부된 여러 이미지를 순서대로 정렬해서 보여줄 때
  • DeskProducts 테이블
    • (sub_category_id, score DESC) - 특정 서브카테고리 내 상품을 추천순으로 정렬
    • (sub_category_id, scrap_count DESC) - 특정 서브카테고리 내 상품을 스크랩순으로 정렬
  • ProductOrders 테이블: 구매내역 조회
    • (user_id, ordered_at DESC) - 유저별 구매내역 최신순 조회
  • AIimages 테이블: 개인 데스크 셋업 보기 조회
    • (user_id, created_at DESC) - 유저별 데스크 셋업 최신순 조회
  • Notifications 테이블
    • (receiver_user_id, created_at DESC) - 알림 목록 최신순 정렬 조회
  • ServiceProducts 테이블
    • (is_active, is_discounted) - 현재 판매 중이면서 특가 적용된 상품을 찾을 때
  • PointHistories 테이블: 포인트 내역 조회
    • (user_id, created_at DESC)
  • ImageGenerationHistories : 이미지 생성 내역 저장
    • (user_id, date_key) - 유저별 하루 생성 이미지 사용 내역 확인
⚠️ **GitHub.com Fallback** ⚠️