web-dev-qa-db-ja.com

人々の間のチャットメッセージを保存するためのデータベース設計

メッセージング/チャットシステムを構築しようとしています。 2人の会話を時系列で保存できます。また、ユーザーAが会話を削除した場合でも、ユーザーBは、会話を削除するまで会話にアクセスできます。

  1. 受信ボックス-さまざまなユーザーからユーザーが受信したすべてのメッセージは、その特定のスレッドからの最新のメッセージとともに表示されます。

  2. 会話画面-ユーザーAとユーザーBの間の会話の時系列順

これが私が思いついたデータベースの基本構造です。メッセージをデータベースに2回保存する必要がありますか?

  1. id
  2. to_id
  3. from_id
  4. メッセージ
  5. タイムスタンプ
  6. 読んだ
18
Harsha M V

メッセージを表示する権限を持つユーザーを格納するメッセージのルックアップテーブルを使用します

table->message                   |    table->messageUsers
id->0, message->'hi', user_id->1      user_id->1, message_id->0
                                      user_id->2, message_id->0

そうすれば、ユーザーがメッセージを削除した場合、実際にはメッセージ自体ではなく、メッセージとの関係が削除されます。 messageUsersテーブルからそれらを削除するだけです。または、アクティブフィールドを1または0に設定します。

8
Tim Joyce

最初は、ある人がそれを削除したときに、ToまたはFromのいずれかをnullに変えることができると思いましたが、それでは、誰がメッセージを送信したか、誰にメッセージが送信されたかが失われます。

削除した人のIDを含む、またはnullになるフィールドdeleted_byを追加するだけです。したがって、受信トレイからレコードを選択すると、次のようになります。

To_id = MyIDおよびdeleted_by <> MyIDであるメッセージから*を選択します

メッセージを削除するときは、deleted_byがnullかどうかを確認します。nullの場合は、deleted_byフィールドをMyIDで更新し、そうでない場合(相手も削除したことを意味します)、レコードを削除します。

メッセージの代わりにスレッドに対して同じ機能を使用したい場合(つまり、一度に1つのメッセージではなく会話を管理する場合)、from_id、to_idフィールド、deleted_by、およびthread_idフィールドを持つ別のテーブル(MessageThreads)が必要です。 。メッセージテーブルで、from_idto_idとdeleted_byをthread_idに置き換えます。

2
John

2つのテーブルがあります。ノードnode_user

ノードテーブルで、

  • node_id
  • 題名
  • メッセージ
  • タイムスタンプ

Node_userテーブルで、

  • node_user_id(PK)
  • node_id
  • parent_node_id(スレッド用)
  • from_id
  • to_id
  • タイムスタンプ
  • 読んだ

ユーザーAがユーザーBにメッセージを送信するときは、最初にメッセージをノードテーブルに保存します。次に、node_userテーブルに2つのレコードを追加します。ユーザーAがメッセージを削除するときは、node_userテーブルの最初のレコードのみを削除してください。ユーザーBがメッセージを削除すると、ノードとnode_userテーブルの両方からレコードを削除できます。

スレッドメッセージ、

  • Parent_node_idを使用する
1
Thein Hla Maw