2012-08-27 4 views
8

나는 PostsUsers의 콜렉션을 가지고 있는데 사용자는 각 포스트를 upvote/downvote 할 수 있습니다. 사용자가 주어진 문서를 두 번 이상 투표 할 수 없도록하려면 mongodb 데이터베이스에이 정보를 저장하는 가장 좋은 방법은 무엇입니까?mongodb에 upvotes/downvotes 저장

나는 각 Post 문서 내에서 투표 user_ids의 배열을 저장하는 해낸 가장 간단한 NoSQL에 틱 솔루션 (또는 vote(user_id, vote) 심지어 배열 +1 또는 -1 사용자가 자신의 투표를 변경할 수 있도록). 각 게시물에 수천 표의 의견이있을 수 있다는 점을 감안하면 성능 측면에서 좋은 아이디어입니까?

최고 게시물이 수십만 표를 가질 수있는 Reddit과 같이 실제로 인기있는 웹 사이트는 무엇입니까?

+0

어떻게하면 되겠습니까? 나는 objectids를 키로 저장하려고했지만 작동하지 않습니다. –

답변

5

MongoDB 문서는 현재 최대 16MB로 제한되어 있으므로 Gilbert의 계산이 정확하다고 가정하면 Post 문서에 6 백만 개의 user_id 개를 모두 저장할 수 없습니다.

그러나 투표를 User 문서 (즉, 특정 사용자가 투표 한 post_id)에 저장하는 것을 고려해 볼 수 있습니다. 사용자가 600 만 개의 서로 다른 게시물에 투표하는 확률이 훨씬 적기 때문에 이렇게 빨리 크기 제한에 도달하지 못합니다.

또 다른 방법 : 특정 게시물에 대해 많은 득표가 예상되는 경우 Post 문서 외부의 투표를 별도의 컬렉션에 저장하고 다 대다와 유사한 추가 쿼리를 수행 할 수 있습니다 SQL 형식의 JOIN 테이블 :

user_votes { user_id: ObjectId(...), post_id: ObjectId(...), vote:-1 } 

(user_id, post_id)에 복합 색인을 작성하십시오.

6

인기 게시물이 수십만 표를 가질 수있는 Reddit과 같은 인기있는 웹 사이트는 어떻게됩니까?

어떨까요? 관계형 데이터베이스에서 아이디어를 사용하면 사용자 ID 포인터에 대한 정수, 포스트 포인터에 대한 정수 및 투표 용 바이트가 있습니다. 각 투표에 대해 총 9 바이트.

물론 인덱스 오버 헤드가 있습니다. 투표 당 총 15 바이트로 만듭니다. 6 백만 표는 90 메가 바이트의 디스크 공간을 차지합니다.

Reddit은 일정 기간 후에 게시물을 잠그므로 편집하거나 투표 할 수 없습니다. 따라서 Reddit은 개별 투표를 영원히 저장할 필요가 없습니다. 총 투표 만하면됩니다.

관련 문제