-
Notifications
You must be signed in to change notification settings - Fork 1
ERD
PGD edited this page Oct 16, 2024
·
34 revisions
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 | 알림 |
- 관리영역: 회원관리, 마이페이지
- 회원의 가입 정보 및 프로필 정보를 표현한 테이블. 프로필과 관련된 칼럼의 경우 기본적으로 모두 필수
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 | 이메일 | 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 | 삭제된 레코드인지 여부 |
- 관리영역: 매칭 기능
- 운동 고수와 운동 초보 간의 매칭을 나타내는 테이블. 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 | 매칭이 종료된 시간 |
- 관리영역: 매칭 기능, 마이페이지
- 매칭 대상에 대해 남긴 리뷰
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의 상세 후기 (좋아요/아쉬워요 등)
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 |
- 관리영역: 매칭 기능, 마이페이지
- 회원의 경력 및 수상이력을 나타낸 테이블. 하나의 레코드가 하나의 경력 혹은 수상이력을 나타낸다.
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를 위한 칼럼 |
- 관리영역: 커뮤니티
- 커뮤니티의 게시글을 저장하는 테이블.
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를 위한 칼럼 |
- 관리영역: 커뮤니티
- 게시글에 대한 “좋아요”를 나타낸 테이블. (좋아요 중복을 방지하기 위해 좋아요 수 칼럼을 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를 위한 칼럼 |
- 관리영역: 커뮤니티
- 게시글에 달린 댓글을 저장하는 테이블.
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 정의)
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를 위한 칼럼 |
- 관리영역: 채팅
- 회원의 채팅 참여 여부를 나타낸 테이블.
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를 위한 칼럼 |
- 관리영역: 채팅
- 회원이 남긴 채팅을 저장한 테이블.
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를 위한 칼 |
- 관리영역: 채팅
- 회원이 채팅을 읽었는지 여부를 저장하는 테이블.
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) 쌍이 하나만 존재할 수 있기에 복합키로 선정 |
- 관리영역: 알림
- 회원에게 전송된 알림을 저장하는 테이블.
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를 위한 칼럼 |
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)
);