3

プライベートチャットサービスをしたいです。これで、メッセージとスレッド (スレッド - ユーザー間の個室) を格納するための関係データベース (PostgreSQL) ができました。

次のテーブルがあります。

1) メッセージ: idtextdatetimesender_idthread_idis_read

2) スレッド: id

3) Thread_Participants: thread_iduser_id

Message テーブルは Thread_Participants テーブルを介して Many_to_Many の関係で Thread と接続されます。

私のアーキテクチャでは、ユーザーは Redis データベースの WebSocets と Pub/Sub を介してメッセージを交換します。

しかし、私の意見では、メッセージを関係データベースに保存する必要があるため、安全性が向上します。多分私は間違っています。

しかし、ユーザーのスレッドの履歴を取得するのに問題があります。次のフィールド (リレーション DB) をリクエストしたいと思います。

スレッド ID

last_message_in_this_thread

count_of_messages_in_this_thread

datetime_of_last_message_in_this_thread

username_of_last_message_in_this_thread

しかし、そのような要求は非常に困難で遅い要求を意味します...どうすれば高速な方法で取得できますか? それとも、メッセージの別の方法またはアーキテクチャがあるのでしょうか?

4

1 に答える 1

0
last_message_in_this_thread
count_of_messages_in_this_thread
datetime_of_last_message_in_this_thread
username_of_last_message_in_this_thread

これらはすべてスレッド テーブルにキャッシュできます。このクエリは、メッセージまたはユーザー テーブルに参加/クエリする必要がないため、非常に高速です。唯一の欠点は、新しいメッセージごとに、1 回ではなく 2 回の書き込みを行う必要があることです。

INSERT INTO messages(...) values (...);
UPDATE threads SET datetime_of_last_message = now(), count_of_messages = count_of_messages + 1 where id = 123;
于 2015-12-25T11:14:34.357 に答える