¿La mejor forma de almacenar mensajes de chat en una base de datos? [cerrado]

82

Estoy creando una aplicación de chat y quiero un historial completo de todos los mensajes enviados en la conversación de chat. Por el momento, estoy almacenando cada mensaje como una sola fila en una tabla llamada 'mensajes'. Soy consciente de que esta tabla podría crecer mucho ya que incluso los mensajes pequeños como 'Hola' tendrían su propio registro de base de datos.

¿Alguien puede recomendar una solución mysql más escalable? No necesito que los mensajes individuales se puedan buscar, editar o eliminar. ¿Se podría almacenar toda la conversación en un campo enorme?

¡Me encantaría escuchar tus ideas!

wilsonpage
fuente
12
si estos mensajes no necesitan ser buscables o editables, no tiene sentido mantenerlos dentro de la base de datos
ajreal
20
Aconsejaría comenzar fácil, pensar simple, usar una base de datos relacional, y si el escalado se convierte en un problema, ¡resuélvalo! Demasiadas personas se preocupan por escenarios que nunca ocurrirán porque dedican demasiado tiempo a construir la infraestructura perfecta y no tendrán tiempo para concentrarse en lo que es importante.
Whirlwin

Respuestas:

47

No hay nada de malo en guardar todo el historial en la base de datos, están preparados para ese tipo de tareas.

En realidad, puede encontrar aquí en Stack Overflow un enlace a un esquema de ejemplo para un chat: ejemplo

Si todavía está preocupado por el tamaño, puede aplicar algunas optimizaciones a los mensajes de grupo, como agregar un búfer a su aplicación que solo presione después de un tiempo (como 1 minuto más o menos); de esa manera evitarías tener solo mensajes de 1 línea

jasalguero
fuente
15

Si puede evitar la necesidad de escrituras simultáneas en un solo archivo, parece que no necesita una base de datos para almacenar los mensajes de chat.

Simplemente agregue la conversación a un archivo de texto (1 archivo por usuario \ conversación). y tener una estructura de directorio / archivo

Aquí hay una vista simplificada de la estructura del archivo:

chat-1-bob.txt
        201101011029, hi
        201101011030, fine thanks.

chat-1-jen.txt
        201101011030, how are you?
        201101011035, have you spoken to bill recently?

chat-2-bob.txt
        201101021200, hi
        201101021222, about 12:22
chat-2-bill.txt
        201101021201, Hey Bob,
        201101021203, what time do you call this?

Entonces solo necesitaría almacenar el ID de usuario, el ID de conversación (¿guid?) Y una referencia al nombre del archivo.

Creo que le resultará difícil obtener una solución escalable más simple.

También puede usar LOAD_FILEpara obtener los datos, consulte: http://dev.mysql.com/doc/refman/5.0/en/string-functions.html

Si tiene un requisito para reconstruir una conversación, deberá poner un valor (fecha y hora) junto con su mensaje de chat enviado (en el archivo) para permitirle fusionar y ordenar los archivos, pero en este punto probablemente sea una buena idea considerar el uso de una base de datos.

Kevin Burton
fuente
1
Esto suena genial. ¿Alguien puede contrarrestar este argumento?
Viaje
75
Escribir en un archivo es una idea terrible. En la mayoría de los entornos o clústeres del lado del servidor, ni siquiera garantizaría que su segunda solicitud terminara en el mismo servidor que el archivo. Escribir el sistema de archivos es extremadamente lento y está limitado por E / S. Lo siento, no puedo creer que esto haya obtenido tantos votos positivos.
Andy Fusniak
6
lo siento, en realidad estaba respondiendo la pregunta sin inventar escenarios ficticios. Por el momento, los mensajes se conservan en una base de datos, entonces, ¿por qué una escritura de sistema de archivos simple sería mucho más lenta? ¡También lea mi respuesta 1 archivo por usuario \ conversación! (en su clúster ficticio he instalado una FSA-SAN). El requisito de OP suena como registro \ auditoría, en mi opinión, que pertenece a un archivo.
Kevin Burton
5
Escribir y leer en un archivo requiere muchos recursos. Creo que el uso de una base de datos de cualquier tipo debería ayudar a reducir ese retraso en los recursos. Al final del día, las bases de datos también almacenan esa información en archivos (solo un poco diferente). Creo que la idea dada es fantástica para almacenar chats archivados o chats de más de 1 año aproximadamente. Pero nada mejor que una simple base de datos aquí.
Jay Patel - PayPal
3
OP dice claramente en la base de datos, aparte de esta terrible idea, esto no responde a la pregunta
Lyoneel
2

Puede crear una base de datos para x conversaciones que contenga todos los mensajes de estas conversaciones. Esto le permitiría agregar una nueva base de datos (o servidor) cada vez que x exceda. X es el número de conversaciones que admite su infraestructura (según su hardware, ...).

El problema sigue siendo que puede haber grandes conversaciones (con muchos mensajes) en la misma base de datos. por ejemplo, tiene la base de datos A y la base de datos B y cada una almacena, por ejemplo, 1000 conversaciones. Es posible que haya muchas más conversaciones "grandes" en el servidor A que en el servidor B (ya que este es contenido creado por el usuario). Puede agregar una base de datos "maestra" que contenga una búsqueda, en qué base de datos / servidor se pueden encontrar las conversaciones individuales (o tiene un esquema para asignar una base de datos desde hash / módulo o algo así).

Quizás puedas encontrar arquitecturas del mundo real que lidien con los mismos problemas (puede que tú no seas el primero), y que ya hayan sido resueltos.

Bernhard Kircher
fuente