mongodb 实时可扩展聊天应用程序-我应该选择哪个数据库?

hec6srdp  于 2023-06-29  发布在  Go
关注(0)|答案(3)|浏览(114)

我希望建立一个可扩展的实时聊天应用程序(我只是做这个的乐趣和出于兴趣,所以请不要问为什么!),我知道我将通过redis处理实时消息部分,但我不确定使用什么数据库来存储以下信息:

  • 用户关系(朋友)
  • 冷聊天历史-这将只在有限的数量查询(也许像50消息)按时间戳排序和反向查询(就像你的消息将加载在imessage或whatsapp滚动查看旧消息时)
  • 聊天用户关系

我知道对于冷聊天历史,RDBMS或Cassandra可能是我最好的选择,但在RDBMS或Cassandra中处理朋友关系以及用户聊天关系是丑陋的。我不确定在我的技术堆栈中仅仅为了这个关系Map而拥有一个图形数据库是否必要、值得,甚至是“正确”的。
我认为MongoDB或其他基于文档的存储可能是一个解决方案,但查询数据似乎真的很费力。我的想法是有一个聊天文档,有一个列表的用户,然后我会有几个其他的文件与一个列表的消息id的指向消息文档。这些文档将被Map回chatID。我相信您可以看到,查询一组消息所需的时间和资源将非常多。也许我只是低估了MongoDB的力量,因为我还没有真正使用过它。我也可以更容易地处理聊天用户关系使用的文件以及友谊,只是存储用户ID在一个列表中的文件。
我知道没有完美的工具的工作,但我想有人的想法和投入如何设计的数据存储。
感谢您的评分

olmpazwi

olmpazwi1#

最好在关系数据库中保持关系。我在我的聊天应用程序中使用PostgreSQL来实现这些目的。
对于聊天记录和其他事件,Cassandra是一个不错的选择(我也使用Cassandra)。但是,这取决于您的数据库大小(记录数量)。如果你不需要为成千上万的用户保留成千上万的历史消息,那么使用Cassandra将是一种矫枉过正的做法。在这种情况下,您也可以使用PostgreSQL或其他关系数据库。在PostgreSQL中,可以使用分区来优化对历史表的访问。

yuvru6vn

yuvru6vn2#

如果交易量不高,那么你可以选择PostgreSQL,否则Cassandra是满足你所有要求的好选择。在Cassandra中,您应该将多个表去规范化,以实现低延迟和高可用性。
1.用户-创建包含任何用户的所有信息的主表。

  1. User_Friend_relation -创建另一个表,其复合主键为userid & freindid,聚类键为is_active(0,1)desc。((userid,freindid),is_active)
  2. Chat_user_friend -这是你的主表,有所有的聊天。创建此表,使用时间戳作为聚类键,并按desc顺序存储数据,以便您可以通过真实的排序来保存时间,并且您首先获得最新数据。
    1.冷聊天历史-由于Cassandra具有高度可扩展性...不需要这张table。
    数据建模是一个需要大量讨论的领域,无论如何,我试图尽可能简单地回答这个问题。
bvpmtnay

bvpmtnay3#

这可能已经太晚了,但可以帮助其他人:我仍然认为,使用像PostgreSQL这样的RDB进行有效的数据建模要好得多。postgres处理和解析半结构化数据(如JSON)的能力令人印象深刻。所以,对于所有的需求,除非你处理的是Antek提到的大量聊天记录。
This在这方面是一个非常有用的帖子。

相关问题