私人聊天的体系结构

时间:2015-12-25 11:09:27

标签: postgresql chat groupwise-maximum

我想做私人聊天服务。现在我有一个关系数据库(PostgreSQL)用于存储我的消息和线程(线程 - 用户之间的私人空间)。

我有以下表格:

1)消息: id 文字日期时间 sender_id thread_id is_read

2)主题: id

3)Thread_Participants: thread_id user_id

消息表通过Thread_Participants表与Thread by Many_to_Many关系连接。

根据我的架构,用户通过WebSocets和Pub / Sub of Redis数据库交换消息。

但在我看来,我需要在关系数据库中存储消息,这对安全性更好。也许我错了。

但是我在获取用户线程的历史方面遇到了问题。我想请求(关系数据库)以下字段:

的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

但是这样的要求意味着相当艰难和缓慢的要求......我怎样才能以快捷的方式获得它?或者可能还有另一种消息方式或架构?

1 个答案:

答案 0 :(得分: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;