테이블 정의서 - 100-hours-a-week/2-hertz-wiki GitHub Wiki
목차
Table
1. user
2. user_oauth
3. interests_category
4. interests_category_item
5. user_interests
6. tuning_report
7. tuning_report_user_reaction
8. alarm
9. user_notification
10. alarm_report
11. alarm_notification
12. signal_room
13. signal_message
14. channel_room
15. channel_join
16. channel_message
17. channel_message_last_read
Index
1. 사용자 계열
2. 관심사 계열
3. 튜닝 리포트 계열
4. 알림 계열
5. 시그널 계열
6. 채널 계열
사용자
1. user
테이블 설명
- 사용자가 입력한 기본적인 정보에 대해 저장하는 테이블입니다.
컬럼 설명
- id
- 설명 : 사용자 테이블의 PK
- 타입 :
bigint
- 제약 :
NOT NULL PRIMARY KEY AUTO_INCREMENT
- age_range
- 설명 : 사용자 연령대
- 타입 :
varchar(10)
- 제약 :
NOT NULL
- gender
- 설명 : 사용자 성별
- 타입 :
varchar(10)
- 제약 :
NOT NULL
- email
- 설명 : 사용자 기업용 이메일
- 타입 :
varchar(255)
- 제약 :
NOT NULL
- profile_image
- 설명 : 사용자 프로필 이미지
- 타입 :
varchar(512)
- 제약 :
NOT NULL
- 기본값 : 기본 이미지 경로
- nickname
- 설명 : 사용자 닉네임
- 타입 :
varchar(10)
- 제약 :
NOT NULL
- one_line_introduction
- 설명 : 사용자 한줄 소개
- 타입 :
varchar(100)
- 제약 :
NOT NULL
- status_code
- 설명 : 사용자 상태 코드
- 타입 :
varchar(25)
- 제약 :
NOT NULL
- 기본값 : SIGNAL (ENUM)
- is_friend_allowed
- 설명 : 카테고리 친구 허용여부
- 타입 :
boolean
- 제약 :
NOT NULL
- 기본값 :
TRUE
- is_couple_allowed
- 설명 : 카테고리 연인 허용여부
- 타입 :
boolean
- 제약 :
NOT NULL
- 기본값 :
TRUE
- is_meal_friend_allowed
- 설명 : 카테고리 밥친구 허용여부
- 타입 :
boolean
- 제약 :
NOT NULL
- 기본값 :
TRUE
- created_at
- 설명 : 사용자 생성 일시
- 타입 :
TIMESTAMP
- 제약 :
NOT NULL
- 기본값 :
CURRENT_TIMESTAMP
- modified_at
- 설명 : 사용자 수정 일시
- 타입 :
TIMESTAMP
- 제약 :
NOT NULL
- 기본값 :
CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
- deleted_at
- 설명 : 사용자 삭제 일시
- 타입 :
TIMESTAMP
- 제약 :
NULL
부가 설명
- age_group, gender, status 는 ENUM 형태로 관리합니다.
- deleted_at 컬럼으로 사용자의 탈퇴 여부를 구분합니다.
- profile_image 의 '기본 이미지 경로'는 서비스 내 기본 이미지를 불러옵니다.
2. user_oauth
테이블 설명
- OAuth 로그인을 통해 가입한 사용자의 OAuth 내 고유 아이디 및 사용자의 입력정보를 저장하는 테이블입니다.
컬럼 설명
- id
- 설명 : 사용자 OAuth 테이블의 PK
- 타입 :
bigint
- 제약 :
NOT NULL PRIMARY KEY AUTO_INCREMENT
- user_id
- 설명 : 사용자 아이디 FK
- 타입 :
bigint
- 제약 :
NOT NULL FOREIGN KEY (user_id) REFERENCES user(id)
- provider_id
- 설명 : 소셜로그인 제공자에서 제공해주는 사용자의 고유아이디 (kakao id, google id ...)
- 타입 :
bigint
- 제약 :
NOT NULL PRIMARY KEY AUTO_INCREMENT
- provider
- 설명 : 소셜로그인 제공자 (kakao, google ...)
- 타입 :
varchar(10)
- 제약 :
NOT NULL
- refresh_token
- 설명 : 리프레시 토큰 정보 저장
- 타입 :
varchar(255)
- 제약 :
NOT NULL PRIMARY KEY AUTO_INCREMENT
- refresh_token_expires_at
- 설명 : 리프레시 토큰 만료일자
- 타입 :
Datetime
- 제약 :
NULL
취향 카테고리
3. interests_category
테이블 설명
- 취향 카테고리의 상위 항목들을 저장하는 테이블이며, 해당 테이블의 데이터들은 정적입니다.
컬럼 설명
- id
- 설명 : 취향 카테고리 상위 항목 테이블의 PK
- 타입 :
bigint
- 제약 :
NOT NULL PRIMARY KEY AUTO_INCREMENT
- user_id
- 설명 : 사용자 아이디 FK
- 타입 :
bigint
- 제약 :
NOT NULL FOREIGN KEY (user_id) REFERENCES user(id)
- name
- 설명 : 취향 카테고리 상위 항목명
- 타입 :
varchar(10)
- 제약 :
NOT NULL
- type
- 설명 : 취향 카테고리 상위 항목의 종류 (키워드, 관심사)
- 타입 :
varchar(10)
- 제약 :
NOT NULL
부가 설명
- name, type은 ENUM 형태로 관리합니다.
4. interests_category_item
테이블 설명
- 상위 카테고리 항목 각각에 대한 하위 항목을 가지고 있는 테이블이며, 해당 데이터들은 정적입니다.
컬럼 설명
- id
- 설명 : 취향 카테고리 하위 항목 테이블의 PK
- 타입 :
bigint
- 제약 :
NOT NULL PRIMARY KEY AUTO_INCREMENT
- category_id
- 설명 : 취향 카테고리 상위 항목의 아이디 FK
- 타입 :
bigint
- 제약 :
NOT NULL FOREIGN KEY (category_id) REFERENCES interests_category(id)
- name
- 설명 : 취향 카테고리 하위 항목명
- 타입 :
varchar(15)
- 제약 :
NOT NULL
부가 설명
- name 은 ENUM 형태로 관리됩니다.
- 취향 카테고리 상위 항목 각각에 대한 하위 항목을 가지며, 해당 데이터들은 정적입니다.
- 취향 카테고리 상위 항목에 대해 반드시 1개 이상의 항목을 가집니다.
5. user_interests
테이블 설명
- 사용자가 선택한 하위 항목에 대한 정보를 담는 테이블입니다.
컬럼 설명
- id
- 설명 : 사용자가 선택한 하위 항목 테이블의 PK
- 타입 :
bigint
- 제약 :
NOT NULL PRIMARY KEY AUTO_INCREMENT
- category_item_id
- 설명 : 사용자가 선택한 취향 카테고리 하위 항목 FK
- 타입 :
bigint
- 제약 :
NOT NULL FOREIGN KEY (category_item_id) REFERENCES interests_category_item(id)
- user_id
- 설명 : 사용자 아이디
- 타입 :
bigint
- 제약 :
NOT NULL FOREIGN KEY (user_id) REFERENCES user(id)
부가 설명
- 사용자는 취향 카테고리 하위 항목 중 필수적으로 3개 이상을 선택해야 합니다.
- 추후 카테고리 항목 변경에 대응하였습니다.
튜닝 리포트
테이블 설명에 앞서, 튜닝 리포트란 저희 서비스 내에서 "기사" 라는 단어와 동일한 의미를 가집니다.
아래 설명에서는 "기사" 라는 단어 대신 튜닝 리포트를 사용하겠습니다.
6. tuning_report
테이블 설명
- 1:1로 매칭된 사용자들이 시그널 → 채널로 변경된 경우, 해당 사용자들의 개인정보 및 취향을 AI로 보내게 됩니다.
이후 AI에서 해당 내용을 기반으로 튜닝 리포트를 생성하고, 생성된 튜닝 리포트가 tuning_report 테이블에 저장됩니다.
컬럼 설명
- id
- 설명 : 튜닝 리포트 테이블의 PK
- 타입 :
bigint
- 제약 :
NOT NULL PRIMARY KEY AUTO_INCREMENT
- title
- 설명 : 튜닝 리포트의 제목
- 타입 :
varchar(50)
- 제약 :
NOT NULL
- content
- 설명 : 튜닝 리포트의 내용
- 타입 :
TEXT
- 제약 :
NOT NULL
- reaction_celebrate
- 설명 : 특정 튜닝 리포트에 사용자가 누른 반응의 개수 (축하)
- 타입 :
int
- 제약 :
NOT NULL
- 기본값 :
0
- reaction_thumbs_up
- 설명 : 특정 튜닝 리포트에 사용자가 누른 반응의 개수 (추천)
- 타입 :
int
- 제약 :
NOT NULL
- 기본값 :
0
- reaction_laugh
- 설명 : 특정 튜닝 리포트에 사용자가 누른 반응의 개수 (웃음)
- 타입 :
int
- 제약 :
NOT NULL
- 기본값 :
0
- reaction_eyes
- 설명 : 특정 튜닝 리포트에 사용자가 누른 반응의 개수 (눈)
- 타입 :
int
- 제약 :
NOT NULL
- 기본값 :
0
- reaction_heart
- 설명 : 특정 튜닝 리포트에 사용자가 누른 반응의 개수 (하트)
- 타입 :
int
- 제약 :
NOT NULL
- 기본값 :
0
- created_at
- 설명 : 튜닝 리포트 발행 일시
- 타입 :
TIMESTAMP
- 제약 :
NOT NULL
- 기본값 :
CURRENT_TIMESTAMP
- modified_at
- 설명 : 튜닝 리포트 수정 일시
- 타입 :
TIMESTAMP
- 제약 :
NOT NULL
- 기본값 :
CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
- deleted_at
- 설명 : 튜닝 리포트 삭제 일시
- 타입 :
TIMESTAMP
- 제약 :
NULL
부가 설명
- 튜닝 리포트의 경우, 테이블 분리와 관련하여 많은 고민을 하였습니다.
특히 '반응'과 관련된 컬럼들이 테이블에 존재해도 되는지에 대해 의문이 있었는데, 추후에도 '반응'과 관련된 컬럼의 정보가 추가/수정되지 않을 것이라 판단하여 테이블 내에 5개의 반응 컬럼을 만들게 되었습니다. - title, content 는 AI가 작성한 내용이 담깁니다.
- title 의 경우 기획에서 지정한 글자수는 50자보다 적지만 혹시 모를 예외를 고려하여 varchar(50)으로 지정하게 되었습니다.
- content 의 경우 마크다운 형식과 이모지도 포함하는 형태로 저장되기 때문에 사이즈가 다소 길어질 거라 예상하여 text로 지정하게 되었습니다.
- reaction_* 의 경우 처음 생성된 튜닝 리포트는 반응의 개수가 모두 0이기 때문에 기본값으로 0을 가지며, 반응의 개수가 들어가지 않는 경우가 없기 때문에 모두 NOT NULL 입니다.
7. tuning_report_user_reaction
테이블 설명
- 각 튜닝 리포트에 달리는 사용자별 반응 데이터를 저장합니다.
서비스 내에서 ‘반응’은 종류별로 선택이 가능하며, 이미 선택한 반응을 다시 클릭한 경우 해당 row는 테이블에서 삭제됩니다.
컬럼 설명
- id
- 설명 : 튜닝 리포트 사용자 반응 테이블의 PK
- 타입 :
bigint
- 제약 :
NOT NULL PRIMARY KEY AUTO_INCREMENT
- report_id
- 설명 : 튜닝 리포트 테이블 FK
- 타입 :
bigint
- 제약 :
NOT NULL FOREIGN KEY (report_id) REFERENCES tuning_report(id)
- user_id
- 설명 : 사용자 테이블 FK
- 타입 :
bigint
- 제약 :
NOT NULL FOREIGN KEY (user_id) REFERENCES user(id)
- reaction_type
- 설명 : 사용자가 누른 반응의 종류
- 타입 :
varchar(15)
- 제약 :
NOT NULL PRIMARY KEY AUTO_INCREMENT
부가 설명
- reaction_type 은 ENUM 형태로 관리되며, 현재 설계된 ENUM으로는 15자를 넘지 않기 때문에 varchar(15)로 지정하였습니다.
알림창
테이블 설명에 앞서, 저희 서비스에서 사용자에게 가는 “알림”의 종류가 현재는 2가지 있습니다.
하나는 서비스 공지를 전달하기 위한 알림, 하나는 매칭된 두 사용자에 대한 힌트를 담은 튜닝 리포트에 대한 알림입니다.해당 경우에 슈퍼타입 - 서브타입 전략(조인 전략)을 사용했습니다.
- 하나의 “알림창” 테이블로 사용했을 때 문제점
- 알림 유형이 현재는 공지(NOTICE)와 튜닝 리포트(REPORT)로 구분되어 있지만 향후 알림 유형이 추가될 가능성이 매우 높습니다.
- 모든 알림 유형에서 공통으로 사용하는 필드(
title
,type
,created_at
등)를 분리하여 중복 제거 및 일관된 구조 유지됩니다.- 알림 유형별로 다른 구조(필드)를 가지는 경우, 많은 null 데이터가 발생 위험이 있는 하나의 테이블에 모두 넣는 구조보다 명확하게 분리된 설계가 필요합니다.
- 조인 전략을 선택하게 된 이유
- 확장성: 새로운 알림 유형이 생길 경우, 해당 유형에 맞는 서브타입 테이블만 추가하면 되므로, 기존 테이블 구조를 변경하지 않아도 됩니다.
- 정규화: 알림 공통 속성과 개별 속성을 분리하여 중복 없이 정규화된 구조로 데이터 무결성을 유지할 수 있음.
- 유지보수 용이성: 공통 로직은
alarm
테이블 기준으로 처리하고, 서브타입 테이블에서는 각 알림 유형에 대한 로직만 구현하면 되므로 유지보수가 쉽고 객체를 다루듯이 테이블을 다룰 수 있습니다.
8. alarm
테이블 설명
- 모든 알림 유형의 공통 정보를 담는 테이블입니다.
컬럼 설명
- id
- 설명 : 알림창 테이블의 PK
- 타입 :
bigint
- 제약 :
NOT NULL PRIMARY KEY AUTO_INCREMENT
- title
- 설명 : 알림창의 제목
- 타입 :
varchar(50)
- 제약 :
NOT NULL
- type
- 설명 : 알림창 종류 (공지, 튜닝 리포트)
- 타입 :
varchar(10)
- 제약 :
NOT NULL
- created_at
- 설명 : 알림 생성 일시
- 타입 :
TIMESTAMP
- 기본값 :
CURRENT_TIMESTAMP
- modified_at
- 설명 : 알림 수정 일시
- 타입 :
TIMESTAMP
- 제약 :
NOT NULL
- 기본값 :
CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
- deleted_at
- 설명 : 알림 삭제일시
- 타입 :
TIMESTAMP
- 제약 :
NOT NULL
부가 설명
- type은 ENUM 형태로 관리됩니다.
9. user_notification
테이블 설명
- 알림을 수신한 사용자 정보 및 읽음 여부를 저장하는 테이블입니다.
컬럼 설명
- id
- 설명 : 사용자용 알림창 테이블의 PK
- 타입 :
bigint
- 제약 :
NOT NULL PRIMARY KEY AUTO_INCREMENT
- notification_id
- 설명 : 알림창 테이블 FK
- 타입 :
bigint
- 제약 :
NOT NULL FOREIGN KEY (notification_id) REFERENCES alarm(id)
- user_id
- 설명 : 사용자 테이블 FK
- 타입 :
bigint
- 제약 :
NOT NULL FOREIGN KEY (user_id) REFERENCES user(id)
- is_read
- 설명 : 사용자별 알림 읽음 유무
- 타입 :
boolean
- 제약 :
NOT NULL
- 기본값 :
FALSE
부가 설명
- type은 ENUM 형태로 관리됩니다.
10. alarm_report
테이블 설명
- 튜닝 리포트 알림(REPORT)의 공지사항을 담는 서브타입 테이블입니다.
alarm 테이블의 id를 외래키로 받아 1:1 관계로 연결됩니다.
컬럼 설명
- id
- 설명 : 알림창(공지) 테이블의 PK
- 타입 :
bigint
- 제약 :
NOT NULL PRIMARY KEY AUTO_INCREMENT
- couple_count
- 설명 : 특정 주기동안 튜닝 리포트가 생성된 수
- 타입 :
int
- 제약 :
NOT NULL
부가 설명
- '튜닝 리포트'와 관련된 튜닝 리포트가 저장되며, 해당 알림 클릭 시 튜닝 리포트 페이지로 이동하여 가장 최신 피드를 확인 할 수 있습니다.
11. alarm_notification
테이블 설명
- 튜닝 리포트 알림(NOTICE)의 공지사항을 담는 서브타입 테이블입니다.
alarm 테이블의 id를 외래키로 받아 1:1 관계로 연결됩니다.
컬럼 설명
- id
- 설명 : 알림창(공지) 테이블의 PK
- 타입 :
bigint
- 제약 :
NOT NULL PRIMARY KEY AUTO_INCREMENT
- content
- 설명 : 알림창 내 공지사항의 내용
- 타입 :
text
- 제약 :
NOT NULL
부가 설명
- '공지'와 관련된 튜닝 리포트가 저장되며, '공지'는 알림창 내에서만 토글 형식으로 확인할 수 있습니다.
시그널
테이블 설명에 앞서 저희 서비스 내에서 시그널은 "쪽지"와 동일한 의미를 갖습니다.
이후 설명에서는 "쪽지" 대신 시그널이라는 용어를 사용하겠습니다.
시그널은 매칭이 이루어지기 전 단계에서 사용하는 메시징 기능으로, 실시간 채팅이 아닌 HTTP 기반의 비실시간, 무상태 통신 방식으로 동작합니다.
12. signal_room
테이블 설명
- 사용자 간 1:1 시그널(쪽지)의 방 정보를 저장하는 테이블입니다.
시그널을 주고받는 두 사용자 간의 관계, 룸 생성 시점, 각 사용자의 매칭 여부 등을 기록하며, HTTP 기반의 비실시간 무상태 통신에서 세션 단위로 활용됩니다.
컬럼 설명
- id
- 설명 : 시그널 룸 테이블의 PK
- 타입 :
bigint
- 제약 :
NOT NULL PRIMARY KEY AUTO_INCREMENT
- sender_user_id
- 설명 : 시그널을 보낸 사용자 아이디 FK (처음 시작한 사용자)
- 타입 :
bigint
- 제약 :
NOT NULL FOREIGN KEY (sender_user_id) REFERENCES user(id)
- receiver_user_id
- 설명 : 시그널을 받은 사용자 아이디 FK
- 타입 :
bigint
- 제약 :
NOT NULL FOREIGN KEY (receiver_user_id) REFERENCES user(id)
- user_pair_signal
- 설명 : sender와 receiver를 정렬한 식별자 (양방향 중복 방지)
- 타입 :
varchar(35)
- 제약 : STORED GENERATED COLUMN
- category
- 설명 : 시그널 룸의 카테고리 (친구, 커플, 밥친구)
- 타입 :
varchar(10)
- 제약 :
NOT NULL
- sender_matching_status
- 설명 : 시그널을 보낸 사용자의 매칭 여부
- 타입 :
varchar(15)
- 제약 :
NOT NULL
- 기본값 : SIGNAL (ENUM)
- receiver_mathing_status
- 설명 : 시그널을 받은 사용자의 매칭 여부
- 타입 :
varchar(15)
- 제약 :
NOT NULL
- 기본값 : SIGNAL (ENUM)
- sender_exited_at
- 설명 : 시그널을 보낸 사용자가 채널방을 나간 일시
- 타입 :
TIMESTAMP
- 제약 :
NULL
- receiver_exited_at
- 설명 : 시그널을 받은 사용자가 채널방을 나간 일시
- 타입 :
TIMESTAMP
- 제약 :
NULL
- created_at
- 설명 : 시그널 생성 일시
- 타입 :
TIMESTAMP
- 제약 :
NOT NULL
- 기본값 : CURRNET_TIMESTAMP
부가 설명
- 시그널 룸은 한 사용자가 먼저 시그널을 보내야 시작되며, 두 사용자 모두 매칭 승인 시 채널로 전환됩니다.
(채널에 대한 자세한 설명은 채널 테이블 설명 참고 부탁드립니다. ) - sender_user_id 와 receiver_user_id 는 양방향에 대해서도 중복을 방지합니다.
- user_pair_signal 는
CONCAT(LEAST(sender_user_id, receiver_user_id), '_', GREATEST(sender_user_id, receiver_user_id))
으로 구성되어 양방향 중복을 방지합니다. - category, sender_mathing_status, receiver_mathing_status 는 ENUM 형태로 관리됩니다.
- sender_mathing_status, receiver_mathing_status의 경우, 처음 생성 시 SIGNAL이며 이후 사용자의 선택에 따라 MATCHED or NOT_MATCHED 로 수정될 수 있습니다.
- sender_exited_at은 시그널을 보낸 사용자가 나간 일시가 저장되고, receiver_exited_at은 시그널 받은 사용자가 나간 일시가 저장됩니다. 해당 컬럼들을 통하여 상대방이 시그널룸을 나간 경우, 해당 채팅방에 들어갔을 때 '더 이상 대화할 수 없는 채팅방입니다' 라는 문구가 표시되며 채팅을 입력할 수 없습니다.
13. signal_message
테이블 설명
- 시그널 룸 내에서 주고받는 메시지(단일)를 저장하는 테이블입니다.
하나의 시그널 룸(signal_room)에는 여러 개의 메시지가 존재할 수 있으며, 메시지의 내용, 송신자, 전송 시간, 읽음 여부 등을 저장합니다.
컬럼 설명
- id
- 설명 : 시그널 메세지 테이블의 PK
- 타입 :
bigint
- 제약 :
NOT NULL PRIMARY KEY AUTO_INCREMENT
- signal_room_id
- 설명 : 시그널 룸 아이디 FK
- 타입 :
bigint
- 제약 :
NOT NULL FOREIGN KEY (signal_room_id) REFERENCES signal_room(id)
- sender_user_id
- 설명 : 시그널을 보낸 사용자 아이디 FK
- 타입 :
bigint
- 제약 :
NOT NULL FOREIGN KEY (sender_user_id) REFERENCES user(id)
- message
- 설명 : 메세지(단일) 내용
- 타입 :
varchar(300)
- 제약 :
NOT NULL
- is_read
- 설명 : 메세지에 대한 읽음 여부
- 타입 :
boolean
- 제약 :
NOT NULL
- 기본값 : FALSE
- send_at
- 설명 : 메세지 전송 일시
- 타입 :
TIMESTAMP
- 제약 :
NOT NULL
- 기본값 : CURRENT_TIMESTAMP
부가 설명
- 메세지의 길이를 기획 상 300자로 제한하여 message의 타입은 varchar(300)으로 지정하였습니다.
- 메세지를 본인이 보낼 경우 is_read는 TRUE로 설정됩니다.
채널
테이블 설명에 앞서, 채널이란 저희 서비스 내에서 "실시간 채팅방" 이라는 단어와 동일한 의미를 가집니다.
아래 설명에서는 ‘채팅방’ 이라는 단어 대신 채널을 사용하겠습니다. 채널은 개인(1:1)과 그룹(1:N)으로 분류되며, 그룹의 경우 시그널을 거치지 않고 생성할 수 있습니다.
14. channel_room
테이블 설명
- 개인, 그룹 채널 목록을 저장하는 테이블입니다.
- 개인의 경우, 시그널 → 채널로 변형되어 넘어오게 됩니다. 최대 인원 수와 현재 인원 수는 모두 2로 고정되며, 최대 인원 수가 2일 경우 ‘개인 채널’로 표시됩니다.
- 그룹의 경우, 처음부터 채널로 생성됩니다. 최대 인원 수는 개설자를 포함하여 3~10까지 지정할 수 있으며, 최대 인원 수가 3 이상일 경우 ‘그룹 채널’로 표시됩니다.
컬럼 설명
- id
- 설명 : 채널 테이블의 PK
- 타입 :
bigint
- 제약 :
NOT NULL PRIMARY KEY AUTO_INCREMENT
- category
- 설명 : 채널 테이블의 카테고리
- 타입 :
varchar(10)
- 제약 :
NOT NULL
- channel_name
- 설명 : 채널 이름
- 타입 :
varchar(20)
- 제약 :
NULL
- channel_content
- 설명 : 채널 상세정보
- 타입 :
varchar(100)
- 제약 :
NULL
- current_user
- 설명 : 채널의 현재 인원 수
- 타입 :
int
- 제약 :
NOT NULL
- max_user
- 설명 : 채널의 최대 인원 수
- 타입 :
int
- 제약 :
NOT NULL
- created_at
- 설명 : 채널 생성 일시
- 타입 :
TIMESTAMP
- 제약 :
NOT NULL
- 기본값 :
CURRENT_TIMESTAMP
- modified_at
- 설명 : 채널 수정 일시
- 타입 :
TIMESTAMP
- 제약 :
NOT NULL
- 기본값 :
CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
- deleted_at
- 설명 : 채널 삭제 일시
- 타입 :
TIMESTAMP
- 제약 :
NULL
부가 설명
- category는 ENUM 형태로 관리됩니다.
- channel_name, channel_content는 그룹 채널일 경우에만 설정할 수 있으므로 NULL이 허용됩니다.
- 개인의 경우, max_user와 current_user 모두 2로 고정되며 max_user가 2인 경우 모두 개인 채널로 간주합니다.
- 그룹의 경우, 최초 개설자가 그룹 생성 시 최대 인원 수를 3~10 중 선택할 수 있으며 3 이상 10 이하인 경우 모두 그룹 채널로 간주합니다.
15. channel_join
테이블 설명
- 어느 채널에, 어떤 사용자가 참여중인지에 대해 저장하는 테이블입니다.
컬럼 설명
- id
- 설명 : 채널 참여 정보 테이블의 PK
- 타입 :
bigint
- 제약 :
NOT NULL PRIMARY KEY AUTO_INCREMENT
- channel_room_id
- 설명 : 채널 테이블의 아이디 FK
- 타입 :
bigint
- 제약 :
NOT NULL FOREIGN KEY (channel_room_id) REFERENCES channel_room(id)
- user_id
- 설명 : 채널 이름
- 타입 :
bigint
- 제약 :
NOT NULL FOREIGN KEY (user_id) REFERENCES user(id)
부가 설명
- channel_join 테이블은 user 테이블과 channel_room 사이의 N:M 연관관계를 해소하기 위한 중간 테이블의 역할을 합니다.
- 복합키(channel_room_id, user_id)를 두지 않은 이유는 ORM 매핑 시 JPA 내에서 다양한 어노테이션으로 복잡한 설정이 필요하며, 다른 테이블이 해당 테이블과 Join하게 될 경우 불필요한 키도 함께 따라오기 때문에 유연성이 떨어진다고 판단하였습니다.
16. channel_message
테이블 설명
- 채널 내에서 오고 간 단일 메세지의 정보에 대해 저장합니다.
컬럼 설명
- id
- 설명 : 채널 메세지 테이블의 PK
- 타입 :
bigint
- 제약 :
NOT NULL PRIMARY KEY AUTO_INCREMENT
- channel_room_id
- 설명 : 채널 테이블의 아이디 FK
- 타입 :
bigint
- 제약 :
NOT NULL FOREIGN KEY (channel_room_id) REFERENCES channel_room(id)
- sender_user_id
- 설명 : 메세지를 보낸 사용자 FK
- 타입 :
bigint
- 제약 :
NOT NULL FOREIGN KEY (sender_user_id) REFERENCES user(id)
- message
- 설명 : 메세지 내용
- 타입 :
varchar(300)
- 제약 :
NOT NULL
- send_at
- 설명 : 메세지 전송 일시
- 타입 :
TIMESTAMP
- 제약 :
NOT NULL
- 기본값 :
CURRENT_TIMESTAMP
부가 설명
- 채널은 1:N 메세지 형태이기 때문에 메세지 읽음 여부 컬럼을 분리하였습니다.
- message는 시그널과 동일하게 varchar(300)으로 제한하였습니다.
17. channel_message_last_read
테이블 설명
- 채널 내 사용자별로 가장 마지막으로 읽은 메세지를 저장하는 테이블입니다.
컬럼 설명
- id
- 설명 : 채널 내 마지막으로 읽은 메세지 테이블의 PK
- 타입 :
bigint
- 제약 :
NOT NULL PRIMARY KEY AUTO_INCREMENT
- channel_id
- 설명 : 채널 아이디 FK
- 타입 :
bigint
- 제약 :
NOT NULL FOREIGN KEY (channel_id) REFERENCES channel_room(id)
- channel_message_last_id
- 설명 : 채널 메세지 테이블의 아이디 FK
- 타입 :
bigint
- 제약 :
NOT NULL FOREIGN KEY (channel_message_last_id) REFERENCES channel_message(id)
- user_id
- 설명 : 메세지를 보낸 사용자 아이디 FK
- 타입 :
bigint
- 제약 :
NOT NULL FOREIGN KEY (user_id) REFERENCES user(id)
- last_read_at
- 설명 : 사용자가 마지막으로 메세지를 읽은 일시
- 타입 :
TIMESTAMP
- 제약 :
NOT NULL
- 기본값 :
CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
부가 설명
- 사용자가 특정 채널의 메세지를 처음으로 읽으면 해당 row가 insert 됩니다.
- 이후 같은 사용자가 같은 채널의 메세지를 읽게 될 경우, channel_message_last_id에 대한 정보만 update되는 방식입니다.
- 채널에 참여하는 사용자마다 모든 메세지에 대한 읽음 여부를 관리하게 될 경우 row가 급증하여 성능적인 문제가 크게 발생할 수 있어 해당 방법을 채택하였습니다.
Index
1. 사용자 계열
테이블 제목 | 적용 컬럼 | 종류 | 이유 |
---|---|---|---|
user | nickname | UNIQUE | 닉네임 중복 차단 |
user | deleted_at | B-Tree | 사용자의 탈퇴 여부 조회 |
user_oauth | (provider_id, provider) | B-Tree (Composite) | 소셜 로그인 하나당 한 사용자만 생성 가능 |
2. 관심사 계열
테이블 제목 | 적용 컬럼 | 종류 | 이유 |
---|---|---|---|
user_interests | user_id | B-Tree | 특정 유저의 관심사 리스트 조회 |
user_interests | category_item_id | B-Tree | 해당 카테고리를 고른 사용자 조회 |
user_interests | (user_id, category_item_id) | UNIQUE | 선택 관심사 중복 방지 |
3. 튜닝리포트 계열
테이블 제목 | 적용 컬럼 | 종류 | 이유 |
---|---|---|---|
tuning_report | (created_at, deleted_at) | B-Tree (Composite) | 튜닝 리포트 내 삭제되지 않은 최신 튜닝리포트 조회 |
tuning_report_user_reaction | report_id | B-Tree | 리포트 별 리액션 집계 |
tuning_report_user_reaction | user_id | B-Tree | 특정 사용자가 선택한 리액션 조회 |
4. 알림 계열
테이블 제목 | 적용 컬럼 | 종류 | 이유 |
---|---|---|---|
alarm | (created_at, deleted_at) | B-Tree (Composite) | 알림창 내 삭제되지 않은 최신 알림 조회 |
user_notification | (user_id, is_read) | B-Tree (Composite) | 알림창 내 읽은 알림/읽지 않은 알림 빠르게 조회 |
alarm_report | PK = FK | - | 부모 alarm 테이블과 1:1 매핑 |
alarm_notification | PK = FK | - | 부모 alarm 테이블과 1:1 매핑 |
5. 시그널 계열
테이블 제목 | 적용 컬럼 | 종류 | 이유 |
---|---|---|---|
signal_room | sender_user_id | B-Tree | 사용자가 보낸 시그널 조회 최적화 |
signal_room | receiver_user_id | B-Tree | 사용자가 받은 시그널 조회 최적화 |
signal_room | user_pair_signal | UNIQUE | 두 사용자 간 중복 시그널 생성 방지 |
signal_message | is_read | B-Tree | 새로운 메세지 여부 판별 |
6. 채널 계열
테이블 제목 | 적용 컬럼 | 종류 | 이유 |
---|---|---|---|
channel_room | category | B-Tree | 카테고리 별 채널 조회 |
channel_room | (created_at, deleted_at) | B-Tree (Composite) | 카테고리 별 채널 조회 |
channel_join | user_id | B-Tree | 사용자별 가입한 채널 조회 |
channel_join | (channel_room_id, user_id) | UNIQUE | 채널 내 중복 가입 방지 |
channel_message_last_read | (last_read_at, user_id) | B-Tree (Composite) | 사용자별 마지막으로 읽은 메세지 조회 |