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!
mysql
scalability
chat
wilsonpage
quelle
quelle
Antworten:
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
quelle
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_FILE
die Daten abrufen, siehe: http://dev.mysql.com/doc/refman/5.0/en/string-functions.htmlWenn 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.
quelle
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.
quelle