메시지 내용과 함께 발신자와 수신자를 추적해야하는 개인 메시징 시스템을 선택하십시오. 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>
}
]
}
포함 나는 메시지를 조회 할 수 있습니다이 방법은 "밥을"루프. 발신자가 누구인지 알 수 있고 타임 스탬프별로 정렬 할 수 있습니다.
멋진 디자인 같아요. 그러나 나는 한 가지 문제에 봉착했다. 대화 스레드를 구현하고 싶습니다. 따라서 사용자가 메시지를 열면 모든 대화 스레드의 모든 마지막 메시지를 보게됩니다 (보내거나받은 메시지는 중요하지 않습니다). 그래서 Bob은 Amy와 Chris 그리고 Ann과 마지막으로 교환 된 메시지를 볼 것입니다. (예를 들어 LinkedIn에서이 방법으로 작동합니다). 그러나 나는이 질문을하는 방법을 모른다. 따라서 현재의 스키마에서는 Bob이 참여한 모든 '블로그 게시물'에 대해 내장 된 배열에서 마지막 메시지 하나만 가져와야합니다. 어떤 아이디어? – maret