NoSQL データベースを扱う場合、これは間違った方法と見なされますか? NoSQL を扱うとき、「関係」の観点から考えるべきではありませんか?
埋め込みの場合には非常に多くの質問がありますが、それはごくわずかです。
埋め込みを希望する場合は、ここで言及されていないことを考慮する必要があります。
- ドキュメントのサイズは大幅に増加しますか? その場合、ドキュメントはディスク上で頻繁に移動する可能性があります。これは悪いことです。
- 関連する行には、作業中のコレクションへの多数の結合がありますか (つまり
video
、埋め込みできませんuser
)。この場合、冗長データを関連行からサブ文書にコピーする際、特にその冗長データを更新する際に問題が発生する可能性があります。
- これらの結果をどのように表示する必要がありますか?
結果を表示することは、常に埋め込むかどうかの重要な決定要因です。多数の行 (たとえば 1000 行) をページ分割する必要がある場合は$slice
、通常のクエリまたは集計フレームワークで演算子を使用する必要があります。1000 では非常に高速かもしれませんが、遅かれ早かれ、メモリ内操作は通常のクエリよりも遅くなります (実際には常にそうあるべきです)。
サブドキュメントの複雑な並べ替えと表示が必要な場合は、これらを分割して、代わりに次のドキュメント構造にすることができます。
{
"string": "foobar",
"owners": [
ObjectId(),
ObjectId(),
ObjectId()
]
}
コレクション内の行のowner
ように聞こえるので、これは実際にはデータにとってよりパフォーマンスの高い構造であると思います。user
users
ユーザーのデータを変更する可能性があるサブドキュメントを作成する代わりに、それらの_id
. リレーションシップを埋め込むことができるので、これは非常に優れていますが、同時にドキュメントはほとんど大きくなりません。これは、ディスクが常に移動する可能性が低いことを意味します。それだけでなく、ワーキング セットが小さいため、全体的によりパフォーマンスの高い操作が作成されます。それだけでなく_id
、所有者が変更されることはめったにないため、このデータのサブセットに対して実行する必要がある可能性が最も高い操作は、作成と削除だけです。
複雑なソートとページネーションに戻ります。もちろん、このデータを使用するowner
と、1 回の往復ですべての ID を取得できます。次に、別の往復で、必要な複雑な表示を可能にするusers
通常のクエリを使用して、テーブル内の所有者の行をクエリできます。$in
したがって、この構造全体が非常にパフォーマンスが高いことがわかりました。
もちろん、この構造はクエリに依存します。代わりにユーザーに文字列 id を格納する方が良いかもしれませんが、この場合、ユーザーはおそらく多くの文字列を所有できるため、そうではありません。紐側に埋め込まれた関係。
うまくいけば、これが役に立ち、私はぐるぐる回っていませんが、