[TIL] 채팅 기능 ERD 설계

·2023년 1월 8일
4

킁킁메이트

목록 보기
3/10
post-thumbnail
post-custom-banner

ERD 연습 - 카카오톡
해당 영상을 참고해가며 학습했습니다!

메인 프로젝트가 시작되었다. 여러가지 기능들이 있었는데 그 중 채팅 기능이 눈에 들어와서 적극적으로 제가 해보겠습니다.를 어필했다.

호기롭게 시작했으나 까놓고 보니 내 실력에는 너무 고난이도의 기능이었다🙀 차근차근 짚어나가보기 위해 ERD 설계부터 시작해보겠다!

1. 개념적 데이터 모델링

회원에 대한 속성은 차치하고 회원-채팅 관계에만 집중해서 작성했다.

채팅이 아니라 채팅방으로 개체를 설정한 이유는 채팅방이라는 정해진 공간 안에서 여러개의 메세지를 주고 받기 때문이다.

☝️ 여기서 생각해봐야 할 문제!

  • 회원은 여러 개의 채팅방을 가질 수 있다.
  • 채팅방은 여러 명의 회원을 수용할 수 있다.
    회원-채팅방의 관계는 N:N 관계로 이루어져 있다.

2. 논리적 데이터 모델링

N:N 관계의 Join테이블 만들기

회원-채팅방의 관계는 N:N으로 확립되었으므로, 채팅 참여라는 Join 테이블을 만들어 회원-채팅참여-채팅방의 관계를 1:N:1로 변경해주었다.

이렇게 구성해주면 채팅방 입장에서는 1번 채팅방에 참여한 회원들의 목록을 볼 수 있고, 회원 입장에서는 1번 회원이 참여한 채팅방의 목록을 확인할 수 있다.

🚨주의해야 할 점
회원-채팅참여-채팅방 연관 관계는 식별 관계로 매핑되었다!
식별 관계 : 부모 테이블의 기본키 또는 유니크 키를 자식 테이블의 기본키로 사용
비식별 관계 : 부모 테이블의 기본키 또는 유니크 키를 자식 테이블의 기본키로 사용하지 않고 외래키로 사용하는 관계

채팅 메세지

🚨현재 설계된 것을 확인하면 채팅방 테이블 내에 채팅 메세지가 존재한다. 이렇게 되면 메세지를 한번 보낼 때마다, 중복값을 가진 row가 끝도 없이 늘어나게 된다.

따라서 채팅 메세지라는 별도의 테이블을 만들어 연관 관계를 맺어줘야 할 필요가 있다.

한가지 궁금점🤔
채팅 메세지는 채팅방에 연결 되어야 할까? 그러면 채팅을 보내는 회원과의 관계는 어떻게 매핑해야 하지?

⭐ 채팅 메세지가 꼭 알고 있어야 할 정보를 생각해보자
1. 채팅 메세지를 보내고, 받는 회원의 정보를 알아야 한다.
2. 채팅 메세지를 보낼 채팅방의 정보를 알아야 한다.

회원의 정보, 채팅방의 정보를 다 가지고 있는 테이블이 하나 보인다! 바로 Join 테이블인 채팅 참여 테이블이다.

이때 채팅 참여-채팅 메세지비식별 관계를 가지며 메세지 아이디를 PK로 설정한다.

채팅 메세지 테이블의 문제점

채팅 참여-채팅 메세지비식별 관계를 가지며 메세지 아이디를 PK로 설정하게 되면, 모든 회원의 대화방에 순차적으로 ID값이 부여될 것이다. 이는 위에서 채팅방 테이블 속성으로 메세지를 넣은 것과 같은 결과를 불러오게 된다.

🤔 그러면 뭐 어쩌라는거야??

채팅 메세지는 하나의 채팅방에 귀속되어 있음을 생각해보자!
만약 1번 채팅방에 1번 메세지, 2번 메세지..., 2번 채팅방에 1번 메세지, 2번메세지... 식으로 저장되면 어떨까?

🤓☝️ 채팅방 아이디에 종속적인 채팅 메세지 아이디로 만들자!

메세지 테이블에서 채팅방 아이디를 기본키로 만들고, 그 밑에 종속되어 있는 메세지 아이디를 만들면 된다. 이렇게 되면 메세지 아이디는 자동으로 번호가 부여되지 않는 단점이 있다.

이제 채팅을 어떻게 구현할 것인지..어떻게 저장할 것인지만 생각해보면 된다...아자아자화이팅😇

profile
🧑‍💻백엔드 개발자, 조금씩 꾸준하게
post-custom-banner

0개의 댓글