개발자
안녕하세요:) 저는 ! 웹소켓과 관계형디비+프리즈마 를 이용해서 백엔드를 구성하고, 리액트로 만든 프론트 와 양방향 채팅 서비스를 만들려고 합니다! 채팅방 DB스키마를 작성하는데 어려움을 겪어 질문을 남깁니다. 현재 프리즈마에서 model ChatRoom { id Int @id @default(autoincrement()) name String creatorId Int users ChatRoomUser[] messages Message[] createdAt DateTime @default(now()) updatedAt DateTime @updatedAt } model ChatRoomUser { id Int @id @default(autoincrement()) userId Int // 외부 API에서 가져올 사용자 ID chatRoomId Int chatRoom ChatRoom @relation(fields: [chatRoomId], references: [id]) createdAt DateTime @default(now()) updatedAt DateTime @default(now()) @@unique([userId, chatRoomId]) } model Message { id Int @id @default(autoincrement()) chatRoomId Int senderId Int // 외부 API에서 가져올 사용자 ID receiverId Int? // 선택적 필드, 단체 채팅에서는 null content String timestamp DateTime @default(now()) chatRoom ChatRoom @relation(fields: [chatRoomId], references: [id]) createdAt DateTime @default(now()) updatedAt DateTime @default(now()) } 이런식으로 구현하였는데 조언좀 부탁드립니다.ㅠㅠ
답변 0
첫 답변을 기다리고 있어요.
지금 가입하면 모든 질문의 답변을 볼 수 있어요!
현직자들의 명쾌한 답변을 얻을 수 있어요.
이미 회원이신가요?
커리어리 AI 봇
GPT가 달아주는 답변입니다.
2024년 07월 05일
네, 제공해주신 스키마를 보니 공통적인 채팅 앱의 요구사항을 잘 구현하셨습니다. - ChatRoom: 채팅방에 관련된 정보와 각 방이 어떤 사용자들과 연결되어 있는지, 그리고 방에서 보낸 메시지들이 무엇인지 추적할 수 있습니다. - ChatRoomUser: 이 테이블은 "관계" 테이블로 작동하여 각 사용자가 어느 채팅방에 속해 있는지 기록합니다. - Message: 메시지 내용 및 메시지가 어떤 채팅방과 연결되어 있는지 추적합니다. 아래 몇 가지 추가적으로 고려해 볼 사항들입니다: 1. User 모델: 유저에 대한 상세 정보를 담고 있는 모델도 있으면 좋겠네요. 외부 API에서 가져올 userId만 있으면 불충분 할 수 있습니다. 2. senderId, receiverId: 현재는 Message 테이블에서 직접 외부 API의 userId를 참조하고 있는데, 이것을 User 테이블의 Id를 참조하도록 바꾸면 더욱 유연성을 가질 것입니다. 그러면 해당 Id를 가진 User가 무슨 Message를 보냈는 지, 어떤 Message를 받았는지 쉽게 추적할 수 있습니다. 3. receiverId 필드: 현재 이 필드가 선택적 필드로 구현되어 있는데, 단체 채팅방에서는 모든 사용자에 대한 별도의 메시지 항목을 만들기 보다는, 방 자체로 메시지를 전송하는 것이 더 효율적일 수 있습니다. 그러므로 이 필드는 제거하는 것을 고려해보세요. 4. message order: 각 채팅방 내에서 메시지 순서를 보장하지 못한다면 사용자 경험이 좋지 않을 수 있습니다. 따라서 각 메시지 항목에 순서를 나타내는 sequence_number와 같은 필드를 추가하면 좋겠네요. 5. 접근 제어: 특정 유저가 방에 가입하거나 탈퇴하고, 메시지를 읽거나 삭제할 때 권한을 체크하는 로직이 애플리케이션 코드 안에서 처리되어야 합니다. 스키마 설계는 프로젝트의 요구사항과 크게 관련이 있으니, 개발 중에 스키마가 조금 변할 수도 있다는 점 꼭 기억하세요!
지금 가입하면 모든 질문의 답변을 볼 수 있어요!