3

私はソーシャル ネットワークのようなプロジェクトに取り組んでおり、推奨されるデータベースは MongoDB です。

私は以前にさまざまなプロジェクトに取り組み、関係データベース システムでデータベースを設計しましたが、NoSQL db (MongoDB) は初めてです。私はものを設計することにこだわっています。

以下の例を考えてみましょう。

1)アプリには、ユーザーとユーザーの友達のデータを保持するためのユーザーと友達のテーブルがあります。

さて、下のデザインは正しいでしょうか?

ユーザー:

_id       username password other_fields
----------------------------------------
2gsyexej2 balan    adsfasf  ..

user_friends :

_id user_id friends
--------------------
1  2gsyexej2 friends
               - 0 
                 - friend_user_id = asdfdf23adfsasdf
               - 1
                  - friend_user_id = efex89sdfsw0dfssf
                        etc., 

上記のモデルでは、「マニュアル参照」を使用し、users テーブルからユーザー ID を取得し、それを user_friends テーブルの参照として使用しました。

このアプローチは正しいですか?そうでない場合は、より良いアプローチを提案してください。

ありがとう、

バラン

4

2 に答える 2

5

1 人のユーザーには 30 000 000 人の友達がいます。

真剣に?Twitter の中国版である Sina Weibo の最大のフォロワーは、1 人あたりのフォロワー数が Facebook と Twitter を合わせたものよりも小さく、1 人で 2,000 万人ほどです。ただし、それはまれです。

そうは言っても、ドキュメント ( http://docs.mongodb.org/manual/core/data-modeling/ ) や @jorscas が示唆するように、ルート ドキュメント内にフレンド関係を格納することはまったく賢明ではありません。

ユーザーがより多くの友人関係にアクセスするためにサイトに費やす時間が長くなるにつれて、ドキュメントが一貫して速い速度で成長していることは容易に想像できます。1 つは MongoDB エクステント内の領域の断片化のため、もう 1 つは急速に拡大するドキュメントをディスク上で移動する必要があり、それ自体が時間のかかる集中的な操作であるためです。他にも理由はありますが、これで十分です。

16メガの制限も考慮する必要があります.8,000接続でもその制限に達します.

だからすでに、私は埋め込まないと言います。リレーショナル モデルでこれを設計する方法を知っていますか? ユーザー間の関係を正規化しながら、必要に応じて非正規化します。

于 2013-01-16T15:55:16.047 に答える
1

mongodb でユーザー間の関係を表す最も自然な方法は、次のように単一のユーザーのコレクション内で参照を使用することです。

{
 _id: ObjectId("5099803df3f4948bd2f98391"),
 username: "balan",
 password: "adsafs",
 ...
 other fields
 ...
 friends: [ ObjectId("5099803df3f4948bd2f2334445"), ..., ... ],
}

友人の数が膨大でsharding必要な場合、以前の構造では適切なshard key. その場合、別のフレンド ペア コレクションを使用します。

{
  _id: ObjectId("..."),
  user_id: ObjectId("..."),
  friend_id: ObjectId("...")
}
于 2013-01-16T13:59:20.777 に答える