アクティビティ ログには、通常、現在のユーザーのアクティビティとすべての友人が混在しているため、非常に多数のレコードが記録される可能性があります。さまざまなテーブルに参加していて、ユーザーに何百人もの友達がいる場合、大量のデータが引き出される可能性があります。
1 つのアプローチは、データを非正規化し、それを 1 つの大きなログとして扱い、ユーザーのアクティビティ ログ ページに表示されるすべてのエントリが、そのユーザーに対するアクティビティ ログ テーブルに格納されるようにすることです。たとえば、ユーザー A にユーザー B とユーザー C の 2 人の友人がいる場合、ユーザー A が何かを行うと、3 つのアクティビティ ログ レコードが作成されます。
record 1: "I did this" log for user A
record 2: "My friend did this" log for user B
record 3: "My friend did this" log for user C
重複が発生しますが、実際には問題ではありません。1 つのテーブルから取得され、ユーザー ID のみでインデックスが作成されているため、選択が高速です。また、アクティビティ ログ テーブルを整理する (つまり、1 か月以上前のエントリを削除する) こともあるでしょう。
アクティビティ ログ テーブルは次のようになります。
-id
-user_id (user who's activity log this is)
-action_user_id (user who took the action, or null if same as user_id)
-activity_type
-date
1 人のユーザーの最近のアクティビティ ログをすべて選択するのは簡単です。
SELECT * from activity_log WHERE user_id = ? ORDER by date DESC LIMIT 0,50
このアプローチを本当に効率的にするには、単一のアクティビティ ログ テーブルに十分な情報を保持して、それ以上選択する必要がないようにする必要があります。たとえば、オンザフライでビルドするのではなく、生のログ メッセージを保存することができます。