Skip to content
PGD edited this page Oct 16, 2024 · 34 revisions

다이어그램

HF_ERD

테이블 정의서

테이블 목록

No 관리영역 테이블 ID 테이블명
1 회원관리, 마이페이지 members 회원
2 매칭 기능 matching 매칭
3 매칭 기능 review 리뷰
4 매칭 기능 review_evaluation 리뷰 평
5 매칭 기능 spec 스펙
6 커뮤니티 post 포스트 (게시글)
7 커뮤니티 like 좋아요
8 커뮤니티 comment 댓글
9 채팅 chatroom 채팅방
10 채팅 chat_participation 채팅 참여
11 채팅 chat_message 채팅 메시지
12 채팅 read 읽음
13 알림 notification 알림

members

  • 관리영역: 회원관리, 마이페이지
  • 회원의 가입 정보 및 프로필 정보를 표현한 테이블. 프로필과 관련된 칼럼의 경우 기본적으로 모두 필수
No Column ID Column Name Type Length Nullable KEY Default 비고
1 member_id 회원 ID BIGINT N PK AUTO_INCRMENT
2 login_id 로그인 ID VARCHAR N 로그인 시 사용되는 ID. 소셜 로그인 ID가 저장됨 (현재 정책상 소셜 로그인만 지원)
3 password 패스워드 VARCHAR Y 소셜 로그인 시 password는 NULL
4 email 이메일 VARCHAR N 소셜 로그인 시member_id와 동일
5 name 이름 VARCHAR N 회원의 주민등록상 이름
6 role 역할 ENUM N ROLE_USER (ROLE_USER, ROLE_ADMIN)
7 creation_time 생성시간 DATETIME N NOW()
8 nickname 닉네임 VARCHAR 8 N
9 profile_url 프로필 사진 URL VARCHAR Y NULL일 경우 기본 프로필 사진
10 city VARCHAR N 사용자가 현재 위치한 도시 / 도 (경기도, 충청도)일 수도 있음
11 district VARCHAR N 사용자의 현재 구 (영등포구, 동대문구) / 군 (의성군)일 수도 있음
12 birth_date 생년월일 DATE N 시스템 시간보다 미래일 수 없음
13 gender 성별 ENUM N MALE, FEMALE
14 introduction 한 줄 소개 VARCHAR N 최대 몇 자인지 논의해야 함
15 fitness_level 운동 레벨 ENUM N BEGINNER (새싹), ADVANCED (고수)
16 companion_style 운동할 때 주로 누구랑? ENUM N SMALL (소규모형), GROUP (그룹형)
17 fitness_eagerness 운동할 때 나는 평소? ENUM N EAGER (의욕만렙형), LAZY (귀차니즘형)
18 fitness_objective 나의 운동 목적은? ENUM N 벌크업 (BULK_UP), 러닝러닝 (RUNNING)
19 fitness_kind 주로 하고 있는 운동은? ENUM N 고강도 운동 위주 (HIGH_STRESS), 기능성 피트니스 위주 (FUNCTIONAL)
20 review_score 리뷰 평균 평점 DOUBLE 0.0
21 is_deleted 삭제 여부 BOOLEAN N FALSE 삭제된 레코드인지 여부

matching

  • 관리영역: 매칭 기능
  • 운동 고수와 운동 초보 간의 매칭을 나타내는 테이블. is_accepted가 FALSE이면 매칭 신청 상태이고 is_accepted가 TRUE이면 매칭된 상태이다.
No Column ID Column Name Type Length Nullable KEY Default 비고
1 matching_id 매칭 ID BIGINT N PK AUTO_INCREMENT
2 beginner_id 초심자 ID VARCHAR N FK [members (member_id)]
3 advanced_id 운동 고수 ID VARCHAR N FK [members (member_id)]
4 status 매칭 상태 ENUM N 'PENDING' Enum: 'PENDING' (대기 중), 'ACCEPTED' (수락됨), 'REJECTED' (거절됨), 'FINISHED' (종료됨)
5 meeting_time 만남시간 DATETIME N 매칭 시 만나기로 한 시간
6 creation_time 생성 시간 DATETIME N NOW()
7 finish_time 종료시간 DATETIME Y 매칭이 종료된 시간

review

  • 관리영역: 매칭 기능, 마이페이지
  • 매칭 대상에 대해 남긴 리뷰
No Column ID Column Name Type Length Nullable KEY Default 비고
1 review_id 리뷰 ID BIGINT N PK AUTO_INCREMENT
2 reviewer_id 리뷰어 ID BIGINT N FK[members (member_id)] 리뷰를 남긴 회원
3 matching_id 매칭 ID BIGINT N FK[matching (matching_id)] 운동 고수와 운동 새싹 둘 다 리뷰를 남기면 매칭 종료
4 creation_time 리뷰 생성시간 DATETIME N NOW()
5 last_modified 마지막 수정시간 DATETIME Y NULL일 경우 수정되지 않음
6 score 리뷰 평점 INTEGER N 1 ~ 5

review_evaluation

  • 관리영역: 매칭 기능, 마이페이지
  • Review의 상세 후기 (좋아요/아쉬워요 등)
No Column ID Column Name Type Length Nullable KEY Default 비고
1 review_evaluation_id 리뷰 평가 ID BIGINT N PK AUTO_INCREMENT
2 review_id review ID BIGINT N FK[review (review_id)]
3 evaluation_type 평가 타입 ENUM N 리뷰에 남길 수 있는 평가의 타입 - 좋아요(GOOD), 아쉬워요(NOT_GOOD)
4 evaluation_detail 평가 상세 INTEGER N 각 평가에 대해 남길 수 있는 리뷰 메시지 항목의 ID

spec

  • 관리영역: 매칭 기능, 마이페이지
  • 회원의 경력 및 수상이력을 나타낸 테이블. 하나의 레코드가 하나의 경력 혹은 수상이력을 나타낸다.
No Column ID Column Name Type Length Nullable KEY Default 비고
1 spec_id 스펙 ID BIGINT N PK AUTO_INCREMENT
2 member_id 회원 ID VARCHAR N FK [members (member_id)]
3 start_date 시작 날짜 DATE N 경력 시작일 (수상 이력일 경우 수상 날짜)
4 end_date 종료 날짜 DATE Y 경력 종료일 (수상 이력일 경우 NULL)
5 is_current 현재 진행 여부 BOOLEAN N 경력이 현재 진행 중일 경우 (수상 이력일 경우 FALSE)
6 title 스펙 타이틀 VARCHAR N
7 description 상세설명 VARCHAR N 과정명, 체육관명 등 상세설명
8 is_deleted 삭제 여부 BOOLEAN N FALSE Soft Delete를 위한 칼럼

post

  • 관리영역: 커뮤니티
  • 커뮤니티의 게시글을 저장하는 테이블.
No Column ID Column Name Type Length Nullable KEY Default 비고
1 post_id 포스트 ID BIGINT N PK AUTO_INCREMENT
2 category 카테고리 ENUM N GYM_RECOMMENDATION (헬스장 추천), EXERCISE_CERTIFICATION (운동 인증), COUNSEL (고민/상담)
3 writer_id 작성자 ID VARCHAR N FK [members (member_id)]
4 title 포스트 제목 VARCHAR 30 N
5 content 내용 VARCHAR N
6 creation_time 작성 시간 DATETIME N NOW()
7 last_modified 마지막 수정 시간 DATETIME Y NULL일 경우 수정되지 않음
8 view_count 조회수 BIGINT N 0
9 likes_count 좋아요 수 BIGINT N 0
10 is_deleted 삭제 여부 BOOLEAN N FALSE Soft Delete를 위한 칼럼

likes

  • 관리영역: 커뮤니티
  • 게시글에 대한 “좋아요”를 나타낸 테이블. (좋아요 중복을 방지하기 위해 좋아요 수 칼럼을 post 테이블에 추가하는 대신 likes 테이블 정의)
  • post_id가 NULL이고 comment_id가 NULL이 아닐 경우, 댓글에 대한 좋아요
  • comment_id가 NULL이고 post_id가 NULL이 아닐 경우, 글에 대한 좋아요
  • post_id와 comment_id가 둘 다 NULL일 수는 없음
No Column ID Column Name Type Length Nullable KEY Default 비고
1 like_id 좋아요 ID BIGINT N PK AUTO_INCREMENT
2 member_id 회원 ID VARCHAR N FK [members (member_id)] 좋아요를 누른 회원의 ID
3 post_id 포스트 ID BIGINT Y FK [post (post_id)] 좋아요가 달린 포스트의 ID
4 comment_id 댓글 ID BIGINT Y FK [comment (comment_id)] 좋아요가 달린 포스트의 ID
5 like_type 좋아요 타입 ENUM N Post에 대한 좋아요인지 댓글에 대한 좋아요인지 나타내는 ENUM (POST, COMMENT)
6 is_canceled 취소 여부 BOOLEAN N FALSE Soft Delete를 위한 칼럼

comment

  • 관리영역: 커뮤니티
  • 게시글에 달린 댓글을 저장하는 테이블.
No Column ID Column Name Type Length Nullable KEY Default 비고
1 comment_id 댓글 ID BIGINT N PK AUTO_INCREMENT
2 post_id 포스트 ID BIGINT N FK [post (post_id)] 댓글이 달린 포스트
3 writer_id 댓글 작성자 ID VARCHAR N FK [members (member_id)]
4 content 댓글 내용 VARCHAR N
5 creation_time 댓글 작성 시간 DATETIME N NOW()
6 last_modified 마지막 수정 시간 DATETIME Y NULL일 경우 수정되지 않음
7 is_deleted 삭제 여부 BOOLEAN N FALSE Soft Delete를 위한 칼

chatroom

  • 관리영역: 채팅
  • 채팅방을 나타내는 테이블. (추후 정책 변경으로 인해 그룹 채팅 기능이 추가될 가능성에 대비해 chatroom 정의)
No Column ID Column Name Type Length Nullable KEY Default 비고
1 chatroom_id 채팅방 ID BIGINT N PK AUTO_INCREMENT
2 chatroom_name 채팅방명 VARCHAR N 1:1 채팅일 경우 채팅 상대방 nickname
3 creation_time 생성 시간 DATETIME N NOW()
4 thumbnail_url 썸네일 URL VARCHAR Y 1:1 채팅일 경우 채팅 상대방 프로필 사진
5 is_deleted 삭제 여부 BOOLEAN N FALSE Soft Delete를 위한 칼럼

chat_participation

  • 관리영역: 채팅
  • 회원의 채팅 참여 여부를 나타낸 테이블.
No Column ID Column Name Type Length Nullable KEY Default 비고
1 chat_participation_id 채팅 참여 ID BIGINT N PK AUTO_INCREMENT
2 chatroom_id 채팅방 ID BIGINT N FK [chatroom (chatroom_id)]
3 parcipant_id 참여자 ID VARCHAR N FK [members (member_id)]
4 is_disconnected 연결 해제 여부 BOOLEAN N FALSE Soft Delete를 위한 칼럼

chat_message

  • 관리영역: 채팅
  • 회원이 남긴 채팅을 저장한 테이블.
No Column ID Column Name Type Length Nullable KEY Default 비고
1 chat_message_id 채팅 메시지 ID BIGINT N PK AUTO_INCREMENT
2 chatroom_id 채팅방 ID BIGINT N FK [chatroom (chatroom_id)] 채팅 메시지가 남겨진 채팅방
3 sender_id 송신자 ID VARCHAR N FK [members (member_id)] 채팅 메시지를 보낸 회원 ID
4 content 메시지 내용 VARCHAR N
5 creation_time 채팅 시간 DATETIME N NOW()
6 is_deleted 삭제 여부 BOOLEAN N FALSE Soft Delete를 위한 칼

chat_read

  • 관리영역: 채팅
  • 회원이 채팅을 읽었는지 여부를 저장하는 테이블.
No Column ID Column Name Type Length Nullable KEY Default 비고
1 chat_message_id 채팅 메시지 ID BIGINT N PK, FK [chat_message (chat_message_id)] (채팅, reader) 쌍이 하나만 존재할 수 있기에 복합키로 선정
2 reader_id 채팅 읽은 회원 ID VARCHAR N PK, FK [members (member_id)] (채팅, reader) 쌍이 하나만 존재할 수 있기에 복합키로 선정

notification

  • 관리영역: 알림
  • 회원에게 전송된 알림을 저장하는 테이블.
No Column ID Column Name Type Length Nullable KEY Default 비고
1 notificaiton_id 알림 ID BIGINT N PK AUTO_INCREMENT
2 receiver_id 알림 수신자 ID VARCHAR N FK [members (member_id)]
3 logo_image_url 로고 이미지 URL VARCHAR Y 알림 로고 이미지 / NULL일 경우 기본 이미지
4 title 알림 제목 VARCHAR N
5 content 알림 세부 내용 VARCHAR N
6 notification_time 알림 시간 DATETIME N NOW()
7 type 알림 종류 ENUM N MATCHING (매칭 알림)
8 is_checked 알림 체크 여부 BOOLEAN N FALSE 회원이 알림을 체크했는지 여부
9 is_deleted 삭제 여부 BOOLEAN N FALSE Soft Delete를 위한 칼럼

초기화 SQL

CREATE DATABASE IF NOT EXISTS hf;

USE hf;

DROP PROCEDURE IF EXISTS drop_all_tables;

SET FOREIGN_KEY_CHECKS = 0;

DELIMITER
$$
CREATE PROCEDURE drop_all_tables()
BEGIN
    DECLARE done INT DEFAULT FALSE;
    DECLARE tname VARCHAR(64);

    DECLARE table_cur CURSOR FOR SELECT
                                     table_name
                                 FROM information_schema.tables
                                 WHERE table_schema = 'hf';

    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
    OPEN table_cur;

    table_loop
    :
    LOOP
        FETCH table_cur INTO tname;
        IF done THEN LEAVE table_loop; END IF;
        SET @tname_schema = CONCAT('hf.', tname);
        SET @drop_table_sql = CONCAT('DROP TABLE IF EXISTS ', @tname_schema);
        PREPARE stmt FROM @drop_table_sql;
        EXECUTE stmt;
    END LOOP;

    CLOSE table_cur;
END;
$$

DELIMITER ;

CALL drop_all_tables();

SET FOREIGN_KEY_CHECKS = 1;

-- DB 스키마 정의 시작
-- 추후 ERD 작성 후 필요한 테이블 다 추가할 예정
-- 각 길이는 논의 후에 구체적으로 정한다 (여기 DDL 숫자만 바꾸면 돼서 추후에 쉽게 변경할 수 있을 듯)

CREATE TABLE members
(
    member_id         BIGINT PRIMARY KEY AUTO_INCREMENT,
    login_id          VARCHAR(40) UNIQUE                 NOT NULL, -- 정책 확인 후 VARCHAR 크기 재조정
    password          VARCHAR(40),                                 -- 소셜 로그인 시 NULL
    name              VARCHAR(10)                        NOT NULL,
    email             VARCHAR(40) UNIQUE                 NOT NULL, -- 소셜 로그인 시 member_id와 email 같음
    role              ENUM ('ROLE_MEMBER', 'ROLE_ADMIN') DEFAULT 'ROLE_MEMBER',
    creation_time     DATETIME                           DEFAULT NOW(),
    nickname          VARCHAR(20)                        NOT NULL, -- 닉네임 최대 8자인데 2자 에누리
    profile_url       VARCHAR(255),
    cd1               CHAR(2)                            NOT NULL,
    cd2               CHAR(3)                            NOT NULL,
    cd3               CHAR(3)                            NOT NULL,
    birth_date        DATE                               NOT NULL,
    gender            ENUM ('MALE', 'FEMALE')            NOT NULL, -- 추후 정책에 따라 Gender 추가 가능
    introduction      TEXT                               NOT NULL, -- 추후 재조정
    fitness_level     ENUM ('ADVANCED', 'BEGINNER')      NOT NULL,
    companion_style   ENUM ('SMALL', 'GROUP')            NOT NULL,
    fitness_eagerness ENUM ('EAGER', 'LAZY')             NOT NULL,
    fitness_objective ENUM ('BULK_UP', 'RUNNING')        NOT NULL, -- 추후 ENUM 값 수정
    fitness_kind      ENUM ('HIGH_STRESS', 'FUNCTIONAL') NOT NULL, -- 추후 ENUM 값 수정
    review_score      DOUBLE                             DEFAULT 0.0,
    is_deleted        BOOLEAN                            DEFAULT FALSE
);

CREATE TABLE matching
(
    matching_id BIGINT PRIMARY KEY AUTO_INCREMENT,
    beginner_id BIGINT NOT NULL,
    advanced_id BIGINT NOT NULL,
    status      ENUM('PENDING', 'ACCEPTED', 'REJECTED', 'FINISHED') DEFAULT 'PENDING',
    
    FOREIGN KEY (beginner_id) REFERENCES members (member_id),
    FOREIGN KEY (advanced_id) REFERENCES members (member_id)
);

CREATE TABLE review
(
    review_id     BIGINT PRIMARY KEY AUTO_INCREMENT,
    reviewer_id   BIGINT  NOT NULL,
    reviewee_id   BIGINT  NOT NULL,
    matching_id   BIGINT  NOT NULL,
    creation_time DATETIME DEFAULT NOW(),
    last_modified DATETIME,
    score         INTEGER NOT NULL,
    FOREIGN KEY (reviewer_id) REFERENCES members (member_id),
    FOREIGN KEY (matching_id) REFERENCES matching (matching_id),
    CONSTRAINT score_range CHECK (score >= 1 AND score <= 5)
);

CREATE TABLE review_evaluation
(
    review_evaluation_id BIGINT PRIMARY KEY AUTO_INCREMENT,
    review_id            BIGINT                    NOT NULL,
    evaluation_type      ENUM ('GOOD', 'NOT_GOOD') NOT NULL,
    evaluation_detail_id INTEGER                   NOT NULL,
    FOREIGN KEY (review_id) REFERENCES review (review_id)
);

CREATE TABLE spec
(
    spec_id     BIGINT PRIMARY KEY AUTO_INCREMENT,
    member_id   BIGINT       NOT NULL,
    start_date  DATE         NOT NULL,
    end_date    DATE,
    is_current  BOOLEAN      NOT NULL,
    title       VARCHAR(255) NOT NULL,
    description TEXT         NOT NULL,
    is_deleted  BOOLEAN DEFAULT FALSE,
    FOREIGN KEY (member_id) REFERENCES members (member_id)
);

CREATE TABLE post
(
    post_id       BIGINT AUTO_INCREMENT PRIMARY KEY,
    category      ENUM ('GYM_RECOMMENDATION', 'WORKOUT_CERTIFICATION', 'COUNSELING') NOT NULL,
    writer_id     BIGINT                                                             NOT NULL,
    title         VARCHAR(50)                                                        NOT NULL,
    content       TEXT                                                               NOT NULL,
    creation_time DATETIME DEFAULT NOW(),
    last_modified DATETIME,
    likes_count   BIGINT   DEFAULT 0,
    view_count    BIGINT   DEFAULT 0,
    is_deleted    BOOLEAN  DEFAULT FALSE,
    FOREIGN KEY (writer_id) REFERENCES members (member_id)
);

CREATE TABLE comment
(
    comment_id    BIGINT AUTO_INCREMENT PRIMARY KEY,
    post_id       BIGINT NOT NULL,
    writer_id     BIGINT NOT NULL,
    content       TEXT   NOT NULL,
    creation_time DATETIME DEFAULT NOW(),
    last_modified DATETIME,
    is_deleted    BOOLEAN  DEFAULT FALSE,
    FOREIGN KEY (post_id) REFERENCES post (post_id),
    FOREIGN KEY (writer_id) REFERENCES members (member_id)
);

CREATE TABLE likes
(
    like_id     BIGINT PRIMARY KEY AUTO_INCREMENT,
    member_id   BIGINT                   NOT NULL,
    post_id     BIGINT,
    comment_id  BIGINT,
    like_type   ENUM ('POST', 'COMMENT') NOT NULL,
    is_canceled BOOLEAN DEFAULT FALSE,
    FOREIGN KEY (member_id) REFERENCES members (member_id),
    FOREIGN KEY (post_id) REFERENCES post (post_id),
    FOREIGN KEY (comment_id) REFERENCES comment (comment_id)
);

CREATE TABLE chatroom
(
    chatroom_id   BIGINT AUTO_INCREMENT PRIMARY KEY,
    chatroom_name VARCHAR(255) NOT NULL,
    creation_time DATETIME DEFAULT NOW(),
    thumbnail_url VARCHAR(255),
    is_deleted    BOOLEAN  DEFAULT FALSE
);

CREATE TABLE chat_participation
(
    chat_participation_id BIGINT AUTO_INCREMENT PRIMARY KEY,
    chatroom_id           BIGINT NOT NULL,
    participant_id        BIGINT NOT NULL,
    is_disconnected       BOOLEAN DEFAULT FALSE,
    FOREIGN KEY (chatroom_id) REFERENCES chatroom (chatroom_id),
    FOREIGN KEY (participant_id) REFERENCES members (member_id)
);

CREATE TABLE chat_message
(
    chat_message_id BIGINT AUTO_INCREMENT PRIMARY KEY,
    chatroom_id     BIGINT NOT NULL,
    sender_id       BIGINT NOT NULL,
    content         TEXT   NOT NULL,
    creation_time   DATETIME DEFAULT NOW(),
    is_deleted      BOOLEAN  DEFAULT FALSE,
    FOREIGN KEY (chatroom_id) REFERENCES chatroom (chatroom_id),
    FOREIGN KEY (sender_id) REFERENCES members (member_id)
);

CREATE TABLE chat_read
(
    chat_message_id BIGINT NOT NULL,
    reader_id       BIGINT NOT NULL,
    PRIMARY KEY (chat_message_id, reader_id),
    FOREIGN KEY (chat_message_id) REFERENCES chat_message (chat_message_id),
    FOREIGN KEY (reader_id) REFERENCES members (member_id)
);

CREATE TABLE notification
(
    notification_id   BIGINT PRIMARY KEY AUTO_INCREMENT,
    receiver_id       BIGINT       NOT NULL,
    logo_image_url    VARCHAR(255),
    title             VARCHAR(255) NOT NULL,
    content           TEXT         NOT NULL,
    notification_time DATETIME DEFAULT NOW(),
    type              ENUM ('MATCHING'),
    is_checked        BOOLEAN  DEFAULT FALSE,
    is_deleted        BOOLEAN  DEFAULT FALSE,
    FOREIGN KEY (receiver_id) REFERENCES members (member_id)
);