블로그를 위한 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 } ] ...
질의를 효율적으로 수행하는 방법:
- A조, A조에 대한 댓글 및 댓글당 득표수 획득
db.articles.find( { _id : 'A' } )
이렇게 하면 쿼리 하나로 모든 것을 얻을 수 있습니다.댓글당 표를 계산하려면 클라이언트 측 논리를 사용해야 할 수도 있지만, 이는 매우 사소한 것입니다.
- 모든 기사에 대한 사용자 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 })
- 사용자 B가 투표한 모든 댓글 가져오기
db.articles.ensureIndex( { "comments.votes" : 1 } )
db.articles.find( { "comments.votes" : 987654 } )
이렇게 하면 주석뿐만 아니라 모든 문서가 반환됩니다.
여기서 절충을 해야 합니다.기사를 반환하는 것은 우리가 너무 많은 데이터를 가져오는 것처럼 보일 수 있습니다.하지만 3번 질문을 할 때 사용자에게 무엇을 표시할 계획입니까?
"내가 투표한 댓글" 목록을 얻는 것은 댓글 자체가 없이는 그다지 유용하지 않습니다.물론 기사 자체(또는 적어도 제목만)가 없으면 코멘트는 그다지 유용하지 않습니다.
#3대분의경우, #3 리는다발조전에서 조인으로 합니다.Votes
Comments
Articles
그렇다면 기사부터 다시 가져오는 것이 어떨까요?
언급URL : https://stackoverflow.com/questions/5224811/mongodb-schema-design-for-blogs
'sourcecode' 카테고리의 다른 글
R의 벡터 목록에서 행렬을 만들려면 어떻게 해야 합니까? (0) | 2023.07.17 |
---|---|
새 열을 추가한 후 SQL Server 열 이름이 잘못되었습니다. (0) | 2023.07.17 |
순환 가져오기는 콜 스택에서 더 위쪽으로 작동하지만 가져오기 오류는 더 아래쪽으로 발생하는 이유는 무엇입니까? (0) | 2023.07.17 |
$project가 있는 Mongo Aggregate 이름 바꾸기 필드? (0) | 2023.07.17 |
쿼리 세트를 정렬하는 좋은 방법은 무엇입니까? - 장고 (0) | 2023.07.17 |