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.
... 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. –
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? –
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