당근마켓 ER Diagram (2차 수정본)

ik_13038·2022년 8월 22일
0

라이징캠프 3주차

목록 보기
5/6

당근마켓 ER Diagram (2차 수정본)


링크
1차와 비교했을 때 크게 달라진 것은 없으나
채팅 관련해서 쿼리문을 만져보면서 조금 수정했다.

수정사항

  • 채팅 -> 사진 관련 테이블을 삭제했다.
    생각해보니 유형을 그냥 텍스트로 정하거나 사진 URL로 정하는 등의 status 속성을 하나 만들어주면 데이터 공간을 추가로 만들 필요가 없을 것 같다는 생각이 들었다.
    단, 일정 관련 테이블은 채팅 당 하나만 있는 1대1관계로 구현하여 한 번 정하면 그걸 계속 수정해서 쓰는 방식으로 만들기를 원해서 (사실 당근에서는 안 써본 기능이라 임의로 수정해봤다..) 따로 구현했다.

기타 느낀 점

그리고 본격적으로 데이터를 여러 개 넣고 쿼리문을 구현해보려고 노력했는데
이게 SQL문을 제대로 공부해본 적이 없어서 그런가 너무 어렵다..
1주차 때 문법 제대로 뗄걸 그랬다. 눈물을 머금고 급하게 저번에 대충 훑어본 MySQL 문법을 훑어보았다만 어려운 건 마찬가지였다.

오늘은 ERD 조금 수정하고 리야님이 제공해준 강의를 보고 조금 임의로 따라 쳐 보면서 연습한 정도로 마쳤다.

리야님 예시의 카톡방은 카카오톡이 단순 1대1 방이 아닌 모임도 가능한 채팅방이기에 Member 테이블을 따로 만들었던 것 같은데 개인적으로 당근은 1대1 채팅방이라 멤버 테이블이 필요 없다고 생각하여 구현하지 않았었다.

근데 그 정도로 미약한 차이임에도 예시와 비슷한 구현을 하기 위해서는 많은 시간이 필요했다. SQL 쿼리문과 빨리 친해져야겠다.


위의 1번과 2번은 말그대로 채팅 DB 내 어떤 내용이 들어가 있는지 조회한 쿼리이다.

각 1번, 2번의 채팅방에 마지막에 올라온 채팅에 대한 정보를 조회하는 쿼리문은 아래와 같다. 3학년 때 DB 시험 때도 아래처럼 긴 쿼리문 만든 적이 없던 것 같은데 ㅎㅎ 얼른 익숙해져야겠다.

select ChatRoom.crId, imgUrl as RoomImgUrl, userId as roomName, forLastMessage.chatsId, forLastMessage.lastContent,
       case when TIMESTAMPDIFF(HOUR, forLastMessage.lastMessageTime, current_timestamp) >= 1 then ' 최소 1시간 전'
        else DATE_FORMAT(forLastMessage.lastMessageTime, '%p %H : %i') end as lastMessageTime,
       forLastMessage.lastMessageType
from ChatRoom
inner join User on ChatRoom.sellerId = userId
inner join (select Chats.crId, Chats.chatsId, Chats.content as lastContent, Chats.createdAt as lastMessageTime
            ,Chats.type as lastMessageType from Chats
inner join (select Chats.crId, max(chatsId) as maxChatsId from Chats group by crId) lastMessage
where maxChatsId = Chats.chatsId) as forLastMessage on ChatRoom.crId = forLastMessage.crId
group by forLastMessage.crId;

요구하는 결과대로 각 채팅방 내 마지막 채팅 내용, 그리고 시간 정보 등등이 나온다. roomName은 당근마켓에서 상대 유저 이름이 보임에 따라 그 유저 이름을 불러왔고, RoomImgUrl도 상대 프로필 사진이 보인다.

profile
글 연습, 정보 수집

0개의 댓글