sourcecode

블로그를 위한 mongodb 스키마 설계

codebag 2023. 7. 17. 20:59
반응형

블로그를 위한 mongodb 스키마 설계

문서 기반 데이터베이스(mongodb)가 있는 블로그와 유사한 사이트에 대한 스키마를 어떻게 설계하시겠습니까?사이트에는 다음과 같은 개체가 있습니다.사용자, 기사, 주석.사용자는 기사에 주석을 추가할 수 있습니다.각 사용자는 주석당 한 번만 투표할 수도 있습니다.

다음과 같은 쿼리를 효율적으로 수행할 수 있기를 원합니다.
A조, A조에 대한 댓글 및 댓글당 득표수 획득
모든 기사에 대한 사용자 B의 모든 의견 가져오기
사용자 B가 투표한 모든 댓글 가져오기

저의 첫 번째 시도는 기사와 댓글을 별도의 컬렉션에 넣는 것이고 댓글은 그것에 투표한 사용자 목록을 포함할 수 있습니다.이렇게 하면 쿼리 1과 2가 단순해집니다.그리고 3번의 경우, 사용자의 투표를 추적하는 투표 수집을 추가했습니다.

사용자 투표 데이터를 복제하는 것과 같은 명백한 단점이 있으며 쿼리 1은 데이터베이스에 대한 두 번의 호출을 수행합니다.더 나은 접근법이 있습니까?

Article {
  "user_id"
}

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

Vote {
    "user_id",
    "comment_id",
}
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] },
    ...
  ]
}

여기서 기본 전제는 내가 네스트링을 했다는 것입니다.Comments의 내부에Article.그Votes에만 적용됩니다.Comment그래서 그들은 각각과 함께 배열로 저장되었습니다.Comment이 경우 user_id를 저장했습니다.더 많은 정보(time_created 등)를 저장하려면 개체 배열을 투표할 수 있습니다.

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

질의를 효율적으로 수행하는 방법:

  1. A조, A조에 대한 댓글 및 댓글당 득표수 획득
db.articles.find( { _id : 'A' } )

이렇게 하면 쿼리 하나로 모든 것을 얻을 수 있습니다.댓글당 표를 계산하려면 클라이언트 측 논리를 사용해야 할 수도 있지만, 이는 매우 사소한 것입니다.

  1. 모든 기사에 대한 사용자 B의 모든 의견 가져오기
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 })
  1. 사용자 B가 투표한 모든 댓글 가져오기
db.articles.ensureIndex( { "comments.votes" : 1 } )
db.articles.find( { "comments.votes" : 987654 } )

이렇게 하면 주석뿐만 아니라 모든 문서가 반환됩니다.

여기서 절충을 해야 합니다.기사를 반환하는 것은 우리가 너무 많은 데이터를 가져오는 것처럼 보일 수 있습니다.하지만 3번 질문을 할 때 사용자에게 무엇을 표시할 계획입니까?

"내가 투표한 댓글" 목록을 얻는 것은 댓글 자체가 없이는 그다지 유용하지 않습니다.물론 기사 자체(또는 적어도 제목만)가 없으면 코멘트는 그다지 유용하지 않습니다.

#3대분의경우, #3 리는다발조전에서 조인으로 합니다.VotesCommentsArticles그렇다면 기사부터 다시 가져오는 것이 어떨까요?

언급URL : https://stackoverflow.com/questions/5224811/mongodb-schema-design-for-blogs

반응형