2012-03-03 3 views
2

나는 EmbeddedThing을 포함하는 Parent의 콜렉션을 가지고 있으며, 각각 EmbeddedThing에는 그것을 만든 User에 대한 참조가 들어 있습니다.mongodb : 내 임베디드 객체를 정규화해야하는 곳입니까?

"results": [ 
    { 
    "_id": 1, 
    "value": [ `EmbeddedThing`, `EmbeddedThing`, … ] 
    }, 
    { 
    "_id": 2, 
    "value": [ `EmbeddedThing`, `EmbeddedThing`, … ] 
    }, 
    … 
] 

이인가 정말 단지로 EmbeddedThing를 정상화해야하는 위치 :

UserCollection: [ 
    { 
    _id: ObjectId(…), 
    name: '…' 
    }, 
    … 
] 

ParentCollection: [ 
    { 
    _id: ObjectId(…), 
     EmbeddedThings: [ 
     { 
     _id: 1, 
     userId: ObjectId(…) 
     }, 
     { 
     _id: 2, 
     userId: ObjectId(…) 
     } 
    ] 
    }, 
    … 
] 

은 곧 내가지도 축소/사용 달성하기 위해 관리 특정 사용자에 대한 모든 EmbeddedThing의를 얻을 필요가 있음을 깨달았 자신의 컬렉션, 또는 이것을 유지하기 위해 여전히지도/축소를 유지해야합니까? 다른 디자인은 아마도?

도움이된다면 일부보고/집계 작업 (이 작업을 잘못했을 수 있음을 깨달았습니다)과 대조적으로 사용자는 Parent 번에 해당하는 EmbeddedThing 개의 목록을 볼 수 있습니다.

감사합니다.

답변

2

"포함하거나 포함하지 않는 : 그 질문입니다":

내 규칙은 다음과 같습니다 포함 된 개체는 부모 개체의 맥락에서 감각이

  • 삽입합니다. 예를 들어 OrderItemOrder이 아닌 것은 의미가 없습니다. 성능 요구 사항에 따라 결정되는 경우
  • 포함 전체 문서 트리를 읽는 것은 매우 저렴합니다 (여러 쿼리를 작성하고 프로그래밍 방식으로 결합하는 대신).

액세스 패턴을 살펴 봐야합니다. ParentThing을 초당 수천 번로드하고 User을로드하면 일주일에 한 번씩 map-reduce를 선택하는 것이 좋습니다. 사용자 쿼리가 느려지지만 응용 프로그램에서 괜찮을 수 있습니다.

또 다른 접근법은 훨씬 더 비정규 화하는 것입니다. 즉, 포함 된 항목을 추가 할 때 상위 항목과 사용자 모두에 추가하십시오.

  • 장점 : 쿼리가 빠릅니다.
  • 단점 : 복잡한 코드. 쓰기 양이 두 배입니다. 잠재적 인 동기화 손실 (한 곳에서 업데이트/삭제하지만 다른 곳에서는 잊어 버림).
+0

나는 유연함 때문에 mongodb를 좋아하지만, 추가 재료에 대해 생각해야하기 때문에 "의존적"인 부분을 정말로 싫어한다. 이것은 아주 새로운 프로젝트이므로 액세스 패턴을 추측 할 수만있다. 또한 새로운 것이기 때문에 속도가 아닌 개발의 용이성에 중점을 둡니다. 나는 그 순간에 그것을 역 정규화하지 말아야한다. – thatmarvin

+0

@thatmarvin : 생각하는 것이 좋다 :) –

관련 문제