私は Facebook のようなソーシャル ネットワーキング サイトを開発しています。通知テーブルの構造を作成する方法がわかりません。ユーザーごとに個別にする必要がありますか、それとも頻繁に追加および削除されるすべてのレコードに対して巨大なものにする必要がありますか?
1 に答える
私はあなたと同じ問題を抱えており、与えられたテーブル構造がどこにあるかを調査したところ、これを見つけました(これを見つけました) :
id
user_id (int)
activity_type (tinyint)
source_id (int)
parent_id (int)
parent_type (tinyint)
time (datetime but a smaller type like int would be better)
どこ:
activity_typeはアクティビティのタイプを示し、source_idはアクティビティが関連するレコードを示します。したがって、アクティビティ タイプが「追加されたお気に入り」を意味する場合、source_idがお気に入りレコードの ID を参照していることがわかります。
parent_id/parent_typeは私のアプリに役立ちます。アクティビティが何に関連しているかを教えてくれます。本がお気に入りに登録されている場合、parent_id/parent_type は、アクティビティが特定の主キー (id) を持つ本 (タイプ) に関連していることを教えてくれます。
(user_id, time)にインデックスを付け、user_id IN (...friends...) AND time > some-cutoff-point であるアクティビティをクエリします。ID を捨てて別のクラスター化インデックスを選択するのは良い考えかもしれません - 私はそれを試していません。
かなり基本的なものですが、機能し、シンプルで、ニーズの変化に合わせて簡単に操作できます. また、MySQL を使用していない場合は、より適切にインデックスを作成できる可能性があります。
また、最新のアクティビティにすばやくアクセスするためにRedisを使用することも提案されています。Redis を組み合わせると、次のように動作する可能性があります。
- MySQL アクティビティ レコードを作成する
- アクティビティを作成したユーザーのフレンドごとに、ID を Redis のアクティビティ リストにプッシュします。
- 各リストを最後の X 項目にトリムする
Redis は高速で、1 つの接続でコマンドをパイプライン処理する方法を提供します。そのため、アクティビティを 1000 人の友人にプッシュするのに数ミリ秒かかります。
私が話していることのより詳細な説明については、Redis の Twitter の例を参照してください: http://code.google.com/p/redis/wiki/TwitterAlikeExample
これがあなたにも役立つことを願っています