1. 데이터베이스 설계

더 나은 커뮤니티를 위해✨


💥설계 이후 필요한 기능 및 잘못된 구성으로 변경이 있어 수정.


데이터베이스를 설계할 때 아주 유용하게 사용한 서비스가 있다.

dbdiagram인데, 관계형 데이터베이스를 간단한 코드로 설계할 수 있다!


Database Design

이렇게 하면 고치기도 쉽고, 릴레이션 간 관계를 파악하기도 쉽다.

export하면 .sql파일로 나와 바로 이식할 수도 있다!


어떤 릴레이션이 필요한가?

커뮤니티 앱에서 반드시 필요한 것은 다음과 같다.

  • 회원 정보
  • 게시판
  • 게시글
  • 댓글
  • 대댓글
  • 블라인드 기능!

요구사항은 위와 같으며, 게시판은 한 곳에 몰아 넣지 않도록 여러 개로 구성했다.

그럼 회원 정보부터 설계해보자.


회원 정보 테이블

userprivate_user 테이블이 있다.

user 테이블

일반적인 사용자 정보를 저장하는 테이블이다.

회원가입 시 받은 이메일, 비밀번호, 닉네임, 학부를 어트리뷰트로 하며, 하나의 튜플로 저장한다.

이 정보 중 닉네임과 학부는 글 작성, 댓글 및 대댓글 작성 시 노출되는 정보로 한다.

private_user 테이블

서비스 이용자가 학부생이 운영하는 데이터베이스에 자신의 정보가 저장된다는 것에 거부감을 느낄 수 있으므로,

user 테이블과 연관성이 없도록 해야 하며, 현재 활동 중인 회원인지, 탈퇴한 회원인지 확인하는 용도의 테이블이다.


어트리뷰트는 id, student_email, status, register_at, quit_at이며,

학교 인증 시 이메일과 가입일을 저장한다.

(🔥 학교 이메일로 계정이 활성 상태인지 확인해야 하며, 자체로 Unique하므로 id를 제거하고 student_email을 PK로 한다.)

탈퇴 시 n일간 재가입 불가를 위해 탈퇴 시 quit_at 어트리뷰트 값을 가져와 대조하도록 한다.


board 테이블

여러 게시판의 이름과 우선순위를 저장하는 테이블이다.

우선순위를 받는 이유는, 웹 서비스 시 메뉴 바에 나타나는 순서를 정해주기 위한 것이다.

게시판의 이름은 unique하므로 이를 PK로 설정했다.


free_board 테이블

게시글 리스트를 저장하는 자유게시판으로, 세부 게시판은 대부분 이와 비슷하게 설계했다.

어트리뷰트는 id, title, content, user_id, write_at, like, dislike이다.

게시글을 보여줄 때, write_at 값 중에서 최신 순으로 정렬하여 보여주도록 한다.


베스트 게시물 설계 시, likedislike를 적절하게 고려하여 정렬하도록 한다.


free_comment 테이블

자유게시판에 작성된 모든 댓글, 대댓글을 저장하는 댓글 테이블이다. 세부 게시판 댓글은 대부분 이와 비슷하게 설계했다.

어트리뷰트는 id, user_id, comment, post_id, class, order, groupNum, like, dislike, comment_at이다.

  • user_id: 댓글, 대댓글 작성자 확인
  • post_id: 댓글, 대댓글이 작성된 원 게시물 확인
  • class: 댓글, 대댓글 구별을 위함. (class 0 = 댓글, class 1 = 대댓글)
  • order: 댓글을 작성 시점 순으로 정렬하기 위함
  • groupNum: 댓글의 경우 댓글의 인덱스를, 대댓글의 경우 댓글의 인덱스를 값으로 갖는다. 댓글의 하위 요소를 파악하기 위함


blind 테이블

사용자는 특정 사용자를 블라인드할 수 있는데, 블라인드 설정 시 사용자의 게시글, 댓글, 대댓글을 보이지 않도록 한다.

어트리뷰트는 user_id, target_id로, user_id는 사용자, target_id는 해당 사용자가 블라인드한 사용자 id를 말한다.

한 사람이 여러 명을 블라인드할 수 있으므로, Primary Key는 user_idtarget_id를 묶어 복합키로 만든다.



향후 게시판, 서비스 기능을 추가하면서 테이블 추가 설계 또는 재설계가 이루어질 수 있는데, 발생할 때마다 포스트로 다루겠다.

테이블 사용 시나리오도 작성했으니, 백엔드 설계하면서 값이 잘 들어가는지, 관계는 이상이 없는지, 정규화를 만족하는지 체크하면서 진행하면 되겠다.


like, dislike 테이블

사용자는 특정 게시물의 좋아요, 싫어요 버튼을 클릭할 수 있으며, 좋아요 / 싫어요 버튼을 클릭했을 때 상태가 유지되어야 한다.

한 사람이 여러 게시글을 좋아요 / 싫어요 할 수 있으므로 사용자 id와 좋아요 / 싫어요를 누른 게시글의 id를 복합키로 관리해야 한다.

현재 계획은 댓글, 대댓글도 좋아요 / 싫어요 버튼을 구현하는 것이므로, 댓글, 대댓글에 대한 like, dislike 테이블 또한 구성되어야 할 것이다.