私は次の構造で行きます:
-
発生したすべてのアクションに1つのコレクション、
Actions
を使用します -
誰が誰をフォローするかについて、別のコレクションを使用します。
Subscribers
-
3番目のコレクションである
Newsfeed
を使用します 特定のユーザーのニュースフィードの場合、アイテムはActions
からファンアウトされます コレクション。
Newsfeed
コレクションは、新しいActions
を非同期的に処理するワーカープロセスによって入力されます 。したがって、ニュースフィードはリアルタイムで入力されません。リアルタイムが重要であるという点で、Geert-Janには同意しません。ほとんどのユーザーは、ほとんどの1分でも遅延を気にしないと思います。 (すべてではありません)アプリケーション(リアルタイムでは、完全に異なるアーキテクチャを選択します)。
consumers
の数が非常に多い場合 、ファンアウトにはしばらく時間がかかる場合があります。一方、コンシューマーをオブジェクトに直接配置しても、フォロワー数が非常に多い場合は機能せず、インデックススペースを大量に消費する非常に大きなオブジェクトが作成されます。
ただし、最も重要なのは、ファンアウト設計がはるかにより柔軟であるということです。 関連性のスコアリング、フィルタリングなどが可能になります。最近、MongoDBを使用したニュースフィードスキーマの設計に関するブログ投稿を作成しました。ここでは、その柔軟性の一部について詳しく説明しています。
柔軟性について言えば、そのactivitystrea.msの仕様には注意が必要です。異なるプロバイダー間の相互運用の仕様としては理にかなっているようですが、さまざまなアプリケーションからのアクティビティを集約するつもりがない限り、データベースにそのような詳細な情報をすべて保存することはしません。