복붙노트

[MONGODB] 블로그 MongoDB의 스키마 설계

MONGODB

블로그 MongoDB의 스키마 설계

당신은 어떻게 문서 기반 데이터베이스 (MongoDB를)와 블로그 같은 사이트에 대한 스키마를 설계하는 것입니다. 사용자 제, 코멘트 :이 사이트는 다음과 같은 목적을 가지고있다. 사용자는 기사에 댓글을 추가 할 수 있습니다. 각 사용자는 코멘트마다 정확히 한 번만 투표 할 수 있습니다.

나는 효율적으로 이러한 쿼리를 수행 할 수 있으려면 : 코멘트를 투표의 기술 자료 A에 대한 의견 및 #, 기술 자료 A를 얻을 수 1 모든 기사에서 사용자 B의 모든 의견을 얻을합니다 사용자 B가 투표 한 모든 의견을 얻을합니다

내 첫 번째 시도는 투표 사용자의 목록을 포함 할 수있는 별도의 컬렉션과 코멘트에 기사와 의견을 넣어하는 것입니다. 이 쿼리 1과 2 간단합니다. 그리고 3, 나는 사용자가 투표의 트랙을 유지하는 투표 모음을 추가했다.

이 사용자 투표 데이터를 복제하는 등의 몇 가지 명백한 단점입니다 및 쿼리 1은 데이터베이스에 두 통화를 취할 것입니다. 더 나은 방법이 있나요?

Article {
  "user_id"
}

Comment {
   "user_id",
   "article_id",
   [user_voted],
}

Vote {
    "user_id",
    "comment_id",
}

해결법

  1. ==============================

    1.

    Article {
      "_id" : "A",
      "title" : "Hello World",
      "user_id" : 12345,
      "text" : 'My test article',
    
      "comments" : [
        { 'text' : 'blah', 'user_id' : 654321, 'votes' : [987654]},
        { 'text' : 'foo', 'user_id' : 987654, 'votes' : [12345, 654321] },
        ...
      ]
    }
    

    여기에 기본 전제 내가 조 내부의 의견을 중첩 한 것입니다. 그들은 서로의 의견을 함께 배열로 저장했습니다 있도록 투표 만 코멘트에 적용됩니다. 이 경우, 난 그냥 USER_ID를 저장했습니다. 당신이 (등 TIME_CREATED) 더 많은 정보를 저장할 경우에, 당신은 할 수있는 객체의 배열을 투표 수 :

    ... 'votes' : [ { user_id : 987654, ts : 78946513 } ] ...
    

    어떻게 효율적으로 쿼리를 수행하는 방법 :

    db.articles.find( { _id : 'A' } )
    

    이것은 하나 개의 쿼리로 모든 것을 가져옵니다. 댓글 당 투표 수를 계산하는 몇 가지 클라이언트 측 로직을 수행 할 수 있습니다, 그러나 이것은 매우 간단하다.

    db.articles.ensureIndex( { "comments.user_id" : 1 } )
    db.articles.find( { "comments.user_id" : 987654 } ) // returns all document fields
    

    인덱스 효율적으로 문서 내의 주석을 검색 할 수 있도록합니다.

    하위 배열에만 경기를 추출 할 수있는 방법은 현재 없습니다. 이 쿼리는 실제로 해당 사용자에 의한 의견과 함께 모든 기사를 반환합니다. 이 잠재적으로 너무 많은 데이터가있는 경우, 당신은 몇 가지 트리밍 할 수 있습니다.

    db.articles.find( { "comments.user_id" : 987654 }, { "title" : 1, "comments.user_id" : 1 })
    
    db.articles.ensureIndex( { "comments.votes" : 1 } )
    db.articles.find( { "comments.votes" : 987654 } )
    

    다시 말하지만, 이것은 단지 코멘트를 기사의 모든를 반환합니다.

    여기에서 할 수있는 트레이드 오프가 있습니다. 우리가 너무 많은 데이터를 가져 오는 것 같은 문서를 반환하는 것처럼 보일 수 있습니다. 그러나 당신은 당신이 쿼리 # 3을 할 때 사용자에게 표시 할 계획입니까?

    "내가 투표 한 의견"의 목록을 얻기 주석 자체가없는 정말 유용하지 않습니다. 물론 댓글은 기사 자체 (또는 적어도 그냥 제목)없이 매우 유용하지 않습니다.

    대부분의 시간은에 쿼리 # 3 양도한다는 투표에서 기사에 댓글로 가입 할 수 있습니다. 그런 경우, 그냥 기사를 다시 가져 오지 왜 시작 하는가?

  2. from https://stackoverflow.com/questions/5224811/mongodb-schema-design-for-blogs by cc-by-sa and MIT license