Sé que hay muchas publicaciones que discuten el diseño de DB para un sistema de chat, pero no explicaron nada sobre la escalabilidad de ese diseño, así que aquí mi pregunta.
Quiero diseñar una base de datos de un chat en tiempo real entre 2 o más usuarios, primero tomemos 2 usuarios, esto es lo que se me ocurrió.
Tabla 1:
nombre: Usuario
campos: id, nombre
Tabla 2
nombre: Sala de chat
campos: id, usuario1, usuario2
Tabla 3 :
nombre: Mensaje
campos: Chat_room_id, user_id, mensaje
Ahora, teniendo en cuenta a Facebook, tiene alrededor de 2 mil millones de usuarios activos por mes y digamos que mil millones de ellos se dedican a chatear y cada usuario envía 100 mensajes.
que hacen 100 mil millones de entradas en la tabla: Mensaje , por lo que la pregunta es,
"¿Mysql o Postgres podrán manejar esta gran cantidad de entradas y mostrar mensajes particulares de la sala de chat en tiempo real?" si no, cuál debería ser la mejor práctica para seguir eso, sé que también depende del servidor en el que está instalado RDBMS, pero aún quiero saber la arquitectura óptima.
PD: estoy usando Django como backend y AngularJs para comportamiento asíncrono
100 mil millones de filas en una tabla nunca funcionarán en línea. No solo se aplican todas las formas de partición posibles para reducir los tamaños, sino también la separación de estrategias de datos activas/pasivas. Pero sin embargo todos los asuntos importantes, la respuesta:
Postgres es de hecho efectivo trabajando con big data en sí mismo.
y todavía:
Postgres no tiene una estrategia lo suficientemente efectiva para combatir el diseño deficiente
Mire su ejemplo: la tabla chat_room enumera dos usuarios en columnas separadas, ¿para qué? Tienes user_id en los mensajes que hacen referencia a users.id. Y tiene chat_room.id en él, por lo que tiene datos de qué usuarios estaban en esa sala de chat. Ahora, si su idea era preagregar qué usuarios participaron en chat_room a lo largo del tiempo o en absoluto, conviértalo en una columna de matriz, como (chat_room.id int, users_id bigint[]) o si desea unirse al tiempo y dejar el tiempo, agregue el correspondiente atributos Los datos activos/pasivos se pueden implementar utilizando salas de chat archivadas en una relación diferente a las activas. Por cierto, la agregación de quién participó en esa sala de chat se puede realizar en dicho archivo...
Arriba no hay instrucciones para la acción, solo expresión. No hay mejores prácticas para el esquema de base de datos. Primero haga un plan claro de lo que hará su chat, luego haga un esquema de base de datos, pruébelo, mejore, intente, mejore, intente, mejore y así sucesivamente, hasta que todo funcione. Si tiene dudas sobre cómo funcionará con 100 mil millones de filas, llénelo y verifique...