メッセージング/チャットシステムを構築しようとしています。 2人の会話を時系列で保存できます。また、ユーザーAが会話を削除した場合でも、ユーザーBは、会話を削除するまで会話にアクセスできます。
受信ボックス-さまざまなユーザーからユーザーが受信したすべてのメッセージは、その特定のスレッドからの最新のメッセージとともに表示されます。
会話画面-ユーザーAとユーザーBの間の会話の時系列順
これが私が思いついたデータベースの基本構造です。メッセージをデータベースに2回保存する必要がありますか?
メッセージを表示する権限を持つユーザーを格納するメッセージのルックアップテーブルを使用します
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に設定します。
最初は、ある人がそれを削除したときに、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つのテーブルがあります。ノードnode_user
ノードテーブルで、
Node_userテーブルで、
ユーザーAがユーザーBにメッセージを送信するときは、最初にメッセージをノードテーブルに保存します。次に、node_userテーブルに2つのレコードを追加します。ユーザーAがメッセージを削除するときは、node_userテーブルの最初のレコードのみを削除してください。ユーザーBがメッセージを削除すると、ノードとnode_userテーブルの両方からレコードを削除できます。
スレッドメッセージ、