2016-08-04 2 views
2

node.js, redis, socket.iomongodb으로 채팅 앱을 개발 중입니다. MongoDB는 메시지를 지속시키기 위해 마지막으로 온다.채팅 메시지를 mongodb 컬렉션에 저장하는 것이 좋습니다.

제 질문은이 마지막 단계에서 가장 좋은 방법은 무엇입니까?

난 당신이 어떻게 생각하십니까,

{ 
    id, 
    from, 
    to, 
    datetime, 
    message 
} 

너무 빨리 너무 큰 얻을 수 같은 모든 메시지가있는 컬렉션을 두려워하고, 독서 목적을 위해 매우 느린 얻을 것입니다?

더 나은 접근 방법이 있습니까?

+0

채팅은 두 사람 사이에서만 가능하거나 사람 그룹도 거기에있을 수 있습니까? – Shrabanee

+0

두 사람 만 – R01010010

답변

1

DB 구조가 문제가 아니라고 생각합니다.

각 쌍 간의 채팅에는 unique id을 할당하고 채팅의 각 기록에 유지할 수 있습니다. 그것을 보여주고 싶을 때 그것을 바탕으로 검색하십시오.

는 그래서 DB 구조가 될 수 있습니다 A와 B

에 대한 채팅을 표시 할 때 12을 기반으로해야 검색, 12는 A와 B 사이의 대화의 고유 ID입니다 말처럼 : -

{ 
    id, 
    from, 
    to, 
    datetime, 
    message, 
    uid 
} 

검색을 위해 limit (한 번에 100 개씩)을 제공하는 경우 검색을 최적화 할 수 있습니다. 사용자가 100을 초과하여 스크롤하는 경우 100 개 이상의 채팅을 검색 할 수 있습니다. 검색을 많이 해결할 것입니다.

limit을 사용하는 경우 date created을 기반으로 검색하고 sort을 사용하여 검색어를 찾을 수도 있습니다.

+1

감사합니다, uid 인덱스 – R01010010

6

MongoDB에서 나중에 읽으려는 형식으로 데이터를 저장합니다.

데이터베이스에서 읽은 내용이 '받는 사람'필드와 동적 datetime 필터로 필터링 된 메시지 목록 인 경우이 스키마는 가장 적합합니다.

조회 할 필드에 색인을 추가하는 것을 잊지 마십시오. 그러면 수백만 건의 레코드에서도 쿼리를 수행하는 것이 타당합니다.

예를 들어 하루 종일 전체 기록을 표시하려면 한 문서에 하루 동안 모든 메시지를 저장합니다. 두 가지 유형의 쿼리 모두가 많이 발생하면 메시지를 두 형식으로 모두 저장할 수도 있습니다.

저장 용량 문제가있는 경우 capped collection을 사용하면 자동으로 예 : 1 세 이상.

+0

덕분에, 정확하게 모자를 씌운 것은 내가 숙고하고 있었고, 그것을 어떻게 해야할지 몰랐다. 정보 덕분에 – R01010010

0

여기에 메시지를 일반 텍스트로 보내거나 이미지와 비디오를 공유 할 수 있습니까?

후자의 경우 하나의 컬렉션에 하루 동안 모든 채팅을 저장하면 문제가 해결되지 않을 수 있습니다.

실제로 이미지 및 동영상 공유가 허용 된 경우에는 계정을 고려해야합니다. 16MB 문서 제한도 있습니다.

+0

에 좋은 점은 지금은 텍스트 일 ​​것입니다, 그러나 그것은 미래를 고려해야 할 좋은 포인트입니다. – R01010010

관련 문제