30

MongoDB でDBREF データ型を使用すると、ドキュメントは次のようになります。ただし、すべての行が明らかにコレクション$refを指しているため、すべての行にフィールドがあると冗長に感じます。users

$refやや冗長な-fieldを使用せずに他のドキュメントを参照する方法はありますか?

{
    $id: {$oid : "4f4603820e25f4c515000001"},
    title:   "User group",
    users: [ 
        {_id: {$ref: "users", $id: { $oid: "4f44af6a024342300e000002"}}, isAdmin: true }
    ]
],
4

3 に答える 3

47

私の意見では、少なくともスケーラビリティを必要とする大規模なシステムで作業する場合は、mongodb を使用する場合は Dbref を使用しないでください。

私が知っているように、すべてのドライバーが DBRef をロードするために追加の要求を行うため、データベース内で 「結合」するのではなく、非常に高価です。

やや冗長な $ref-field を使用せずに他のドキュメントを参照する方法はありますか?

はい、参照を念頭に置いて、「外部キー」の命名規則 (RefUserId または単に UserId のようなもの) を作成し、参照されたドキュメントの id だけを保存します。必要に応じて、参照ドキュメントを自分でロードします。また、通常はパフォーマンスが大幅に向上するため、実行できる非正規化や埋め込みに注意してください。

于 2012-02-23T11:57:43.987 に答える
6

へのアクセスにドライバ固有の方法を使用しない限りdbref、不要なはずです。

結合を手動で管理している場合 (つまり、他のどのコレクションに「結合」するかがわかっている場合) は、ObjectId だけを保存するだけで十分です。

于 2012-02-23T11:47:35.427 に答える
3

ドキュメントから:

手動参照は代替手段でありマニュアル参照はDBREFよりも望ましいと書かれています(理由はわかりませんが)。DBREF は、参照されるオブジェクトが別のデータベースに存在する場合、またはコレクション名が他の方法では明らかでない場合に役立ちます。

非正規化/埋め込みは、アトミックな更新を取得し、関連データを再クエリする必要がないため、あらゆる種類のリンクよりも望ましい方法です。

于 2016-01-05T18:03:21.277 に答える