web-dev-qa-db-ja.com

データベースにチャットメッセージを保存する最良の方法は?

チャットアプリを作成していますが、チャット会話で送信されたすべてのメッセージの完全な履歴が必要です。現時点では、各メッセージを「メッセージ」というテーブルの単一行として保存しています。 「こんにちは」のような小さなメッセージにも独自のデータベースレコードがあるため、このテーブルが大きくなる可能性があることを認識しています。

誰でもよりスケーラブルなmysqlソリューションを推奨できますか?個々のメッセージが検索可能、編集可能、または削除可能である必要はありません。会話全体を1つの大きなフィールドに保存できますか?

あなたのアイデアを聞いてみたい!

57
wilsonpage

データベースに履歴全体を保存することに何の問題もありません。それらはその種のタスクのために準備されています。

実際、ここでStack Overflowにチャットのサンプルスキーマへのリンクを見つけることができます。 example

それでもサイズが心配な場合は、一定時間(1分程度)後にのみプッシュするアプリケーションにバッファーを追加するなど、グループメッセージにいくつかの最適化を適用できます。そうすれば、1行のメッセージだけを避けることができます。

40
jasalguero

単一のファイルへの同時書き込みの必要性を回避できる場合、チャットメッセージを保存するためのデータベースは必要ないと思われます。

テキストファイルに会話を追加するだけです(ユーザー\会話ごとに1ファイル)。ディレクトリ/ファイル構造を持っている

ファイル構造の簡略化されたビューは次のとおりです。

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?

ユーザーID、会話ID(ガイド?)、およびファイル名への参照のみを保存する必要があります。

もっとシンプルで拡張可能なソリューションを得るのは難しいと思うと思います。

LOAD_FILEを使用してデータを取得することもできます。 http://dev.mysql.com/doc/refman/5.0/en/string-functions.html

会話を再構築する必要がある場合は、送信されたチャットメッセージ(ファイル内)に値(日付時刻)を追加して、ファイルをマージおよび並べ替えることができるようにする必要がありますが、この時点ではおそらく良い考えですデータベースの使用を検討する。

20
Kevin Burton

これらの会話のすべてのメッセージを含むx会話用のデータベースを作成できます。これにより、xを超えるたびに新しいデータベース(またはサーバー)を追加できます。 Xは、インフラストラクチャがサポートする会話の数です(ハードウェアに依存します...)。

問題は、同じデータベース上で大きな会話(大量のメッセージ)が発生する可能性があることです。例えばデータベースAとデータベースBがあり、それぞれが保存されています。 1000件の会話。サーバーBよりもサーバーAの方がはるかに多くの「大きな」会話がある可能性があります(これはユーザーが作成したコンテンツであるため)。ルックアップを含む「マスター」データベースを追加できます。このデータベースでは、単一の会話を見つけることができます(または、ハッシュ/モジュロなどからデータベースを割り当てるスキーマがあります)。

同じ問題に対処する現実世界のアーキテクチャを見つけることができるかもしれません(最初の問題ではないかもしれませんが)、すでに解決されています。

1