私は50万人のユーザーを持つWebサイトを持っています(SQL Server 2008で実行しています)。ここで、ユーザーとその友達のアクティビティ ストリームを含めたいと思います。SQL Server でいくつかのことをテストした後、RDMS はこの種の機能には適していないことが明らかになりました。遅いです(データを大幅に非正規化した場合でも)。そのため、他の NoSQL ソリューションを検討した結果、これには MongoDB を使用できることがわかりました。アクティビティ ストリームのactivitystrea.ms json 仕様に基づくデータ構造に従います。 したがって、私の質問は次のとおりです。MongoDB のアクティビティ ストリームに最適なスキーマ設計は何でしょうか (このように多くのユーザーを使用すると、書き込みが非常に重くなることがほぼ予測できます。したがって、MongoDB を選択しました。「書き込み」パフォーマンスが優れています。私は 3 種類の構造について考えました。これが理にかなっているのか、それとも他のスキーマ パターンを使用する必要があるのか教えてください。
1 - このパターンですべての友達/フォロワーと一緒に各アクティビティを保存します。
{ _id:'activ123', 俳優:{ id:person1 }、 動詞:「従う」, 物体:{ objecttype:'人', id:'person2' }、 updateon:Date(), 消費者:[ person3、person4、person5、person6、...など ] }
2 - 2 番目のデザイン: コレクション名 - activity_stream_fanout
{ _id:'activ_fanout_123', personId:person3, 活動:[ { _id:'activ123', 俳優:{ id:person1 }、 動詞:「従う」, 物体:{ objecttype:'人', id:'person2' }、 updateon:Date(), } ]、[ //アクティビティ フィード 2 ] }
3 - このアプローチでは、アクティビティ アイテムを 1 つのコレクションに格納し、コンシューマーを別のコレクションに格納します。アクティビティでは、次のようなドキュメントがある場合があります。
{ _id: "123", 俳優: { 人物: "UserABC" }, 動詞:「従う」、 オブジェクト: { 人物: "someone_else" }, updatedOn: 日付(...) }
そして、フォロワーのために、次の「通知」ドキュメントを用意します。
{ activityId: "123", 消費者: "someguy", updatedOn: Date(...) } { activityId: "123", 消費者: "otherguy", updatedOn: Date(...) } { activityId: "123", 消費者: "secondguy", updatedOn: 日付(...) }
あなたの答えは大歓迎です。