Question

Cela peut être une question velue mais. Dire que j'ai

Followers:
-user_id
-follower_id

Activities:
-id
-user_id
-activity_type
-node_id

Tirer une activité des utilisateurs est assez facile. Mais quelle est la meilleure façon d'obtenir une activité de disciples? Un sous-sélection? Il semble que c'est incroyablement lent que les utilisateurs deviennent de plus en plus d'adeptes. Toutes les idées pour accélérer cela?

En outre, sur un plan plus conceptuel. Comment fonctionne le regroupement. Est-il fait avec une seule requête? Ou est toutes les données d'activité et puis élongations triés et regroupés sur le côté PHP?

Utilisateurs X, Y et Z ont Activité A L'utilisateur J a 3 de l'activité B

Était-ce utile?

La solution

subselects sont souvent plus lent que JOIN, mais cela dépend vraiment de ce que vous faites exactement avec eux. Pour vous répondre à la question principale, j'obtenir des données de suiveur avec un JOIN:

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

C'est en supposant que la table représente un utilisateur disciples avec user_id, et quelqu'un qui les suit avec un follower_id qui se trouve être un user_id dans la table des utilisateurs aussi bien.

Il ne sera plus jamais être très lent aussi longtemps que vous avez un index sur followers.user_id. Cependant, la quantité de données une telle requête pourrait revenir pourrait devenir plus grand que vous voulez vraiment traiter. Vous devez déterminer quels types d'activité de votre application va vouloir montrer et essayer de filtrer en conséquence afin que vous ne faites pas d'énormes requêtes tout le temps, mais seulement en utilisant une infime fraction des résultats retournés.

PHP côté et insérer des données dans le regroupement est très bien, mais si vous pouvez éviter de la sélectionner en premier lieu, vous êtes mieux. Dans ce cas, je serais probablement ajouter un ORDER BY f.follower_id,activity_date DESC, en supposant une date existe, et essayer de trouver des critères de filtrage plus pour la table d'activité. Ensuite, j'itérer les lignes de PHP, la sortie de données groupées par suiveuse.

Autres conseils

Un journal d'activité a le potentiel pour un très grand nombre de dossiers, car il a généralement un mélange de l'activité de l'utilisateur actuel et tous leurs amis. Si vous adhérez différentes tables et un utilisateur 100s d'amis qui est potentiellement un grand nombre de données tiré.

Une approche consiste à denormalise les données et le traiter comme un grand journal où toutes les entrées qui doivent apparaître sur l'activité de la page du journal d'un utilisateur à stocker dans la table de journal d'activité contre cet utilisateur. Par exemple, si l'utilisateur A deux amis, l'utilisateur B et C utilisateur, lorsque l'utilisateur A fait quelque chose de trois enregistrements du journal d'activité sont créés:

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

Vous obtiendrez des doublons, mais il ne compte pas vraiment. Il est rapide pour sélectionner, car il est d'une table et indexée uniquement sur l'ID utilisateur. Et il est probable que vous housekeep une table de journal d'activité (à savoir supprimer des entrées sur 1 mois).

Le tableau de journal d'activité pourrait être quelque chose comme:

-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

Pour sélectionner tous les journaux d'activité récente pour un seul utilisateur est alors facile:

SELECT * from activity_log WHERE user_id = ? ORDER by date DESC LIMIT 0,50

Pour que cette approche vraiment efficace besoin d'avoir suffisamment d'informations dans la table de journal d'activité seule à ne pas avoir besoin d'autres sélections. Par exemple, vous pouvez stocker le message du journal brut, plutôt que de construire à la volée.

Je ne sais pas si je comprends bien ce que vous avez besoin, mais Je voudrais essayer cette sélection, si je ne me trompe pas, vous devriez obtenir toute activité pour tous les adeptes de #USERID#

SELECT a.* FROM Activities AS a 
INNER JOIN Followers AS f1 
ON a.user_id = f1.follower_id
WHERE f1.user_id = #USERID# 
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top