最近、プロジェクトにCosmos DBを使用し始めて、いくつかの設計上の問題に直面しています。 SQLのバックグラウンドから来て、私は関連データをNoSQL DB上のドキュメント内にネストする必要があることを理解しています。これは、ドキュメントがかなり大きくなる可能性があることを意味します。
部分的な更新はサポートされていないため、ドキュメントの単一のプロパティを更新する場合に実装するのに最適な設計パターンは何ですか?
更新を実行するために、ドキュメントサーバー側全体を読み取り、値を更新し、すぐにドキュメントを書き戻す必要がありますか?これは、すべてのデータがネストされている場合にドキュメントが必然的に大きくなる場合に問題になるようです。
多くの小さなドキュメントを作成し、IDに基づいて関係を推測するアプローチを取る場合、これは更新の懸念に対する読み取り/書き込みをすぐに解決すると思いますが、NoSQLの概念に反対しているように感じ、本質的にはリレーショナルを構築していますDB。
ありがとう
ロックとラッチ。部分的な更新が可能になった場合に必要なことです。 15ms未満の書き込みレイテンシSLAをロックして維持することは、エンジニアリング上の難しい問題です。
これは、すべてのデータがネストされている場合にドキュメントが必然的に大きくなる場合に問題になるようです。
恐怖を定義します—リクエストユニット、アプリのホストメモリ、入力/出力ネットワークトラフィックが焦げていますか?これは問題だと信じていますが、具体的な結果を述べているわけではありません。私はあなたが間違っていると言ったり、部分的な更新アプローチの効率を疑ったりしているのではなく、ただの議論は薄いと言っているだけです。
通常、NoSQLでは何もJOIN
したくないので、最後の段落であなたと一緒にいます。
ドキュメントを作成しようとするときはいつでも、これを検討してください。
ドキュメントの一部に個別のアクセスが必要ですか。はいの場合は参照ドキュメントを作成し、いいえの場合は埋め込みドキュメントを作成します。
そして、あなたが何を選ぶべきかを知りたいなら、私はあなたがこの質問をMongoDbのためにそれを見てみる必要があるべきだと思うが、あなたを助けるでしょう 埋め込みvs参照されたドキュメント
次のCosmosDb固有の記事を参照してください。
埋め込みまたは参照は、NoSQLの世界でドキュメント構造を設計するときに直面する最も一般的な問題です。
埋め込み関係では、子エンティティが親ドキュメントに埋め込まれています。参照関係では、基本的に2種類(またはそれ以上)のタイプのドキュメントを持つ、別のドキュメントの子エンティティと別のドキュメントの親。
すべてに当てはまる関係パターンはありません。どのアプローチを採用するかは、データに対して行われる取得と更新が設計されているかどうかによって異なります。
1.親エンティティとともにすべての子エンティティを取得する必要がありますか?はいの場合、埋め込み関係を使用します。
2.ユースケースでは、エンティティを個別に取得できますか?この場合、関係パターンを使用します。
これまでに使用したユースケースの大部分は、関係パターンを使用しました。例:ソーシャルグラフ(関係ツリーを持つプロファイル)、近接ポイント(GeoJSONベースの近接検索)、分類済みリストなど。
エンティティは個々のドキュメントに保存されるため、Relationship Patternは更新と保守も簡単です。