3

これは毛むくじゃらの質問かもしれませんが。私が持っていると言う

Followers:
-user_id
-follower_id

Activities:
-id
-user_id
-activity_type
-node_id

ユーザー アクティビティのプルはかなり簡単です。しかし、フォロワーの活動を得る最良の方法は何ですか? サブセレクト?ユーザーがますます多くのフォロワーを獲得するにつれて、それは信じられないほど遅いようです. これをスピードアップするためのアイデアはありますか?

また、より概念的なレベルで。グループ化はどのように機能しますか。単一のクエリですべてが完了しますか? それとも、すべてのアクティビティ データが取り込まれ、PHP 側でソートおよびグループ化されますか?

ユーザー X、Y、Z がアクティビティ A を実行 ユーザー J がアクティビティ B を 3 つ実行

4

3 に答える 3

4

副選択は JOIN よりも遅いことがよくありますが、それは実際に何をしているのかによって異なります。主な質問に答えるために、JOIN を使用してフォロワー データを取得します。

SELECT * FROM followers f
LEFT JOIN activities a ON f.follower_id=a.user_id
WHERE f.user_id=$followedPerson

これは、フォロワー テーブルが を持つユーザーを表し、ユーザー テーブルでもたまたまuser_idである を持つユーザーを表していると仮定しています。follower_iduser_id

にインデックスがある限り、信じられないほど遅くなることはありませんfollowers.user_id。ただし、そのようなクエリが返す可能性のあるデータの量は、実際に処理したい量よりも大きくなる可能性があります。アプリケーションが表示したいアクティビティの種類を決定し、それに応じてフィルタリングして、常に巨大なクエリを作成するのではなく、返された結果のごく一部のみを使用するようにする必要があります。

データを取り出してグループ化するのは PHP 側でも構いませんが、最初から選択を避けることができれば、その方が得策です。この場合、ORDER BY f.follower_id,activity_date DESC日付が存在すると仮定して、おそらく を追加し、アクティビティ テーブルのフィルター条件をいくつか追加しようとします。次に、PHP で行を反復処理し、フォロワー別にグループ化されたデータを出力します。

于 2009-08-06T01:23:50.340 に答える
2

アクティビティ ログには、通常、現在のユーザーのアクティビティとすべての友人が混在しているため、非常に多数のレコードが記録される可能性があります。さまざまなテーブルに参加していて、ユーザーに何百人もの友達がいる場合、大量のデータが引き出される可能性があります。

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

このアプローチを本当に効率的にするには、単一のアクティビティ ログ テーブルに十分な情報を保持して、それ以上選択する必要がないようにする必要があります。たとえば、オンザフライでビルドするのではなく、生のログ メッセージを保存することができます。

于 2009-08-09T19:06:14.203 に答える
0

あなたが必要としているものを正しく理解しているかどうかはわかりませんが、この選択を試してみます.#USERID#

SELECT a.* FROM Activities AS a 
INNER JOIN Followers AS f1 
ON a.user_id = f1.follower_id
WHERE f1.user_id = #USERID# 
于 2009-08-06T01:25:17.687 に答える