[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.
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 양도한다는 투표에서 기사에 댓글로 가입 할 수 있습니다. 그런 경우, 그냥 기사를 다시 가져 오지 왜 시작 하는가?
from https://stackoverflow.com/questions/5224811/mongodb-schema-design-for-blogs by cc-by-sa and MIT license
'MONGODB' 카테고리의 다른 글
[MONGODB] MongoDB를이 : errno를 : 127.0.0.1:27017 이유에 연결하지 못했습니다 10061 (0) | 2019.12.13 |
---|---|
[MONGODB] 중첩 된 스키마 대 몽구스 하위 문서 (0) | 2019.12.13 |
[MONGODB] 코드 (100)와 MongoDB를 닫힌다 아래로 (0) | 2019.12.13 |
[MONGODB] 어떻게하여 MongoDB에서 transparent_hugepage / 조각 모음 경고를 피하기 위해? (0) | 2019.12.13 |
[MONGODB] 생산 코드에 몽구스 색인 (0) | 2019.12.13 |