web-dev-qa-db-fra.com

Le meilleur moyen de stocker des messages de discussion dans une base de données?

Je construis une application de chat et je veux un historique complet de tous les messages jamais envoyés dans la conversation. Pour le moment, je stocke chaque message sous la forme d'une seule ligne dans un tableau appelé "messages". Je suis conscient que cette table pourrait devenir énorme car même de petits messages comme "Salut" auraient leur propre enregistrement de base de données.

Quelqu'un peut-il recommander une solution mysql plus évolutive? Je n'ai pas besoin que les messages individuels soient interrogeables, modifiables ou supprimables. La conversation entière pourrait-elle être stockée dans un vaste champ?

J'adorerais entendre vos idées!

57
wilsonpage

Il n'y a rien de mal à sauvegarder l'historique complet dans la base de données, ils sont préparés à ce type de tâches.

En fait, vous pouvez trouver ici dans Stack Overflow un lien vers un exemple de schéma de discussion: exemple

Si la taille vous inquiète toujours, vous pouvez appliquer certaines optimisations aux messages de groupe, comme par exemple ajouter un tampon à votre application que vous ne poussez qu'après un certain temps (environ 1 minute environ); De cette façon, vous éviterez d'avoir seulement 1 message de ligne.

40
jasalguero

Si vous pouvez éviter le recours à des écritures simultanées dans un seul fichier, il semble que vous n’ayez pas besoin d’une base de données pour stocker les messages de discussion.

Ajoutez simplement la conversation à un fichier texte (1 fichier par utilisateur\conversation). et avoir une structure de répertoire/fichier

Voici une vue simplifiée de la structure du fichier:

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?

Il vous suffira alors de stocker l'ID utilisateur, l'identifiant de la conversation (guid?) Et une référence au nom du fichier.

Je pense que vous aurez du mal à trouver une solution évolutive plus simple.

Vous pouvez utiliser LOAD_FILE pour obtenir les données également, voir: http://dev.mysql.com/doc/refman/5.0/en/string-functions.html

Si vous avez besoin de reconstruire une conversation, vous devez ajouter une valeur (date/heure) à côté du message de discussion envoyé (dans le fichier) pour vous permettre de fusionner et de trier les fichiers. À ce stade, c'est probablement une bonne idée. envisager d'utiliser une base de données.

20
Kevin Burton

Vous pouvez créer une base de données pour x conversations contenant tous les messages de ces conversations. Cela vous permettrait d'ajouter une nouvelle base de données (ou serveur) chaque fois que x dépasse. X est le nombre de conversations que votre infrastructure prend en charge (en fonction de votre matériel, ...).

Le problème est toujours qu'il peut y avoir de grandes conversations (avec beaucoup de messages) sur la même base de données. par exemple. vous avez la base de données A et la base de données B et chacune les stocke, par exemple. 1000 conversations. Il est possible qu'il y ait beaucoup plus de "grandes" conversations sur le serveur A que sur le serveur B (puisqu'il s'agit d'un contenu créé par l'utilisateur). Vous pouvez ajouter une base de données "maître" contenant une recherche, sur laquelle les conversations uniques peuvent être trouvées (ou vous avez un schéma pour affecter une base de données à partir de hash/modulo ou autre).

Vous pouvez peut-être trouver des architectures du monde réel qui traitent des mêmes problèmes (vous n'êtes peut-être pas le premier) et qui ont déjà été résolues.

1
Bernhard Kircher