Der beste Weg, um Chat-Nachrichten in einer Datenbank zu speichern? [geschlossen]

82

Ich erstelle eine Chat-App und möchte einen vollständigen Verlauf aller Nachrichten, die jemals in der Chat-Konversation gesendet wurden. Im Moment speichere ich jede Nachricht als einzelne Zeile in einer Tabelle namens "Nachrichten". Ich bin mir bewusst, dass diese Tabelle sehr groß werden könnte, da selbst kleine Nachrichten wie "Hi" einen eigenen Datenbankdatensatz haben würden.

Kann jemand eine skalierbarere MySQL-Lösung empfehlen? Ich benötige nicht, dass die einzelnen Nachrichten durchsuchbar, bearbeitbar oder löschbar sind. Könnte das ganze Gespräch in einem riesigen Feld gespeichert werden?

Würde gerne Ihre Ideen hören!

wilsonpage
quelle
12
Wenn diese Nachrichten nicht durchsuchbar oder bearbeitbar sein müssen, gibt es keinen
Grund
20
Ich würde empfehlen, einfach zu beginnen, einfach zu denken, eine relationale Datenbank zu verwenden, und wenn die Skalierung zu einem Problem wird, sollten Sie sich darum kümmern! Zu viele Menschen interessieren sich für Szenarien, die niemals auftreten werden, weil sie zu viel Zeit damit verbringen, die perfekte Infrastruktur aufzubauen, und sie werden nicht die Zeit haben, sich auf das Wesentliche zu konzentrieren.
Wirbel

Antworten:

47

Es ist nichts Falsches daran, den gesamten Verlauf in der Datenbank zu speichern. Sie sind auf diese Art von Aufgaben vorbereitet.

Tatsächlich finden Sie hier in Stack Overflow einen Link zu einem Beispielschema für einen Chat: Beispiel

Wenn Sie sich immer noch Sorgen um die Größe machen, können Sie einige Optimierungen auf Gruppennachrichten anwenden, z. B. das Hinzufügen eines Puffers zu Ihrer Anwendung, den Sie erst nach einiger Zeit (z. B. 1 Minute oder so) verschieben. Auf diese Weise vermeiden Sie Nachrichten mit nur einer Zeile

Jasalguero
quelle
15

Wenn Sie vermeiden können, dass gleichzeitig in eine einzelne Datei geschrieben wird, benötigen Sie anscheinend keine Datenbank zum Speichern der Chat-Nachrichten.

Hängen Sie die Konversation einfach an eine Textdatei an (1 Datei pro Benutzer \ Konversation). und haben eine Verzeichnis- / Dateistruktur

Hier ist eine vereinfachte Ansicht der Dateistruktur:

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?

Sie müssten dann nur noch die Benutzer-ID, die Konversations-ID (guid?) Und einen Verweis auf den Dateinamen speichern.

Ich denke, es wird Ihnen schwer fallen, eine einfachere skalierbare Lösung zu finden.

Sie können auch LOAD_FILEdie Daten abrufen, siehe: http://dev.mysql.com/doc/refman/5.0/en/string-functions.html

Wenn Sie eine Konversation neu erstellen müssen, müssen Sie einen Wert (Datum / Uhrzeit) neben Ihre gesendete Chat-Nachricht (in die Datei) setzen, damit Sie die Dateien zusammenführen und sortieren können. An dieser Stelle ist dies jedoch wahrscheinlich eine gute Idee eine Datenbank in Betracht ziehen.

Kevin Burton
quelle
1
Das klingt brillant. Kann jemand diesem Argument entgegentreten?
Reise
75
In eine Datei zu schreiben ist eine schreckliche Idee. In den meisten serverseitigen Umgebungen oder Clustern können Sie nicht einmal garantieren, dass Ihre zweite Anforderung sogar auf demselben Server wie die Datei landet. Das Schreiben des Dateisystems ist extrem langsam und E / A-gebunden. Entschuldigung, ich kann nicht glauben, dass dies so viele Stimmen bekommen hat.
Andy Fusniak
6
Es tut mir leid, dass ich tatsächlich die Frage beantwortet habe, die keine fiktiven Szenarien ausmacht. Im Moment werden die Nachrichten in einer Datenbank gespeichert. Warum sollte ein einfaches Schreiben eines Dateisystems also viel langsamer sein? Bitte lesen Sie auch meine Antwort 1 Datei pro Benutzer \ Konversation !!! (Auf Ihrem fiktiven Cluster habe ich ein FSA-SAN installiert.) Die OPs-Anforderung klingt meiner Meinung nach nach Protokollierung \ Audit, die in eine Datei gehört.
Kevin Burton
5
Das Schreiben und Lesen in eine Datei ist ressourcenintensiv. Ich denke, die Verwendung einer Datenbank jeglicher Art sollte dazu beitragen, diese Ressourcenverzögerung zu verringern. Letztendlich speichern Datenbanken diese Informationen auch in Dateien (nur ein bisschen anders). Ich denke, die gegebene Idee ist fantastisch, um archivierte Chats oder Chats, die älter als 1 Jahr oder so sind, zu speichern. Aber nichts geht über eine einfache Datenbank.
Jay Patel - PayPal
3
OP sagt klar in der Datenbank, abgesehen von dieser schrecklichen Idee, dies nicht die Frage zu beantworten
Lyoneel
2

Sie können eine Datenbank für x Konversationen erstellen, die alle Nachrichten dieser Konversationen enthält. Auf diese Weise können Sie jedes Mal, wenn x überschreitet, eine neue Datenbank (oder einen neuen Server) hinzufügen. X ist die Anzahl der Gespräche, die Ihre Infrastruktur unterstützt (abhängig von Ihrer Hardware, ...).

Das Problem ist immer noch, dass es möglicherweise große Konversationen (mit vielen Nachrichten) in derselben Datenbank gibt. zB Sie haben Datenbank A und Datenbank B und speichern jeweils zB 1000 Konversationen. Es ist möglich, dass auf Server A weitaus mehr "große" Konversationen stattfinden als auf Server B (da es sich um vom Benutzer erstellte Inhalte handelt). Sie können eine "Master" -Datenbank hinzufügen, die eine Suche enthält, auf welcher Datenbank / auf welchem ​​Server die einzelnen Konversationen gefunden werden können (oder Sie haben ein Schema zum Zuweisen einer Datenbank aus Hash / Modulo oder Ähnlichem).

Vielleicht finden Sie Architekturen in der realen Welt, die sich mit denselben Problemen befassen (Sie sind möglicherweise nicht die ersten) und die bereits gelöst wurden.

Bernhard Kircher
quelle