2015-12-25 162 views
3

我想做私人聊天服務。現在我有一個關係數據庫(PostgreSQL)用於存儲我的消息和線程(線程 - 用戶之間的私人房間)。私人聊天的體系結構

我有以下表:

1)消息:ID文本日期時間SENDER_ID的thread_idis_read

2)螺紋:ID

3)Thread_Participants:的thread_idUSER_ID

消息表是用螺紋通過MANY_TO_MANY關係通過Thread_Participants表相連。

在我的架構中,用戶通過WebSocets和Redis數據庫的Pub/Sub交換消息。

但在我看來,我需要在關係數據庫中存儲消息,這對安全性更好。也許我錯了。

但我有一個獲取用戶線程歷史的問題。我想請求(關係DB)以下字段:

THREAD_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

但這樣的要求意味着相當困難和緩慢的請求......我怎麼能與快捷的方式得到它?或者,也許有另一種方式或消息架構?

+0

的可能的複製[優化GroupWise的最大查詢(http://stackoverflow.com/questions/24244026/optimize-groupwise-maximum-query) –

+0

@Jakub卡尼亞:不,我對全處建築的問題,我可以改變它。羣組最大查詢的優化是我的問題的一部分,或者只是解決方法之一。 – Anton

回答

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 

所有這些都可以緩存在線程表中。這個查詢將會非常快,因爲您不必加入/查詢消息或用戶表。唯一的缺點是:在每條新消息中,您現在必須執行兩次寫入而不是一次寫入。

INSERT INTO messages(...) values (...); 
UPDATE threads SET datetime_of_last_message = now(), count_of_messages = count_of_messages + 1 where id = 123; 
+0

對!例如觸發器。但我害怕這種方式,因爲我需要更新兩個表(消息和線程)而不是一個(消息)的每條消息。我的意思是它會增加數據庫每條消息的負載...還有另外一種方法可以在Redis中存儲新鮮的消息,並通過大量消息的一部分將它們推送到關係數據庫(在後臺),例如在10分鐘內進行一次......但我不知道... – Anton

+0

@安東:這是一個折衷,你將不得不做:) –

+0

我看到:)它很有趣它是如何實現在vkontakte? – Anton