2010-09-01 10 views
5

Me preguntaba cómo implementar mejor un "más visto" ofrecido (como youtube) en mi base de datos.Implementación de la base de datos de características "más vistas"

Voy a explicar el "más vistos" característica un poco mejor: Básicamente quiero enumerar las más visitadas páginas/video/etc partir de este día/semana/mes, ver http://www.youtube.com/charts/videos_views para un ejemplo .

Así que me preguntaba cómo implementar mejor esta función, ya que puedo pensar en muchas formas de hacerlo, pero todas tienen su + y - para ellas.

Plus También me gustaría escuchar los comentarios de varios programadores sobre las ideas de otros programadores. También me gustaría comenzar una buena conversación sobre este tema.

Ps. Estoy buscando especialmente cómo calcular el tiempo, por ejemplo, el más visto en este mes, sin tener una gran tabla guardando cada vista con la fecha y hora. Cualquier idea es bienvenida.
Pps. Uso Mysql y PHP, los consejos adicionales para esos dos son bienvenidos.

Respuesta

3

tienen las siguientes tablas: 1. vistas 2. views_hourly_summary 3. views_daily_summary 4. views_monthly_summary 5.views_alltime_summary

tienen una carrera de trabajo cron en los siguientes intervalos:

  1. salen cada hora y preaggregate las vistas para esa hora de la tabla de puntos de vista y guardar el resultado preaggregated en la tabla views_hourly_summary, también actualizar el views_alltime_summary tabla

  2. carrera al final de cada día y preaggregate las vistas para ese día de la mesa de horas y guardar el resultado en la tabla preaggregated views_daily_summary

  3. carrera al final de everymonth y preaggregate las vistas para ese día de la mesa de horas y guardar el resultado preaggregated en la tabla views_daily_summary

próxima al obtener los resultados que tendrá que hacer algunos cálculos de la siguiente manera:

  1. por ejemplo, que se desea obtener los puntos de vista de las últimas 4 horas, que se vendería los 3 datos de horas enteras de la mesa por hora y para los datos restantes buscarla a la mesa puntos de vista de la siguiente manera:

    seleccione item_i d, suma (vistas) como vistas de views_hourly_summary donde hora entre concat (izquierda (ahora() - intervalo de 3 horas, 14), '00: 00 ') y concat (izquierda (ahora(), 14), '00 : 00') grupo por item_id unión

    seleccione item_id, count (1) como vistas de vistas donde fecha y hora entre (ahora() - intervalo de 4 horas) y concat (izquierda (ahora() - intervalo de 3 horas, 14), '00: 00 ') o de fecha y hora> concat (izquierda (ahora(), 14), '00: 00') grupo por item_id

0

En la parte superior de mi cabeza, tendría una tabla ItemViews, que asigna el número de vistas a una identificación de artículo (suponiendo que solo hay un tipo de elemento). La tabla podría tener 2 columnas: ItemId y ViewCount. Cuando una nueva característica recibe su primera vista, inserto una nueva fila en esa tabla e inicializo ViewCount a 0. Luego aumentaría el contador en esa fila cada vez que detecto una nueva vista.

Pude calcular las estadísticas de esa tabla. Si hay un concepto de categorías (como en Youtube), podría unirme a los ID de categoría con el ItemId y agrupar mi cuenta de esa manera.

+0

Sí, esta es una idea simple, pero luego terminas con una tabla enorme, por ejemplo, si tengo 1 millón de páginas y cada página tiene algo así como 10k vistas y luego 1mx10k = 10 mil millones de filas. Ahora imagine calcular el tiempo para que cada fila sea la más vista para este mes. Necesitaría un servidor completo solo para eso, seguramente debe haber una manera más simple. – StfnoPad

+0

Creo que el punto es que solo hace una inserción para la nueva página/artículo. Después de ese punto, solo incrementará el contador, por lo que solo terminará con 'x' filas, donde 'x' es la cantidad de elementos visualizados. Si tuviera 1m de elementos, pero solo 10K habían sido visualizados, solo tendría 10K filas, ni siquiera el millón de elementos. Un ahorro adicional. Una gran idea y algo que pensaría implementar en mi solución también. –

+0

Sí, pero si solo tiene un contador, entonces no puede calcular el más visto para decir esta semana, ya que no tiene información de fecha y hora. Estoy seguro de que debe haber una manera simple, de lo contrario, me pregunto cómo lo hace youtube con sus mil millones de videos y millones de visitas por video. De todos modos, muchas gracias chicos. – StfnoPad

1

Primero intento rastrear a los usuarios utilizando una cookie, dándoles una identificación única como visita y para esa visita. Eso debería ayudar con la identificación.

Intentaré mover la lógica para actualizar los artículos más vistos de la base de código del sitio web. Esto solo significa que cada solicitud web publica la información de la visita en una cola de mensajes, que probablemente incluya la hora/fecha, el elemento que se está viendo, la información rastreada de la cookie y tal vez el encabezado de la dirección IP/solicitud.

Luego, configuré un servicio para leer de esa cola y procesar la información. Eso le permitiría actualizar/modificar esa lógica sin afectar el sitio. Es probable que desee manejar múltiples actualizaciones, etc. para evitar que las personas entren en problemas con los resultados, ya sea deliberadamente o por accidente. Además, al abstraer este procesamiento del sitio principal, no se ralentiza el tiempo de solicitud de la página; puede hacer que la lógica para determinar/actualizar las vistas de elementos sea tan compleja como desee en ese momento.

1

Enfoque simple que me viene a la mente incrementar el valor del campo ViewCount en su tabla por 1 para cada IP única de los usuarios que cargaron esa página.

+0

Simplemente usando la dirección IP, se limitaría a registrar una solicitud por compañía si varias personas detrás de un proxy de la compañía accedieron a su sitio, etc. –

+0

Sí, pero luego no puede calcular el "más visto" en el tiempo como usted no guarda ninguna información del tiempo. Así que al hacer esto no puedo calcular el más visto para esta semana como un ejemplo. – StfnoPad

+0

Ohh sí, también se necesita información sobre el tiempo. Ese fue un enfoque muy simple, pensó solo 10 segundos :)) de todos modos conducirá al enfoque correcto. Sí, también, comprobar solo IP único no será suficiente, la información de las cookies es buena. Así que agregue todos estos a la solución, IP única, cookie, tiempo de visita, también tienen cola para actualizar db y tienen toda la información en una tabla separada en lugar de en el campo. Parece bastante sofisticado ya. – apprich

0

Aquí hay una solución muy simple. No es completamente óptimo, pero podría mejorarse para mejorar sin demasiado dolor.

Básicamente, divida el tiempo en intervalos, digamos 5 minutos cada uno. Tener un registro en db con una columna para videoID, y una columna que identifique un intervalo de tiempo específico, y luego una columna para ver cuántas vistas obtuvo el video durante ese intervalo de tiempo. Luego, si desea saber cuántas vistas obtuvo un video en el último día, simplemente sume todas aquellas donde el intervalo/marca de tiempo es mayor que hace un día. No es completamente óptimo porque el último intervalo solo estará parcialmente lleno de vistas, lo que le brinda las vistas por un poco de tiempo adicional o un poco menos de tiempo dependiendo de cuándo lo calcule. Pero es lo suficientemente bueno para una solución que demora dos segundos. Para calcular las vistas anuales, haga lo mismo, excepto con una tabla completamente separada donde los intervalos de tiempo son, por ejemplo, 1 día, para que no tenga que almacenar datos y sumar más de 100.000 intervalos de cinco minutos para hacer un año completo.

Solo asegúrese de tener un índice compuesto en [videoId, fecha y hora] para que pueda resumir las vistas rápidamente.

Cuestiones relacionadas