효율적인 채팅방 DB 설계 및 정렬 관리

shjk·2025년 4월 11일

1. 문제 정의

플랫폼 내 채팅방은 독립적으로 존재하거나 여러 채팅방을 하나의 그룹으로 묶을 수 있다. 사용자는 단독 채팅방과 그룹의 순서를 자유롭게 변경할 수 있어야 하며, 데이터베이스 부하를 최소화하고 빠른 데이터 조회 성능을 보장할 필요가 있다. 다음과 같은 채팅방 구성을 예시로 들 수 있다.

채팅방3, 채팅방5, 그룹2(채팅방4, 채팅방1), 채팅방7, 그룹1(채팅방6, 채팅방2)

2. 해결 방안: 별도의 정렬 테이블 활용

효율적인 관리를 위하여 두 개의 테이블을 사용한다.

(1) ChatRoomsOrder 테이블

플랫폼에 소속된 모든 단독 채팅방과 그룹의 전체적인 순서를 관리한다.

컬럼설명
id기본 키(UUID)
platform_id플랫폼 ID(UUID), 인덱스 설정
position항목의 전체적인 순서를 나타냄
item_type항목 유형("room" 또는 "group")
item_idChatRoom 또는 ChatRoomGroup ID(UUID)

예시 데이터는 다음과 같다.

PositionItemTypeItemID
1roomID_CHAT_ROOM_3
2roomID_CHAT_ROOM_5
3groupID_GROUP_2
4roomID_CHAT_ROOM_7
5groupID_GROUP_1

(2) GroupChatRoomsOrder 테이블

각 그룹 내의 채팅방 순서를 별도로 관리한다.

컬럼설명
id기본 키(UUID)
group_id그룹 ID(UUID), 인덱스 설정
position그룹 내 채팅방의 순서
chat_room_id그룹에 속한 채팅방 ID(UUID)

예시 데이터는 다음과 같다.

  • 그룹2의 예시:
GroupIDPositionChatRoomID
ID_GROUP_21ID_CHAT_ROOM_4
ID_GROUP_22ID_CHAT_ROOM_1
  • 그룹1의 예시:
GroupIDPositionChatRoomID
ID_GROUP_11ID_CHAT_ROOM_6
ID_GROUP_12ID_CHAT_ROOM_2

3. 쿼리 및 운영 방식

  • 플랫폼 전체 항목 조회:

    SELECT * FROM chatrooms_order
    WHERE platform_id = ?
    ORDER BY position;
  • 그룹 내 채팅방 조회:

    SELECT * FROM group_chatrooms_order
    WHERE group_id = ?
    ORDER BY position;

4. 설계의 이점

  • 빠른 데이터 조회 성능: 인덱스를 활용하여 데이터 조회 시 빠른 속도 보장(O(log N))
  • 구조적 명확성: 별도 정렬 테이블을 이용하여 명확하고 관리가 용이한 구조를 제공
  • 유연한 사용자 정렬: 사용자가 원하는 대로 채팅방 및 그룹 순서 변경이 자유롭게 가능

본 설계는 사용자가 지정한 채팅방의 순서를 효율적이고 유연하게 관리할 수 있는 구조를 제공하며, 데이터베이스의 부하를 최소화하여 성능을 최적화한다.

profile
백엔드 개발자

0개의 댓글