Mongoose 하위 문서 vs 중첩된 스키마
메인 스키마의 하위 문서와 더 깊은 계층을 사용할 경우의 장단점이 궁금합니다.
var subDoc = new Schema({
name: String
});
var mainDoc = new Schema({
names: [subDoc]
});
또는
var mainDoc = new Schema({
names: [{
name: String
}]
});
현재 모든 곳에서 서브닥을 사용하고 있습니다만, 주로 퍼포먼스나 문제가 발생할 가능성이 있는 문의에 대해 생각하고 있습니다.
의사들에 따르면 정확히 똑같다고 합니다.다만, 스키마를 사용하면,_id필드(비활성화되지 않은 경우) 및 하위 문서 추적에 추가 리소스를 사용할 수 있습니다.
대체 선언 구문
v3의 새로운 기능 하위 문서 스키마 인스턴스에 대한 액세스 권한이 필요하지 않은 경우 개체 리터럴을 전달하여 하위 문서를 선언할 수도 있습니다. [...]
모델의 다양한 부분에서 재사용되는 스키마가 있는 경우 하위 문서에 대한 개별 스키마를 정의하여 자신을 복제할 필요가 없습니다.
정적 문서이거나 성능에 영향을 미치기 때문에 수백 개 이하의 문서가 포함된 문서를 사용해야 합니다.저는 아까부터 그 문제를 검토했습니다.새롭게 MongoDB의 솔루션 아키텍트로 일하는 Asya Kamsky는 "서브 문서 사용"에 관한 기사를 썼다.
그것이 솔루션이나 베스트 프랙티스를 찾고 있는 사람에게 도움이 되기를 바랍니다.
http://askasya.com/post/largeembeddedarrays 에의 최초의 투고.stackoverflow 프로파일은 https://stackoverflow.com/users/431012/asya-kamsky 에서 확인할 수 있습니다.
우선, 우리는 왜 우리가 그런 일을 하고 싶은지 생각해야 한다.보통 이 문서를 가져올 때 항상 돌려받고 싶은 것들을 포함시키라고 조언합니다.반대로 되돌리고 싶지 않은 것을 문서에 포함시키고 싶지 않다는 것입니다.
내가 수행하는 활동을 문서에 포함시키면처음에는 내 모든 활동이 바로 거기 있기 때문에 한 번 읽으면 보여주고 싶은 모든 것을 얻을 수 있다: "당신은 최근에 이것을 클릭했고 여기에 당신의 마지막 두 개의 코멘트가 있다." 하지만 6개월 후에 일어난 일은 내가 오래 전에 했던 일들에 대해 신경 쓰지 않고 당신은 그것들을 나에게 보여주고 싶지 않다.내가 특별히 오래된 활동을 찾아가지 않는다면?
첫째, 점점 더 큰 문서를 반환하고 점점 더 작은 부분에 신경을 쓰게 됩니다.그러나 프로젝션을 사용하여 어레이의 일부만 반환할 수 있습니다.디스크상의 문서가 커지고 최종 사용자에게 일부만 반환하더라도 모든 문서가 읽혀집니다.단, 액티비티가 정지되지 않는 한 문서는 계속 확대됩니다.
이 경우 가장 명백한 문제는 결국 16MB 문서 제한에 도달한다는 것입니다. 그러나 이는 전혀 우려할 사항이 아닙니다.지속적으로 증가하는 문서는 디스크로 재배치해야 할 때마다 점점 더 많은 비용이 발생하며, 단편화의 영향을 완화하기 위한 조치를 취하더라도 쓰기가 전체적으로 불필요하게 길어지고 애플리케이션 전체의 성능에 영향을 미칩니다.
애플리케이션의 퍼포먼스를 완전히 저하시킬 수 있는 또 하나의 방법이 있습니다.그것은, 계속 증가하는 어레이의 인덱스입니다.즉, 이 어레이를 가진 문서가 재배치될 때마다 갱신해야 하는 인덱스 엔트리의 수는 해당 문서의 인덱스 값 수에 정비례하며 어레이가 클수록 그 수는 증가합니다.
어레이가 데이터 모델에 적합할 때 어레이를 사용하는 것이 두렵지 않습니다.이러한 어레이는 문서 데이터베이스 데이터 모델의 강력한 기능이지만 모든 강력한 툴과 마찬가지로 적절한 환경에서 사용해야 하며 신중하게 사용해야 합니다.
변수를 .nestedDov다가 놔주세요.name: [nestedDov]
심플 버전:
var nestedDoc = new Schema({
name: String
});
var mainDoc = new Schema({
names: [nestedDoc]
});
JSON의 예
{
"_id" : ObjectId("57c88bf5818e70007dc72e85"),
"name" : "Corinthia Hotel Budapest",
"stars" : 5,
"description" : "The 5-star Corinthia Hotel Budapest on the Grand Boulevard offers free access to its Royal Spa",
"photos" : [
"/photos/hotel/corinthiahotelbudapest/1.jpg",
"/photos/hotel/corinthiahotelbudapest/2.jpg"
],
"currency" : "HUF",
"rooms" : [
{
"type" : "Superior Double or Twin Room",
"number" : 20,
"description" : "These are some great rooms",
"photos" : [
"/photos/room/corinthiahotelbudapest/2.jpg",
"/photos/room/corinthiahotelbudapest/5.jpg"
],
"price" : 73000
},
{
"type" : "Deluxe Double Room",
"number" : 50,
"description" : "These are amazing rooms",
"photos" : [
"/photos/room/corinthiahotelbudapest/4.jpg",
"/photos/room/corinthiahotelbudapest/6.jpg"
],
"price" : 92000
},
{
"type" : "Executive Double Room",
"number" : 25,
"description" : "These are amazing rooms",
"photos" : [
"/photos/room/corinthiahotelbudapest/4.jpg",
"/photos/room/corinthiahotelbudapest/6.jpg"
],
"price" : 112000
}
],
"reviews" : [
{
"name" : "Tamas",
"id" : "/user/tamas.json",
"review" : "Great hotel",
"rating" : 4
}
],
"services" : [
"Room service",
"Airport shuttle (surcharge)",
"24-hour front desk",
"Currency exchange",
"Tour desk"
]
}
예:
이것은 다른 곳에서 SO에 여러 개의 투고를 통해 처리된다고 생각합니다.
몇 가지뿐입니다.
여기서 중요한 것은 단 하나의 답이 없다는 것입니다. 단지 복잡한 트레이드오프일 뿐입니다.
두 가지 사이에는 몇 가지 차이가 있습니다.
네스트된 스키마를 사용하면 검증에 도움이 됩니다.
중첩된 스키마는 다른 스키마에서 재사용할 수 있습니다.
- "_id:false"를 사용하지 않은 경우 중첩된 스키마가 하위 문서에 '_id' 필드를 추가합니다.
언급URL : https://stackoverflow.com/questions/15208711/mongoose-subdocuments-vs-nested-schema
'source' 카테고리의 다른 글
| Spring Cloud Config 서버에 특정 브랜치에서 구성을 체크아웃하도록 요청하려면 어떻게 해야 합니까? (0) | 2023.04.02 |
|---|---|
| 반응 네이티브 응용 프로그램에서 클릭 기능이 작동하지 않습니다. (0) | 2023.04.02 |
| 스프링 부트 2.1.0, 플라이웨이 4.2.0 (0) | 2023.04.02 |
| 2개의 데이터 소스를 Flyway와 연계하여 스프링 부트에서 HikariCP를 사용하는 방법 (0) | 2023.04.02 |
| 컨트롤러에서 AngularJS 모달 대화 상자 양식 개체가 정의되지 않았습니다. (0) | 2023.04.02 |
