まず第一に、あなたは正しい質問をしていると思います。その通り、非リレーショナル データベースとして、MongoDB は参照整合性に関する問題を管理しません。参照整合性に本当に問題がある場合、これは少し頭痛の種になる可能性があります。なぜなら、ユーザーの 1 人が、あなたが管理している情報の一部を変更した場合に、更新する必要のあるドキュメントがたくさんあるという状況に陥る可能性があるからです。すべてのドキュメントに保存されています。MongoDBでのセットアップ方法の最初の試みとして、私が通常期待するものに翻訳することを除いて、あなたの例を見てみましょう...
db.posts.save({
author:"susan@yahoo.com",
name:"Susan Person",
text:"This is my first post. Isn't it fancy?",
comments:[
{ author:"john@google.com", name:"John", text:"What a great post!" },
{ author:"sally@email.com", name:"Sally", text:"You really put some thought into this." }
]
});
db.authors.save({
_id:"susan@yahoo.com",
name:"Susan Person",
favorite_icecream:"Chocolate",
});
私はあなたの例よりも少し肉付けしましたが、これが私が言おうとしていることを理解するのに役立つことを願っています.
そう。過度に禅に聞こえることはありませんが、あなたの質問に答える唯一の方法は、別の質問をすることだと思います。既存のすべてのコメントを新しいニックネームで本当に更新する必要がありますか?
私の経験では、答えはおそらくノーです。ただし、投稿の元の作成者 (この場合はスーザン) がユーザー名を変更した場合は、変更したい場合があります。では、どうやってそれを行うのですか?最初に作成者のドキュメントを変更し、次に { author:"susan@yahoo.com" } を含むすべてのドキュメントを選択して、それらの投稿の作成者を更新します。
スキーマを決定するために、システムがどのように使用されるかについての経験と知識を使用してください。コメントの名前が作成者コレクションのエントリを反映していることを本当に確認する必要がある場合は、それらすべてに対して追加の作業を行う必要があります。
あなたの質問に対するより高度な解決策もいくつかあります。たとえば、投稿の最初の 10 個のコメントにすばやくアクセスする必要があると判断した場合、その後、データベースから残りのコメントを非同期に引き出して関連する一致を実行する間、ユーザーを待たせる余裕があります。データをまとめます。その場合、スキーマは上記のようになりますが、投稿に名前がコピーされたコメントを 10 個以上保存することはなく、残りのすべてのコメントを、ユーザーのみを参照する追加のコレクションに保存することもできます。 Eメール。次に、コメントを検索するときに、users コレクション内の電子メールに対して 2 番目のクエリを実行して、最新の名前を取得していることを確認できます。時間が経つにつれて、コメントはスクロールし、
選択できるさまざまなオプションのより詳細な比較については、次のリンクを参照してください。
http://www.alvinonmongodb.com/2012/07/schema-design-3-embedding-versus.html
記事の著者は次のように述べています。
問題は実際には埋め込みやリンクではなく、「私のユースケースとアクセスパターンは何ですか」であるべきです。それがわかっている場合は、埋め込み、リンク、またはハイブリッド モデルの決定がより簡単になります。