2017-07-30 10 views
0

現在、NodeJS、AngularJS、MySQL、およびSocket.IOを使用する2人のユーザー間のプライベートチャットを行っています。私は何とかチャットを保存して、あなたが書いている新しいチャットがSocket.IOを介して送信されるのを見るだけでなく、あなたの現在のセッションの前に書いたメッセージも見られるようにしたい。2人のユーザー間でチャットを正しく保存する方法

これらの以前のチャットをサーバーに正しく保存するにはどうすればよいですか?

+0

...データベーステーブルにレコードを作成しますか?あなたは現在どこにいるのですか?あなたはテーブルデザインや他の何かに助けが必要ですか?また、AngularとNodeでタグ付けする必要はありません。 –

+0

これは非常に広いテーマであり、「適切に」という定義は非常に曖昧です。何か試しましたか、まったく初めですか? –

+0

私はテーブル "メッセージ"を作成し、すべてのメッセージを挿入することを考えましたが、メッセージがたくさんあると、非常に遅くなります – daG

答えて

1

これを行うための通常の方法は次のとおりです。

Table messages: 
message_id PRIMARY KEY 
sender_id  FOREIGN KEY 
recipient_id FOREIGN KEY 
Index on (sender_id, recipient_id, message_id) 
Index on (recipient_id, sender_id, message_id) 

しかし、この構造に問題がある:あなたが何かを持っていますので、効率的に「ID DESC」で最後のNメッセージをソートする簡単な方法はありません"where sender_id = ... OR recipient_id = ..."のようなあなたのWHEREの中で、これはちょっと役に立たない、最後の2つのインデックスを(高速ソートのために)作るでしょう。

賢く構造はこれです:

Table chatrooms: 
chatroom_id PRIMARY KEY 

Table chatrooms_users 
chatroom_id FOREIGN KEY 
user_id FOREIGN KEY 

、二人のユーザー(またはそれ以上)が一緒にチャットを開始するときに、あなたが作成または再利用するチャットルームを言っテーブルから、とchatroom_usersに関連する行を挿入のいずれかチャットルームをアクティブなメンバーにリンクします。これは、ユーザーがチャットルームに参加/離脱すると更新されるべきです。

会話は2人のだけのユーザー(と決して以上2)その後、あなたは単純な構造を使用することができ伴う場合:とにかく

Table conversations 
conversation_id PK 
first_user_id FOREIGN KEY 
second_user_id FOREIGN KEY 

を。全体的なアイデアは、2人のユーザ間またはチャットルームとの会話のスレッドに固有の識別子を与えることです。その後、メッセージテーブルがずっと簡単になり:

この場合
Table messages: 
message_id PK 
chatroom_id (or conversation_id) FK 
sender_id FK 
Index on (chatroom_id, message_id) 

、最後のインデックスがこれを最適化していることに注意してください:

したがって
SELECT * FROM messages WHERE chatroom_id=constant ORDER BY id DESC LIMIT 10 

、ユーザーは他のユーザーとのチャットウィンドウを開いたとき、あなたはインデックスルックアップを使用してconversation_id(またはchatroom_id)を簡単に見つけることができ、最後のメッセージを素早く一覧表示することもできます。

古いメッセージは、メッセージテーブルを小さくしてRAMにキャッシュできるように、アーカイブテーブルに移動して移動する必要があります。

関連する問題