9

さまざまな状況でクエリの効率を最大化するための理想的なドキュメント構造について疑問に思っていましたが、質問したいことがあります。この特定の種類のケースでMongoDBがメモリ内でどのように動作するかを実際に知らないことは、私から本当に生まれています。架空のシナリオを紹介します。

フォロワーとフォロワーのTwitterスタイルのシステムを想像してみてください。明らかに大雑把に見てみると、主なオプションは次のように見えます。

  1. 各ユーザードキュメントで、フォローしている他のユーザーのすべてのドキュメントへの参照を含む「フォロワー」配列。フォロワーは、他のユーザーの「user.followers」配列で現在のユーザーを見つけることによって見つけられます。主な欠点は、Followee検索の潜在的なクエリオーバーヘッドであるように見えます。また、「user.followers」のコンテンツ専用のクエリの場合、MongoDBはユーザーのドキュメントの必須フィールドにアクセスするだけですか、それともユーザードキュメント全体が見つかり、そこから必須フィールドの値が検索され、これがキャッシュされます/大規模なユーザーベースでのクエリが大幅に多くのメモリを必要とするような方法で保存されていますか?

  2. 各ユーザードキュメントに、「フォロワー」と「フォロワー」の両方を保存して、それぞれにすばやくアクセスできるようにします。これには明らかに、ユーザーBに続くユーザーAのエントリがそれぞれのフィールドの両方のユーザードキュメントに存在し、fromからの削除には、もう一方の一致する削除が必要であるという意味で、重複データの欠点があります。技術的には、これは単純な削除で潜在的な障害のポイント数を2倍にすることを検討している可能性があります。そして、MongoDBは、削除が発生したときにメモリに保存されたデータの「スイスチーイング」と言われることでまだ苦しんでいます。したがって、1つではなく2つのフィールドから削除すると、そのメモリホールの問題の影響が2倍になりますか?

  3. 1のユーザードキュメントと同様の方法でクエリされた、ユーザーのフォロワーを保存するための個別のコレクション-アクセスされるデータはフォロワーのみであることが明らかであるため、ユーザードキュメントに各ユーザーに関連する他のデータがかなり多く含まれている場合は、そのデータにアクセスします。これはリレーショナルデータベースのような感じがするようですが、原則として必ずしもひどいアプローチではないことはわかっていますが、モンゴのアーキテクチャでは、言及されている他のアプローチの1つ(または私が検討していないアプローチ)の方が優れていることは明らかです。学びたい!

誰かがこれについて何か考えを持っているか、私がどこかで非常に関連性があり明白なドキュメントページを見逃したことを私に伝えたい場合、または私がただ愚かであると私に伝えたい場合(理由の説明で考えてください; ))私はあなたから聞いてみたいです!

4

2 に答える 2

8

これは古典的なフォロワーとフォロワーの問題であり、それに対する答えはありません..このリンクをチェックしてください:

mongo db design of following and feeds, where I embed?

実際、MongoDB と SQL サーバーしか選択肢がなかった場合、この状況はリレーショナル スキーマに非常に適しています。しかし、これは双方向の関係を持つ特殊なタイプの関係問題です。これはおそらく、グラフ データベースでより適切に処理できます :

http://forum.kohanaframework.org/discussion/10130/followers-and-following-database-design-like-twitter/p1

二重削除の問題を回避するため、両方ではなく、ユーザー ドキュメント内のフォロー対象者。したがって、MongoDB に固執する必要がある場合、1 つの方法は.. (人々がフォロー/フォロー解除しないと仮定し頻繁に)、

ドキュメントにはフォロー対象者だけを残します。これは、プロフィールを表示するときに、フォローしている人に興味があるからです.. (それが、最初に彼らをフォローした理由ですよね?..そして、次のようなクエリ:

db.Users.find({ user_id : { $in : followees })

これにより、誰が私をフォローしているかがわかります (私の ID が「user_id」であるとします)。

私が逆の方法を提案しないもう 1 つの理由は、.. 1 人がフォローするのはせいぜい 30 ~ 40 人であるため、30 ~ 40 人のフォロワーを保存するユーザー ドキュメントは、何千人ものフォロワーを保存するユーザー ドキュメントとは対照的に問題ないはずです。followee-in-document アプローチでは、全体的にほぼ同じサイズのユーザー ドキュメントが得られます。また、(follower_id とは別に) 入力するフォロワー データの量によっては、ドキュメント サイズの制限に注意する必要がある場合があります。

于 2012-07-16T20:18:17.150 に答える
2

多対多の関係であることを考えると、オプション (2) は適切に見えます。一致する削除については、2 つのドキュメント間に何らかの調整メカニズムがある限り、通常は問題になりません。

断片化は通常、アプリケーションのアクセス パターンに依存し、通常、ほとんどのデータ システムで問題になります。内部の断片化を避けるために、mongo にいくつかの重要な変更が加えられました。さらに、断片化が発生した場合に、断片化を修正するためのオフライン圧縮の代替手段があります。

于 2012-07-16T20:04:52.323 に答える