2017-07-30 1 views
0

Je travaille actuellement sur un chat privé entre deux utilisateurs en utilisant NodeJS, AngularJS, MySQL et Socket.IO. Je veux en quelque sorte sauvegarder les chats pour que vous ne voyiez pas seulement le nouveau chat que vous écrivez qui est transmis via Socket.IO mais aussi les messages que vous avez écrits avant vos sessions actuelles.Comment stocker correctement les chats entre deux utilisateurs

Comment puis-je stocker correctement ces chats sur mon serveur?

+0

... en créant des enregistrements dans une table de base de données? Où êtes-vous actuellement bloqué? Avez-vous besoin d'aide pour la conception de table ou autre chose? Aussi, pas besoin de marquer avec Angular et Node si c'est vraiment juste une question de base de données. –

+0

C'est un sujet très large et la définition de "correctement" est très vague. Avez-vous essayé quelque chose ou êtes-vous complètement au début? –

+0

Je pensais juste à créer une table "messages" et juste en insérant chaque message mais je pensais que si vous avez beaucoup de messages, il deviendra très lent – daG

Répondre

1

La manière habituelle de faire est la suivante:

Table messages: 
message_id PRIMARY KEY 
sender_id  FOREIGN KEY 
recipient_id FOREIGN KEY 
Index on (sender_id, recipient_id, message_id) 
Index on (recipient_id, sender_id, message_id) 

Cependant, cette structure a un problème: il n'y a pas moyen facile de trier efficacement les derniers messages N par « id DESC » parce que vous aurez quelque chose dans votre O WH "WHERE sender_id = ... OR recipient_id = ..." et cela rendra les deux derniers index (qui sont destinés au tri rapide) un peu inutiles.

Une structure plus intelligente est donc:

Table chatrooms: 
chatroom_id PRIMARY KEY 

Table chatrooms_users 
chatroom_id FOREIGN KEY 
user_id FOREIGN KEY 

Maintenant, lorsque deux utilisateurs (ou plus) veulent commencer à discuter ensemble, vous créer ou réutiliser une chatroom de ladite table, et insérer les lignes concernées dans chatroom_users relier le salon de discussion à ses membres actifs. Cela devrait être mis à jour lorsque les utilisateurs rejoignent/quittent le salon de discussion.

Si les conversations ne concernent que deux utilisateurs (et jamais plus de deux), vous pouvez utiliser une structure plus simple:

Table conversations 
conversation_id PK 
first_user_id FOREIGN KEY 
second_user_id FOREIGN KEY 

Quoi qu'il en soit. L'idée est de donner un identifiant unique à un fil de conversations entre nos deux utilisateurs, ou à un forum de discussion. Ensuite, la table des messages devient beaucoup plus simple:

Table messages: 
message_id PK 
chatroom_id (or conversation_id) FK 
sender_id FK 
Index on (chatroom_id, message_id) 

Dans ce cas, notez que le dernier indice optimise ceci:

SELECT * FROM messages WHERE chatroom_id=constant ORDER BY id DESC LIMIT 10 

Ainsi, lorsque l'utilisateur ouvre la fenêtre de conversation avec un autre utilisateur, vous peut trouver facilement l'identificateur conversation_id (ou chatroom_id), avec une recherche d'index, et lister rapidement les derniers messages, en utilisant également une recherche d'index, et sans aucun tri.

Les anciens messages doivent être élagués et déplacés vers une table d'archivage pour que la table des messages reste petite et insérable dans la RAM.