2012-03-03 4 views
2

EmbeddedThingを含むParentのコレクションがあり、それぞれEmbeddedThingには、それを作成したUserへの参照が含まれています。mongodb:埋め込まれたオブジェクトを正規化する場所ですか?

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

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

私はすぐに減らす/私はマップを使用して達成するために管理され、私は特定のユーザーのすべてのEmbeddedThing秒を取得する必要があることに気づい:私は本当にただへEmbeddedThingを正常化すべきところ

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

はこれです自分のコレクション、またはこれを達成するためにマップ/リダクションを維持する必要がありますか?おそらく他のデザイン?

これは役立つ場合は、Parentの間にEmbeddedThingのリストを表示することです。報告/集計タスクの一部ではありません(このことが間違っている可能性があります)。

ありがとうございます! 「埋め込むために埋め込んだりしないように:それが問題だ」

答えて

2

:)

私のルールは、次のとおりです。埋め込まれたオブジェクトは、親オブジェクトのコンテキストで意味を持っている場合埋め込む

  • 。たとえば、OrderItemOrderがない場合は意味がありません。
  • 埋め込み(パフォーマンス要件によって決まる場合)完全なドキュメントツリーを読むのは非常に安価です(いくつかのクエリを作成してプログラムで結合するのではなく)。

アクセスパターンを確認してください。 ParentThingを1秒間に数千回ロードし、Userを1週間に1回ロードすると、おそらくmap-reduceが適しています。ユーザーのクエリは遅くなりますが、アプリケーションにとっては問題ありません。

さらに別のアプローチは、より多くのものを非正規化することです。つまり、埋め込み物を追加するときは、それを親物とユーザの両方に追加します。

  • 長所:クエリは高速です。
  • 短所:複雑なコード。二重書き込み量。同期の潜在的損失(1か所で更新/削除しますが、別の場所では忘れてしまいます)。
+0

私はmongodbの柔軟性が大好きですが、余分なものについて考えなければならないので、本当に「それは依存している」部分が嫌いです。これは全く新しいプロジェクトなので、私はアクセスパターンを推測することしかできません。また、新しいので、私はスピードではなく、開発の容易さに焦点を当てています。私はちょうどその時それを非正規化することから離れるべきであるように聞こえる! – thatmarvin

+0

@thatmarvin:思考はあなたのために良いです:) –

関連する問題