프로젝트

프로젝트 기본 ERD 다이어그램 설계

Debin 2022. 5. 3.
반응형

우선 프로젝트를 시작하면서 제일 먼저 구현할 기능을 게시판으로 정했습니다.

이에 따라 게시판을 먼저 구현하고 추가적인 기능을 더해가려고 합니다.

툴은 Aquery Tool을 사용했으며, 아래와 같은 엔티티(테이블)를 4개 작성했습니다.

M : N 관계를 풀기 위한 중간 테이블도 하나 작성했습니다.

  1. Member - 게시판을 사용할 유저들의 정보를 저장할 테이블입니다.
  2. Post - 게시판을 사용할 때 게시글을 작성하면 그에 대한 정보를 저장할 테이블입니다.
  3. Comment - 게시글이 있으면 댓글을 달아야 소통이 이루어지므로, 댓글에 관련된 데이터를 저장할 테이블입니다.
  4. Alarm - 개인적으로 고민을 정말 많이 한 테이블입니다. 결국 소통을 하기 위해서는 게시글에 댓글이 달리거나, 댓글에 대댓글이 달려야하는데 이를 알려주는 알람에 대한 정보를 저장하는 테이블입니다.

아래는 작성한 ERD 다이어그램 이미지입니다. 본격적으로 자세히 제 생각을 설명해보겠습니다.

작성한 ERD 다이어그램

먼저 Member 테이블입니다.

멤버 테이블

  • 기본키인 user_id
  • 유저 이메일과, 유저가 로그인할 때 필요한 로그인 아이디와 비밀번호가 있습니다.
  • 유저 닉네임과 유저 이름이 존재하고, 논리적 삭제를 지원하고 더 많은 상태를 제공할 예정이기 때문에,
    status를 VARCHAR을 사용했습니다
  • 특별한 부분이 없다고 생각합니다. 이후에 소셜 로그인을 진행하면 그 때 소셜 로그인 관련 애트리뷰트를 추가할 예정입니다.

다음은 POST 테이블입니다.

게시글 테이블

  • 당연히 기본키 post_id가 존재합니다.
  • 게시글의 제목 title, 게시글의 내용 content, 작성한 날짜 created_at가 있습니다.
  • 작성자를 역추적할 수 있게 member_id를 외래키로 두었습니다.
  • 논리적 삭제를 지원할 예정입니다. 활성화와 비활성화만 지원하려고 하므로 Boolean을 위해 TINYINT로 타입을 설정했습니다.

본인은 유저가 좋아요를 누른 게시글을 한 번에 보여주는 기능을 구현하고 싶습니다.

따라서 유저가 좋아요를 게시글에 누르는 것을 다대다 관계로 해석했습니다. 이에 따른 중간 테이블입니다.

중간 테이블

  • 테이블의 기본키인 like_post_id가 존재하고, 좋아요를 누른 유저와, 좋아요를 받은 게시글의 아이디가 각각 존재합니다.
  • like는 2가지 고민이 있었습니다.
  • 먼저 첫 번째 방법은 like 애트리뷰트를 만들고 일정 시간을 마다 모든 행을 count하고 그 값을 저장하는 방법입니다.
  • 두 번째 방법은 like를 저장하는 애트리뷰트를 만들지 않고 해당 게시글을 가져올 때마다 count를 해서 값을 가져오는 것입니다.
  • 예전에 공부하면서 두 번째 방법을 computing field라고 들은 것 같습니다.
  • 첫 번째 방법은 좋아요가 엄청나게 많이 발생하는 인플루언서들에게 효과적인 방법 같다고 생각하여, 두 번째 방법을 채택했습니다.

Comment 테이블입니다.

  • 먼저 기본키인 comment_id가 있습니다.
  • 유저가 댓글에 작성한 내용인 content가 있습니다.
  • 댓글 좋아요로는 유저를 추적하지 않을 생각이므로 like를 int 타입으로 정했습니다.
  • 작성일 created_at가 존재하고, 댓글이 달린 게시글의 아이디 post_id를 가지고 있습니다.
  • 댓글을 작성한 유저의 user_id를 저장하고, 대댓글인 경우에는 부모 댓글의 id(parent_id)를 저장합니다.
  • 이 경우에는 부모 댓글의 여부를 확인하고, 메소드를 구분해 댓글을 생성할 생각입니다.

마지막으로 제일 고민한 Alarm 부분입니다.

알람 테이블

  • 먼저 기본키인 알람 아이디가 존재한다.
  • 잘 생각해보면 현재 게시판에서는 무조건 댓글의 알람만 달린다. 따라서 알람을 울리는 댓글의 아이디를 가진다.
  • 알람 받을 대상 target_id를 가진다. 2가지 경우를 생각했다.
    1. 게시글을 작성하고 댓글이 달리면 이는 게시글 작성자에게 알람이 간다.
    2. 게시글이 작성된 후 댓글이 달렸다. 이후 대댓글이 달렸는데 이 대댓글에 대한 알람은 부모 댓글 작성자에게 알람이 간다.
  • 뭔가 찜찜한 구석이 있는데 게시글 작성자는 모든 알람을 받아야 한다고 생각해서.. 이는 제 생각에 변화가 있으면 수정하도록 하겠습니다.
  • 또 알람을 읽었는지 확인하기 위해 read_at 이라는 애트리뷰트를 두었습니다.
  • 마지막으로 생성된 날짜 create_at가 있습니다.

이렇게 뿌리가 될 게시판의 ERD 다이어그램 설계를 마쳤습니다. 간단한 5개의 테이블이지만 엄청나게 고민한 것 같습니다.

이제 API 디자인 책을 읽기 전, 제가 API를 디자인해보려고 합니다. 책을 읽고 다시 디자인 했을 때 변화한 차이가 궁금해서 이렇게 정했습니다. 이상으로 ERD 다이어그램 설계 설명을 마칩니다.

 

계속 고민할 부분

  • 사진, 동영상을 저장할 미디어 테이블을 만들고 이를 활용. S3를 써보고 싶습니다.
  • 소셜 로그인을 진행하고 싶으므로, 데이터베이스도 차후에 좀 더 수정할 예정입니다. 일단은 기본에 충실하려고 합니다.
  • 나중에는 게시판 알림말고 다른 알람도 만들어보려고 합니다. 알람 target에 대해서도 계속 고민할 예정입니다.
  • 댓글을 만약 계단식으로 디자인한다면 데이터베이스 애트리뷰트에 level이라는 것을 추가하고 API로 응답해 프론트에서 구현하는데, 이걸 현재 내 능력에서 프론트로 구현할 수 있을까.

이상으로 포스팅을 마치겠습니다. 감사합니다.

반응형

댓글