¿Debería usar una tabla separada para almacenar usuarios en línea o debería usar solo campos adicionales en la tabla de miembros existentes?

StackOverflow https://stackoverflow.com/questions/1445617

  •  22-07-2019
  •  | 
  •  

Pregunta

Estoy trabajando en un sistema en línea que permite a los usuarios interactuar socialmente y, por supuesto, será importante poder identificar a los usuarios que realmente están en línea. Sé que HTTP no tiene estado y sé sobre el uso de sesiones, por lo que necesitaré lograr esto comparando el último tiempo activo de un usuario con un tiempo de vencimiento arbitrario.

Mi última pregunta se reduce a esto: ¿Debería agregar algunos campos a la tabla de miembros existente ( last_active_time , is_user_online , hide_online_status , etc.) ¿O sería mejor mantener esta información en una tabla separada? Mi pensamiento inicial es usar la tabla existente por simplicidad. Aparte del nivel de complejidad, ¿cuáles son los beneficios / desventajas de uno frente al otro?

¿Fue útil?

Solución

Mantendría esto dentro de una tabla separada. Si tiene un millón de usuarios y desea saber quién está en línea, no desea escanear esa tabla una y otra vez para encontrar esa información. Tu " en línea " la tabla será relativamente pequeña y puede tener un trabajo que lo escanee periódicamente para aquellos que no han entrado en los últimos 5 minutos más o menos y luego simplemente elimínelos de la tabla en línea y actualice todo lo necesario en la tabla de miembros para " last_seen " ;

Otros consejos

Crear una nueva tabla.

Primero, está la razón filosófica, que es que un objeto (léase: tabla) debe tener un propósito. Eso se difumina mucho en el diseño lógico de la base de datos, pero de todos modos es un buen principio.

Pero las razones reales son del diseño físico: primero, se puede suponer que la cantidad de usuarios que iniciarán sesión en un momento dado es mucho menor que la cantidad total de usuarios, por lo que los requisitos de almacenamiento serán menores. Y los requisitos de almacenamiento más bajos se traducen directamente en una carga reducida en la base de datos, simplemente porque tiene menos bloques para leer y actualizar.

Si coloca estos datos en su tabla principal, además, esos bloques se dispersarán en un espacio mucho más amplio, y el contenido de los bloques crecerá y disminuirá continuamente a medida que cambia los datos.

Y finalmente, probablemente necesitará algunos índices, por ejemplo, para ver quién está en línea ahora. Y esos índices (1) ocuparán aún más espacio, (2) crearán bloques sucios aún más dispersos que deben escribirse físicamente en el disco y (3) introducirán un punto de contención de actualización.

Creo que depende de cuántos usuarios esperes tener. Si solo va a haber un par de miles de usuarios, simplemente haría que el estado en línea sea un atributo de un usuario, en la tabla de usuarios. Si va a haber más que eso, entonces querrá una tabla online_users y mantendrá esa información allí, con una clave foránea para la tabla principal de usuarios. Para obtener los beneficios (mencionados en los carteles anteriores), querrá ejecutar una tarea cada pocas horas para eliminar a los usuarios inactivos de la tabla online_users.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top