1

私は知っています、「非正規化された方法」または「nosqlの方法」で考えてください。

この単純なユースケースについて教えてください。

db.users
db.comments

一部のユーザーがコメントを投稿し、コメントの取得中に一部のユーザー データを取得したいと考えています。「ユーザーレベル」などの動的データと「ユーザー名」などの静的データを表示したいとします。

静的データでは問題はありませんが、動的データはどうですか?

ユーザーレベルはユーザー照合にあります。読み取りパフォーマンスをアーカイブするために非正規化されたデータをコメントに複製する必要がありますが、ユーザーレベルも更新されます。

これは何らかの方法でアーカイブ可能ですか?

4

1 に答える 1

3

編集:

10gen の Brendan McAdamsの回答を見つけたところです。彼は明らかに私よりもはるかに権威があり、ドキュメントを埋め込むことを勧めています。


古いテキスト:

1 つ目は、所属するユーザーの ObjectID を各コメントに手動で含めることです。

comment: { text : "...", 
           date: "...", 
           user: ObjectId("4b866f08234ae01d21d89604"),
           votes: 7 }

2 番目の賢い方法は、DBRef を使用することです。

ディスクに余分な I/O を追加すると、パフォーマンスが低下しますよね? (これが内部でどのように機能するかはわかりません)したがって、可能であればリンクを避ける必要がありますよね?

はい - もう 1 つクエリがありますが、ドライバーがそれを行います。これは一種の構文糖衣と考えることができます。パフォーマンスに影響しますか? 実際、それも依存しています:) Mongoが非常に高速である理由の1つは、メモリマップされたファイル を使用しているためであり、mongoはすべてのワーキングセット(およびインデックス)をRAMに直接保持するために最善を尽くします. また、60 秒ごと (デフォルト) に、RAM スナップショットをディスクベースのファイルと同期します。
私が作業セットと言っているとき、私はあなたが作業しているものを意味します.3つのコレクションを持つことができます - foobarbazただし、現在 foo と bar のみを使用している場合は、これらを RAM にロードする必要がありますが、baz はディスクに残しておいてください。さらに、メモリ マップ ファイルでは、コレクションの一部のみをロードできます。したがって、engadget や techcrunch のようなものを構築している場合、ワーキング セットが過去数日間のコメントである可能性が高く、古いページが復活する頻度はかなり低くなります (コメントはオンデマンドでメモリに生成されます)。パフォーマンスに大きな影響を与えません。

要約すると、メモリ内に作業セットを保持している限り (読み取り/書き込みキャッシュだと思うかもしれません)、それらのフェッチは超高速であり、もう 1 つのクエリは問題になりません。メモリに収まらないデータのスライスを操作すると、速度が低下しますが、現在の状況ではありません-許容できる可能性があるため、どちらの場合もリンクを使用することを選択する傾向があります.

于 2012-02-25T11:03:11.967 に答える