2010-04-20 3 views
11

메시지 내용과 함께 발신자와 수신자를 추적해야하는 개인 메시징 시스템을 선택하십시오. MySQL을 사용한다면 여러 개의 테이블을 가질 수 있지만 MongoDB를 사용하면 모든 것을 피하려고 노력할 것입니다. 확장 가능하고 유지하기 쉬운 "좋은"스키마를 고안하려고합니다. 만약 내가 mysql을 사용했다면, 나는 사용자와 메시지를 참조 할 별도의 테이블을 가지게 될 것이다. 테이블MongoDB를 사용하여 개인용 메시징 시스템을 추적하는 방법은 무엇입니까?

프로필 ... 아래를 참조

user_id 
first_name 
last_name 

메시지 테이블

message_id 
message_body 
time_stamp 

내가 어떤 메시지를 조회 할 수 있습니다

위의 스키마와
user_id (FK) 
message_id (FK) 
is_sender (boolean) 

, user_message_ref 테이블 "그 밥 "은 그가받는 사람이든 보낸 사람이든 상관없이 가질 수 있습니다.

이제 MongoDB와 작동하는 스키마로 변환하는 방법. 메시지를 보관할 별도의 컬렉션이 있다고 생각합니다. 문제는 발신자와 수신자를 어떻게 구분할 수 있습니까? Bob이 로그인하면 무엇을 쿼리합니까? Bob이 전자 메일을 시작했는지 여부에 따라 메시지가 사용자에게 속하는지 여부를 확인하기 위해 "보낸 사람"및 "받는 사람"에 대해 쿼리 할 필요가 없습니다.

나는 MongoDB의 메시지 그룹에 올랐다. 각 메시지는 "블로그"게시물로 취급됩니다. 메시지가 작성되면 두 사람의 사용자 (송신자/수신자가 누구인지는 중요하지 않음)를 배열에 추가하십시오. 이후의 각 응답은 주석으로 처리되어 배열에 삽입됩니다.

MESSAGES은 "user_msgs"배열을

{ 
    "_id" : <objectID>, 
    "users" : ["bob", "amy"], 
    "user_msgs" : 
     [ 
      { 
       "is_sender" : "bob", 
       "msg_body" : "Hi Amy, how are you?!", 
       "timestamp" : <generated by Mongo> 
      } 
      { 
       "is_sender" : "amy", 
       "msg_body" : "Bob, long time no see, how is the family?!", 
       "timestamp" : <generated by Mongo> 
      } 
     ] 
} 

포함 나는 메시지를 조회 할 수 있습니다이 방법은 "밥을"루프. 발신자가 누구인지 알 수 있고 타임 스탬프별로 정렬 할 수 있습니다.

+0

멋진 디자인 같아요. 그러나 나는 한 가지 문제에 봉착했다. 대화 스레드를 구현하고 싶습니다. 따라서 사용자가 메시지를 열면 모든 대화 스레드의 모든 마지막 메시지를 보게됩니다 (보내거나받은 메시지는 중요하지 않습니다). 그래서 Bob은 Amy와 Chris 그리고 Ann과 마지막으로 교환 된 메시지를 볼 것입니다. (예를 들어 LinkedIn에서이 방법으로 작동합니다). 그러나 나는이 질문을하는 방법을 모른다. 따라서 현재의 스키마에서는 Bob이 참여한 모든 '블로그 게시물'에 대해 내장 된 배열에서 마지막 메시지 하나만 가져와야합니다. 어떤 아이디어? – maret

답변

2

알아 냈어. 위의 내 설명을 원본 게시물에서 확인하십시오.

+0

일종의 알림을위한 'is_read'속성을 놓치셨습니까? 없으면 어떤 스키마입니까? –

1

두 컬렉션 (사용자 및 메시지) 사이에 어떤 종류의 링크가 필요합니다.

개인적으로, 나는 간단하게이 같은 보낸 사람과받는 사람, 뭔가의 ID를 추적하기 위해 두 개의 추가 필드를 추가 :

{ 
    _id: /* whatever_id */, 
    message_body: "This is the message", 
    date_sent: 2010-04-20T10:35, 
    sender_id: /*id_of_sender*/, 
    recipient_id: /* id_of_recipient */ 
} 

sender_idrecipient_id 필드는 단지 해당 사용자에 대한 값을 보유 할 (아마도 ObjectID 일부 인스턴스, 사용자가 원하는대로 할당 할 수 있음)는 사용자 컬렉션의 해당 항목에 대한 _id 필드에 해당합니다. 이러한 메시지를 적절히 쿼리하여 사용자가 보낸 메시지를 가져올 수 있습니다 (또는 개수를 계산할 수 있습니다).

또 다른 접근법은 동일한 것을 효과적으로 수행하는 것일 수 있지만 발신자와 수신자에게 ID를 넣는 것보다는 공식적인 DBRef을 사용하는 것이 좋습니다. 이것은 아마도 잘 작동하지만 나는 이전 솔루션은 단순하고 쿼리하기가 더 쉽기 때문입니다.

두 솔루션 모두 적절한 "사용자"문서를 잡기 위해 (예 : "보낸 사람"및 "받는 사람"이름을 표시하기 위해) DB로 다시 왕복해야합니다.


편집 :
그것은 내가 당신이 달성하려고하는 어떤 오해 나타납니다 - 나는 페이스 북 메시징 스레딩의 개념을 통합 몰랐다. 그러나 위에서 제시 한 해결책은 소리가납니다. 개인적으로, 나는 그들의 이름 (앨리스 & 밥)보다는 사용자의 ID를 고수 할 것이지만, 그것과는 별개로 꽤 실행 가능해 보인다.

+0

이렇게하면 "스레딩"이 악몽이됩니다. 나는 대화식 형식으로 이것을 페이스 북에 보여줄 수는 없습니다. – luckytaxi

+0

흠, 페이스 북의 메시징에 익숙하지 않습니다. 방금 각 메시지가 자체 엔티티라고 가정하고, 스레딩의 개념이 있다는 것을 깨닫지 못했습니다. 내가 오해 한 경우 사과드립니다. –

+0

안녕하세요. 처음에는 당신의 아이디어를 생각해 보았습니다. 다른 트위터를 만들면 말이됩니다. 그래도 조언 주셔서 감사합니다! – luckytaxi

관련 문제