MongoDB 관계: 임베드 또는 참조?
저는 몇 가지 코멘트가 있는 질문 구조를 디자인하고 싶습니다.코멘트에는해야 합니까?embed
★★★★★★★★★★★★★★★★★」reference
stackoverflow 등의 코멘트가 있는 질문의 구조는 다음과 같습니다.
Question
title = 'aaa'
content = 'bbb'
comments = ???
코멘트를 사용하실 수 있을 것 .embed
MongoDB mong mong 음 mong mong mong mong mong mong mong 。
Question
title = 'aaa'
content = 'bbb'
comments = [ { content = 'xxx', createdAt = 'yyy'},
{ content = 'xxx', createdAt = 'yyy'},
{ content = 'xxx', createdAt = 'yyy'} ]
분명합니다만, 이 케이스가 걱정됩니다.지정된 의견을 편집하려면 해당 내용과 질문을 어떻게 얻어야 합니까?거기에는 없다_id
가 찾도록 해 줘도,도 아니야.question_ref
(이렇게 하는 ?)_id
★★★★★★★★★★★★★★★★★」question_ref
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ref
embed
코멘트를 위한 그러면 코멘트를 위한 새로운 컬렉션을 작성해야 합니까?
이것은 과학이라기보다 예술이다.Mongo Documentation on Schemas는 참고 자료이지만, 고려해야 할 몇 가지 사항이 있습니다.
가능한 한 많이 넣다
문서 데이터베이스의 장점은 많은 가입자를 제거할 수 있다는 것입니다.첫 번째 본능은 가능한 한 많은 것을 하나의 문서에 저장하는 것입니다.MongoDB 문서는 구조를 가지고 있으며, 이 구조 내에서 효율적으로 쿼리를 수행할 수 있기 때문에(필요한 문서의 일부를 사용할 수 있으므로 문서 크기는 크게 걱정하지 않습니다), SQL에서와 같이 데이터를 정규화할 필요가 없습니다.특히 상위 문서와 별도로 유용하지 않은 데이터는 동일한 문서의 일부가 되어야 합니다.
여러 위치에서 참조할 수 있는 데이터를 자체 컬렉션으로 구분합니다.
이는 "스토리지 공간" 문제가 아니라 "데이터 일관성" 문제입니다.다수의 레코드가 같은 데이터를 참조하는 경우, 하나의 레코드를 갱신하고 다른 장소에 참조를 유지하는 것이 효율적이며 에러도 줄어듭니다.
문서 크기에 관한 고려 사항
MongoDB는 단일 문서에 4MB(16MB, 1.8) 크기 제한을 두고 있습니다.GB의 데이터 세계에서는, 이것은 작게 들립니다만, 30,000개의 트윗이나 250개의 일반적인 스택 오버플로우 회답, 20장의 깜박임 사진이기도 합니다.한편, 이것은 일반적인 Web 페이지에 동시에 표시하는 것보다 훨씬 많은 정보입니다.먼저 무엇이 더 쉽게 질문할 수 있는지 고려하십시오.대부분의 경우 문서 크기에 대한 우려는 시기상조입니다.
복잡한 데이터 구조:
MongoDB는 임의의 딥 네스트 데이터 구조를 저장할 수 있지만 효율적으로 검색할 수는 없습니다.데이터가 트리, 포레스트 또는 그래프를 형성하고 있는 경우 각 노드와 그 엣지를 다른 문서에 저장해야 합니다.(이러한 유형의 데이터용으로 특별히 설계된 데이터 스토어도 있습니다.)
또, 문서내의 요소의 서브셋을 반환하는 것은 불가능하다고 지적되고 있습니다.각 문서의 몇 비트를 선택하여 선택해야 하는 경우, 분리하는 것이 더 쉽습니다.
데이터의 일관성
MongoDB는 효율성과 일관성 사이에서 균형을 유지합니다.규칙은 하나의 문서에 대한 변경은 항상 원자적인 반면, 여러 문서에 대한 업데이트는 원자적인 것으로 간주해서는 안 됩니다.서버상에서 레코드를 「잠그는」 방법도 없습니다(예를 들면, 「잠금」필드를 사용해 클라이언트의 로직에 레코드를 짜넣을 수 있습니다).스키마를 설계할 때는 데이터의 일관성을 유지하는 방법을 고려하십시오.일반적으로 문서에 많이 보관할수록 좋습니다.
설명하신 내용에 대해서는 코멘트를 삽입하고 각 코멘트에 오브젝트와 함께 id 필드를 지정합니다.ID. 오브젝트ID에는 타임 스탬프가 포함되어 있기 때문에, 필요에 따라서 작성하지 않고, 타임 스탬프를 사용할 수 있습니다.
일반적으로 엔티티 간에 일대일 또는 일대다 관계가 있는 경우에는 임베드가 좋고 다대다 관계가 있는 경우에는 참조가 좋습니다.
조금 늦었지만 스키마 작성 방법을 알려드리고 싶습니다.
저는 말로 표현할 수 있는 모든 스키마를 가지고 있습니다. 고전적인 OOP에서처럼요.
예.
- 댓글
- 계좌
- 사용자
- 블로그 투고
- ...
모든 스키마는 Document 또는 SubDocument로 저장할 수 있으므로 스키마별로 선언합니다.
문서:
- 참조용으로 사용할 수 있습니다.(예를 들어 사용자가 코멘트를 작성 -> 코멘트는 사용자에 대한 "메이드 바이" 참조가 있습니다.)
- 어플리케이션의 "루트"입니다.(예를 들어 블로그 포스트 -> 블로그 포스트에 관한 페이지가 있습니다)
하위 문서:
- 1회만 사용 가능 / 참조가 되지 않습니다.(예: 코멘트는 블로그 포스트에 저장됩니다)
- 응용 프로그램의 "루트"가 아닙니다.(댓글은 블로그 포스트 페이지에 표시되지만 페이지는 블로그 포스트에 관한 것입니다.)
저는 이 질문을 스스로 연구하다가 우연히 이 작은 프레젠테이션을 접하게 되었습니다.정보나 프레젠테이션 모두 매우 잘 배치되어 있는 것에 놀랐습니다.
http://openmymind.net/Multiple-Collections-Versus-Embedded-Documents
요약:
일반적으로 [자녀 문서]가 많거나 큰 경우 별도의 컬렉션을 사용하는 것이 좋습니다.
크기가 작거나 적은 문서는 자연스럽게 매립에 적합한 경향이 있습니다.
사실, 나는 왜 UML 사양에 대해 아무도 말하지 않았는지 매우 궁금하다.경험의 법칙은 집약이 있는 경우 참조를 사용해야 한다는 것입니다.그러나 구성일 경우 결합이 더 강하기 때문에 내장된 문서를 사용해야 합니다.
그리고 왜 그것이 논리적인지 금방 이해할 수 있을 것이다.오브젝트가 부모로부터 독립적으로 존재할 수 있는 경우, 부모가 존재하지 않는 경우에도 오브젝트에 액세스 할 수 있습니다.존재하지 않는 부모에 내장할 수 없기 때문에, 자신의 데이터 구조에서 동작시킬 필요가 있습니다.또한 부모가 존재하는 경우 부모에 개체의 ref를 추가하여 서로 링크합니다.
두 관계의 차이가 무엇인지 정말 모르시나요?UML에서의 Aggregation vs Composition에 대해 설명하는 링크는 다음과 같습니다.
지정된 의견을 편집하려면 해당 내용과 질문을 어떻게 얻어야 합니까?
하위로 문의할 수 .db.question.find({'comments.content' : 'xxx'})
.
질문 문서 전체가 반환됩니다.지정된 주석을 편집하려면 클라이언트에서 주석을 찾아 편집하고 DB에 다시 저장해야 합니다.
일반적으로 문서에 오브젝트 배열이 포함되어 있는 경우, 이러한 서브 오브젝트를 클라이언트 측에서 수정해야 합니다.
이 있는 할 수 있습니다. SQL i joins
MongoDB가 joins
를 만들다one to many
관계 문서입니다.대신 시나리오를 충족시키기 위해 populate를 사용할 수 있습니다.
var mongoose = require('mongoose')
, Schema = mongoose.Schema
var personSchema = Schema({
_id : Number,
name : String,
age : Number,
stories : [{ type: Schema.Types.ObjectId, ref: 'Story' }]
});
var storySchema = Schema({
_creator : { type: Number, ref: 'Person' },
title : String,
fans : [{ type: Number, ref: 'Person' }]
});
입력이란 문서의 지정된 경로를 다른 컬렉션의 문서로 자동으로 대체하는 프로세스입니다.단일 문서, 여러 문서, 일반 개체, 여러 개의 일반 개체 또는 쿼리에서 반환된 모든 개체를 채울 수 있습니다.몇 가지 예를 들어 보겠습니다.
자세한 내용은 http://mongoosejs.com/docs/populate.html를 참조하십시오.
이것이 꽤 오래되었다는 것을 알지만, 지정된 코멘트만 반환하는 방법에 대한 OP의 질문에 대한 답변을 찾고 있다면 다음과 같이 $(쿼리) 연산자를 사용할 수 있습니다.
db.question.update({'comments.content': 'xxx'}, {'comments.$': true})
MongoDB는 스키마 없이 자유롭게 사용할 수 있습니다.이 기능은 생각이나 계획을 잘 세우지 않으면 장기적으로 문제를 일으킬 수 있습니다.
[ Embed ]또는 [Reference]의 2가지 옵션이 있습니다.위의 답변이 잘 정의되어 있기 때문에 저는 그 정의를 설명하지 않겠습니다.
임베디드할 때는 임베디드 문서가 증가한다는 질문에 답해야 합니다.그렇다면 어느 정도(문서당 16MB의 제한이 있음을 기억하십시오)그래서 투고에 댓글과 같은 것이 있는 경우, 그 투고가 입소문을 타고 사람들이 댓글을 달기 시작하면 댓글 수는 얼마나 됩니까?이 경우 참조가 더 나은 옵션이 될 수 있습니다(단, 참조도 증가하여 16MB 제한에 도달할 수 있습니다).
따라서 균형을 잡는 방법은 다양한 패턴의 조합을 통해 이러한 링크를 확인하고 사용 사례에 따라 고유한 혼합 매치를 작성하는 것입니다.
https://www.mongodb.com/blog/post/building-with-patterns-a-summary
https://www.mongodb.com/blog/post/6-rules-of-thumb-for-mongodb-schema-design-part-1
지정된 의견을 편집하려면 해당 내용과 질문을 어떻게 얻어야 합니까?
변경할 코멘트 수와 코멘트 인덱스를 추적한 경우 점 연산자(SO 예제)를 사용할 수 있습니다.
F.E.X.를 할 수 있어.
db.questions.update(
{
"title": "aaa"
},
{
"comments.0.contents": "new text"
}
)
(질문 내의 코멘트를 편집하는 다른 방법으로)
언급URL : https://stackoverflow.com/questions/5373198/mongodb-relationships-embed-or-reference
'it-source' 카테고리의 다른 글
DB에서 실제 연락처 양식 7 구조를 찾는 방법은 무엇입니까? (0) | 2023.04.06 |
---|---|
호스트: localhost.증명서의 alt name에 없습니다. (0) | 2023.04.06 |
meta_query, 관계 OR & AND를 모두 사용하여 검색하려면 어떻게 해야 합니까? (0) | 2023.04.01 |
Mobx - runInAction() 사용.그게 왜 필요하죠? (0) | 2023.04.01 |
식을 '워치 해제'하는 방법 (0) | 2023.04.01 |