1

Spring Data を使用して、ユーザーの友人関係を MongoDB に保存する必要があります。私の「スキーマ」ソリューションは、ユーザー ドキュメント内に友人のユーザー名 (_id でもあります) を格納することです。Spring Data と DBRef の自己関係に問題があるように見えるため、DBRef を使用していません (友達はユーザーです:p)。シンプルなユーザー ドキュメントは次のようなものです。

{
"_id" : "user1",
"email" : "user1@test.com",
"friendRequests" : {
    "user4" : 0
},
"friends" : ["user2", "user3" ],
"password" : "$2a$10$9iJWLZjBSu3rq19wh7KTduNXIVcXozsNVjwVogO9eoz0uXO52Z2NC"
}

このモデルで十分だと思います。しかし、誰かが友達リクエストを受け入れると、両方のユーザーのドキュメントを更新する必要があり、操作はアトミックではありません。2 つのうちの 1 つだけが更新される場合があります。重要なデータではありませんが、これに対する解決策があればなお良いでしょう。私はこれを考えすぎていますか?2 フェーズ コミットhttp://cookbook.mongodb.org/patterns/perform-two-phase-commits/でこのドキュメントを見つけましたが、実装は非常に簡単ですが、この状況には多すぎるようです。

4

1 に答える 1

1

アプリケーションがデータをどのように使用するかを知らずに、この種の質問に答えることは困難です。MongoDB では、基本的に同じデータ/スキーマを表現するさまざまな方法があることを忘れないでください。そのため、アプリケーションで最適に機能する方法は、アプリケーションのニーズに合った方法です。

自問すべきいくつかの質問:
各ユーザーが平均して何人の友達を持っているか知っていますか?
ユーザーの友達をどのように表示/照会/更新しますか?
上記の操作のうち、パフォーマンスが高く完全に最新の状態にする必要があるのはどれですか?また、時間がかかる、または後でバッチ モードで実行できるのはどれですか?

データの可能な各スキーマにはトレードオフがあります。各ユーザーの友人の配列にユーザー名を継続的に追加することは、ドキュメントが継続的に拡大することを意味します (ドキュメントが割り当てられたスペースを超えると、次に更新するときに移動する必要があるため、パフォーマンスの高い更新には最適ではありません)。それを相殺するには、この方法で友人の配列を保存するときに得られるものを考慮する必要があります。ユーザーに関するすべての情報を取得するときに、1 回だけ読み取りを行うことができますか? それとも、別の読み取りを行う必要がありますか (友人配列にある各ユーザーに関する追加情報について、ユーザー コレクションを再度クエリする可能性がありますか?

データの一貫性を維持するのに役立つ更新の原子性についてはすでに考えていますが、正しくお気づきのように、これはアプリケーションで処理できるものです (または、「途中」の友情の更新を実行して検出するバックグラウンド ジョブを使用することもできます)。それらをクリーンアップします)。

また、コレクションにインデックスを付ける方法も検討する必要があります。クエリの SLA を満たすために単一のコレクションに多くのインデックスが必要な場合、更新/挿入は必然的に遅くなります (より多くのインデックスを更新する必要があるため)。 . それは問題ないかもしれませんが、トレードオフについて決定できるのはあなただけです。

これが役立つことを願っています。

于 2013-01-07T18:16:59.357 に答える