2017-03-10 17 views
1

私は、Twitterでリツイートしたのと同じように、フォロワーでタイムライン上でコンテンツを再共有できるタイムラインの動作を実装しています。リツイートの動作とパーティション

ユーザーがコンテンツを投稿すると、彼はすべてのフォロワーを取得し、フォロワーごとにタイムラインオブジェクトを作成しています。 Timelineオブジェクトには、FollowerIdとして設定されたパーティションキーがあります。したがって、ユーザーが自分の次のタイムラインを表示したい場合は、単に自分のuserIdでタイムラインオブジェクトを取得します。

問題は、コンテンツの再共有/再ウェッティングがフォロワーリスト外で複製される場合です。したがってタイムラインオブジェクトを更新する必要がある場合などです。 (好きな数、またはコンテンツ自体)。同じContentIdを持つすべてのタイムラインオブジェクトを取得する必要がありますが、FollowerIdによって分割されているので、クロスパーティション化されているため、クエリできません。

タイムラインオブジェクトの更新を処理するためにStored Procedure btwを使用しています。

これを処理するための推奨方法は何ですか?

同じオブジェクトに対して2つの独立したパーティションキーを使用することはできますか?

答えて

2

いいえ、DocumentDBの同じオブジェクトに対して2つの独立したパーティションキーを持つことはできません。これを行うには、2つの異なるパーティションキーを使用して同じデータを2回保存する必要があります。

ソーシャルネットワークが従うパターンは、メールボックスと似ています。データは各ユーザーのメールボックス/パーティションキー(有効期限が短い)に重複してコピーされます。誰かがつぶれると、非同期的に(DocumentDBのチェンジフィードや別のキュー/ブローカーを使用して)、そのユーザのフォローになるように、そのユーザのフォローに表示されます。すべてのユーザーは、パーティションキーを使用して複製されたコピーのみを個別に読み取ります。

一般的な特殊なケースは「有名人」です。多くのシステムでは、多数のフォロワーを持つユーザーにデータを1M回複製する必要がないため、特別な処理が行われます。つまり、デフォルトでデータを複製し、トップユーザーのツイートを個別に取得する両方のアプローチの組み合わせを使用します。

関連する問題