Pregunta

Esto puede ser una pregunta cabelludo pero. Decir que tengo

Followers:
-user_id
-follower_id

Activities:
-id
-user_id
-activity_type
-node_id

Tirando de una actividad de usuarios es bastante fácil. Pero ¿cuál es la mejor manera de conseguir una actividad seguidores? Una subselección? Parece que es increíblemente lento ya que los usuarios se vuelven más y más seguidores. ¿Alguna idea para acelerar esto?

Además, en un nivel más conceptual. ¿Cómo funciona la agrupación. Está todo hecho con una sola consulta? O es todos los datos de actividad tirados en y luego ordenados y agrupados en el lado de PHP?

Usuarios X, Y y Z hicieron Actividad A Usuario J hizo 3 de la Actividad B

¿Fue útil?

Solución

subconsultas son a menudo más lento que JOINs, pero realmente depende de qué es exactamente lo que está haciendo con ellos. Para responder a la pregunta principal que, me gustaría tener los datos del seguidor con un JOIN:

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

Eso es suponiendo que la tabla seguidores representa un usuario con user_id, y alguien que les sigue con un follower_id que pasa a ser un user_id en la tabla de usuarios también.

no va a ser siempre muy lento, siempre y cuando usted tiene un índice en followers.user_id. Sin embargo, la cantidad de datos de una consulta de este tipo podría volver podría ser más grande de lo que realmente quiere tratar con. Es necesario determinar qué tipo de actividad que su aplicación va a querer mostrar, y tratar de filtrarla en consecuencia para que usted no está haciendo grandes preguntas todo el tiempo, pero sólo mediante una pequeña fracción de los resultados devueltos.

Tirando de datos y agrupándola lado PHP está bien, pero si se puede evitar seleccionando en primer lugar, usted es mejor. En este caso, probablemente añadir una ORDER BY f.follower_id,activity_date DESC, asumiendo una fecha existe, y tratar de llegar a algunos criterios de filtrado más para la mesa de actividades. Entonces me iterar a través de las filas de PHP, la salida de datos agrupados por seguidor.

Otros consejos

Un registro de actividad tiene el potencial para un gran número de registros, ya que por lo general tiene una mezcla de la actividad del usuario actual y todos sus amigos. Si se unen varias mesas y un usuario tiene 100s de amigos eso es potencialmente una gran cantidad de datos que se retiró.

Un enfoque consiste en denormalise los datos y tratarlo como un tronco grande donde todas las entradas que deben aparecer en la página de registro de actividades de un usuario que se almacenan en la tabla de registro de actividad frente a ese usuario. Por ejemplo, si el usuario A tiene dos amigos, usuarios B y C, cuando el usuario A hace algo registros del registro de actividad se crean tres:

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

Usted obtendrá duplicados, pero en realidad no importa. Es rápido para seleccionar, ya que es de una tabla y un índice de sólo el ID de usuario. Y lo más probable es que usted housekeep una tabla de registro de actividad (es decir, eliminar las entradas de más de 1 mes de edad).

La tabla de registro de actividad podría ser algo como:

-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

Para seleccionar todos los registros de actividad recientes para un solo usuario es entonces fácil:

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

Para que este enfoque sea realmente eficiente es necesario tener suficiente información en la tabla de registro de actividad única para no necesitar ningún selecciona más. Por ejemplo, puede almacenar el mensaje de registro en bruto, en lugar de construir sobre la marcha.

No sé si he entendido bien lo que necesita, pero Me gustaría probar este selecto, si estoy en lo correcto que debe recibir toda la actividad para todos los seguidores 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# 
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top