2013-08-15 3 views
1

많은 메시지가있는 응용 프로그램이 있습니다. 모든 사용자는이 메시지를 다른 사용자에게 보내기 위해 하나의 메시지를 선택할 수 있습니다. 마지막으로이 메시지는 플래그 ('메시지를 보낸 사람 : user1, user2, ...)을 가져옵니다. 이러한 정보는 mongoDB에 저장되어야합니다. 지금은 생각하고 2 가지 방법 : 하나 개의 컬렉션작은 문서가 많거나 적은 큰 문서

1) 많은 작은 문서

모든 문서처럼,이 메시지와받는 사람의 배열을 보낼 메시지 ID, 사용자 이름을 포함 이 : 연간 3.6 백만 문서가있는 경우

{ 
_id:'3DA5FC203, 
sender:'username1', 
recipient:['user1','user2','user3'] 
}, 
{ 
_id:'4AD290FC, 
sender:'username1', 
recipient:['user1','user2','user3'] 
}, 
{ 
_id:'4AD290FC, 
sender:'usernameX', 
recipient:['user2'] 
} 

1000의 경우 사용자는 1 개 광석 더받는 사람에게 10 개의 메시지 하루를 보내기 때문에. 하나 명의 컬렉션을

다른 방법으로 덜

2) 더 큰 문서를 적은 문서 수 있지만 하나를 더 큰 것입니다. 예를 들어이 메시지의 모든 보낸 사람과받는 사람에 대한 정보가있는 모든 메시지에 대한 하나의 문서. (위의 예)에만이 문서 대신 3,하지만 하나 개의 문서는 100 개 이상의 보낸 사람을 포함 할 수있다 :이 경우

{ 
_id:'3DA5FC203, 
'username1':['user1','user2','user3'], 
}, 
{ 
_id:'4AD290FC, 
'username1':['user1','user2','user3'], 
'usernameX'['user2'] 
}, 

: 측정 MongoDB의 항목은 그렇게 볼 수 있었다.

제 질문은 어떤 경우 mongoDB가 더 잘 처리 할 수 ​​있습니까? 작은 문서가 많거나 적습니까? 그리고 하나의 발신자 (username1)로부터 모든 메시지와 수신자를 표시하는 것과 같은 분석을 수행하는 것이 더 나은 시나리오입니까? 당신이처럼, 값으로 키를 사용하여

+0

큰 문서를 가지고 최대 문서 크기가 16MB를 초과하지 않거나 필요한 오버플로 문서를 처리 할 전략이 있는지 결정하기 위해 분석을 수행 했습니까? – WiredPrairie

+0

MongoDB가 더 잘 처리 할 수 ​​있는지 여부는 데이터, 특정 쿼리 등을 어떻게 사용하는지에 달려 있습니다. – WiredPrairie

답변

4

:

'username1':['user1','user2','user3'], 

당신이 특정 보낸 사람이 문서를 봐 인덱스 쿼리를 할 수 없기 때문에 나쁜 생각이다.

db.messages.find({ 'username1' : { $exists: true } }); 

을하지만하지빨리 될 것입니다 :이 작동합니다.

메시지와 발신자 당 하나의 문서로 첫 번째 옵션을 유지하는 것이 좋습니다. 그런 다음 당신이 단지 수 있습니다

db.messages.find({ sender: 'username1' }); 

이 함께 할 수있는이 문서에 새받는 사람 추가 :

db.messages.update( 
    { 'msgid' : '867896', sender: "username1" }, 
    { 'recipient': { $push: "user4" } } 
); 

당신은 MongoDB를가함으로써,뿐만 아니라 두 쿼리에 대해 동일한 인덱스를 사용 할 수 있습니다 :

db.messages.ensureIndex({ sender: 1, msgid: 1 }); 

다른 힌트

첫 번째 예에서와 동일한 값인 _id 값을 갖는 두 개의 문서를 가질 수 없다는 사실을 알아야합니다. 따라서이 ID를 _id이 아닌 다른 필드로 추가해야합니다. 예를 들어 :

{ 
    msgid:'3DA5FC203, 
    sender:'username1', 
    recipient:['user1','user2','user3'] 
}, 

그리고는 MongoDB를 그냥 당신을 위해 _id 필드를 만들 수 있습니다.

+0

감사합니다. 매우 유용한 답변입니다. –

관련 문제