チャットメッセージをデータベースに保存する最良の方法は?[閉まっている]


82

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

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

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


12
これらのメッセージが検索可能または編集可能である必要がない場合、データベース内に保持する意味はありません
ajreal 2011

20
簡単に始めて、簡単に考えて、リレーショナルデータベースを使用することをお勧めします。スケーリングが問題になる場合は、それに対処してください。完璧なインフラストラクチャの構築に多くの時間を費やし、重要なことに集中する時間がないため、決して発生しないシナリオを気にする人が多すぎます。
whirlwin

回答:


47

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

実際には、ここスタックオーバーフローでチャットのサンプルスキーマへのリンクを見つけることができます:

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


15

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

会話をテキストファイルに追加するだけです(ユーザー\会話ごとに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(GUID?)、およびファイル名への参照のみを保存する必要があります。

より単純でスケーラブルなソリューションを得るのは難しいと思います。

LOAD_FILEデータの取得にも使用できます:http//dev.mysql.com/doc/refman/5.0/en/string-functions.html

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


1
これは素晴らしいですね。誰かがこの議論に対抗できますか?
旅行

74
ファイルへの書き込みはひどい考えです。ほとんどのサーバー側環境またはクラスターでは、2番目の要求がファイルと同じサーバー上にあることを保証することすらできません。ファイルシステムの書き込みは非常に遅く、I / Oバウンドです。申し訳ありませんが、これほど多くの賛成票が得られたとは信じられません。
Andy Fusniak 2017年

6
申し訳ありませんが、私は実際に架空のシナリオを構成していない質問に答えていました。現時点では、メッセージはデータベースに保持されているので、単純なファイルシステムの書き込みがはるかに遅くなるのはなぜですか。また、ユーザー\会話ごとに私の答え1ファイルを読んでください!!! (架空のクラスターにFSA-SANをインストールしました)OPの要件は、ファイルに属していると思いますが、logging \ auditのように聞こえます。
ケビンバートン

5
ファイルへの書き込みと読み取りは、リソースを大量に消費します。あらゆる種類のデータベースを使用することで、そのリソースの遅延を減らすことができると思います。結局のところ、データベースはそれらの情報をファイルにも保存します(少し異なります)。与えられたアイデアは、アーカイブされたチャット、または1年以上前のチャットを保存するのに素晴らしいと思います。しかし、ここでは単純なdbに勝るものはありません。
Jay Patel-PayPal

3
OPは、このひどい考えは別として、データベースで明確に言っていますが、これは質問に答えません
Lyoneel 2018

2

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

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.