2016-12-25 5 views
4

私はMongoデータベースを持っています。MongoDB - データの保存と読み込みに最適な方法

  1. ユーザー
  2. 投稿

ユーザーの投稿を送信するが、質問はここにある:

は、私は2つのコレクションを持っています。どちらの方が良いですか?

  1. 投稿はPOST(POST CREATOR)の後ろにuser _idのみ格納されます。
  2. 投稿の後ろに(_id、名前、ユーザー名などの)ユーザー情報を保存します。

最初の方法では、USERSコレクションからユーザー情報を取得する必要があります。

2番目の方法では、ユーザーが送信したすべての投稿データを更新する必要があります。ユーザーが更新されたプロファイル情報を更新した場合のみです。

どちらが優れていますか?

+0

リレーショナルデータを格納する最も良い方法は、リレーショナルデータベースに格納することです。 – Federkun

+0

@Federkunあなたは最初の方法が良いという意味ですか? – Ghorbanzadeh

+0

あなたはすでに第一の選択肢に行くことに同意しています..そして私にもよると、第一は良いです –

答えて

3

MongoDBの関係からなるべく避けてください。

2番目の方法をお勧めします。

4

MongoDBでは、あるドキュメントを別のドキュメントに埋め込むのは正常です。 (あなたが一つ以上の追加のクエリを追加し、あなたが持っている最初の方法を選択することで、その多くのクリーナー

2 - 手動の関係を検討する必要はありません

1 - :私はので、第二の方法は、優れていると思いますパフォーマンスの問題)

4

は自分自身にこれらの質問を、あなたのアプリケーションのための最善の方法を見つけるために:

a)ユーザコレクションハイまたはロー上の書き込み(更新)クエリのNRはありますか? (おそらく低いです)

b)ポストコレルレの読み取りクエリのnrが高いか低いか(おそらく高い)

c)(ユーザー)データの一貫性はどれくらい重要ですか?

MongoDBでは、非正規化が一般的なアプローチです。 書き込みのnrがnrの読み出しと比較して少ない場合、データを埋め込むことによるデータの非正規化はより良い読み出し性能をもたらすが、書き込み性能が遅くなり、より多くの場所で書き込む必要が生じる。 mongodbの書き込みは、単一のドキュメントに書き込む場合にのみアトミックではないため、データの矛盾が発生する可能性があることに注意してください。

ソリューション#1を選択すると、ユーザーコレクションに対する他の読み取りクエリを作成する必要があるため、記事の読み取り速度が遅くなります。データの一貫性が保証され、柔軟性も向上します。

ソリューション#2を選択すると、すべてがそこにあり、埋め込まれているため、1つのクエリでより速く読むことができます。しかし、ユーザークエリの更新が遅くなります。このソリューションでは、データの一貫性は保証されていませんが、更新の不一致を後で処理できる場合、これは大きな問題ではないかもしれません。 ここには、ユーザーデータだけでなく、ユーザー名(および_id)など、ユーザーデータの必要な部分だけを埋め込むことができます。

非常に大きなデータセットを持ち、ユーザーコレクションの更新が少ない非常に大きなデータセットがある場合、投稿コレクションの読み込み量が多く、ユーザーデータに不一致が含まれる可能性があります。重要ではなく、後で修正できますより良い解決策は、パフォーマンスに関して2番です。

スキーマデザインに関する興味深い記事は、hereにあります。

2

編集依頼以上のリクエストを確実に読んでください。

最初のメソッドを使用する場合は、コレクションからデータを読み取るためにいくつかのクエリを追加する必要があります。読み取りパフォーマンスを低下させます。

2番目の方法が良いかどうかを確認してください。

関連する問題