2017-05-21 22 views
0

私は1対1のメッセージとチャットルームの両方を人のグループに許可する非常に簡単なチャットアプリを構築しています。私は、すべてのチャットメッセージを保存するために1つのメッセージテーブルを用意し、各メッセージも送信者IDと受信者IDを保持する予定です。チャットルームで送信されたメッセージの場合は、チャットルームのIDも保持します。以下の表である:私は、ユーザー321だ、と私は、ユーザ123と私の会話を取得したい場合は、MySQL DBにチャットメッセージを保存する、スキームデザイン

Message Table 

ID  Message    Sender  Receiver Chatroom Timestamp  
1  Hello, David   123   321      1495330074 
2  Hi, Linda    321   123      1495930032 
3  Hi everyone!   456      999  1495930132 
4  What up?    321   123      1495930192 

... 

、私はこのデザインの1つの問題がありSELECT * FROM Message WHERE Sender=123 or Receiver=123 or Sender=321 or Receiver=321 and Chatroom IS NULL

に必要 - ユーザーを彼がもう見たくないメッセージを削除することはできません。それを解決するために

、私は以下のように、私は、ユーザーが受信または送信されたものをメッセージ保存するために別のテーブルを持つことができると思う:

User Message Table 

ID  UserID    MessageID    
1  123     1      
2  321     1 
3  321     4 
... 

それは少し冗長に見えますが、このようダビデは、メッセージを削除することができますリンダとの彼の会話では、リンダはまだ完全な会話の歴史を見ることができます。

テーブルのデザインが改善されていますか?そして、すべてのチャットメッセージを1つの巨大なテーブルに投げるのはこの良い習慣ですか?クエリを高速化するためにインデックスを追加する必要がありますか?

+0

を取得し、メッセージ から削除します。このフォーラムで「チャット」を検索して他の人が何をしているかを確認してください。 –

答えて

0

このクエリを使用できます。

delete from Message 
where sender = 123 and user = 321 

ただし、このユーザーと送信者の間のすべてのチャットメッセージは削除されます。あなたはID

を使用することができ、特定のメッセージを削除するには、あなたのテーブルは `OR`がひどく遅くなることを、大きなID = 1

+0

それは動作しません、あなたはDBのメッセージを決して削除するべきではありません。私が言ったように、Davidが彼とLindaの会話でメッセージを削除しても、Lindaはまだそのメッセージを見るべきです。 – Arch1tect

関連する問題