Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 实时可扩展聊天应用程序-我应该选择哪个数据库?_Database_Mongodb_Database Design_Chat - Fatal编程技术网

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

Database 实时可扩展聊天应用程序-我应该选择哪个数据库?,database,mongodb,database-design,chat,Database,Mongodb,Database Design,Chat,我希望构建一个可扩展的实时聊天应用程序(我这样做只是为了好玩,出于兴趣,所以请不要问为什么!),我知道我将通过redis处理实时消息部分,但我不确定以下信息使用哪个数据库: 用户关系(朋友) 冷聊天历史记录-只能按时间戳顺序以有限数量(可能像50条消息)进行查询,并以相反的方式进行查询(就像滚动查看旧消息时在imessage或whatsapp中加载消息一样) 聊天用户关系 我知道在冷聊天历史中,RDBMS或Cassandra可能是我最好的选择,但在RDBMS或Cassandra中处理朋友关系

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

  • 用户关系(朋友)
  • 冷聊天历史记录-只能按时间戳顺序以有限数量(可能像50条消息)进行查询,并以相反的方式进行查询(就像滚动查看旧消息时在imessage或whatsapp中加载消息一样)
  • 聊天用户关系
我知道在冷聊天历史中,RDBMS或Cassandra可能是我最好的选择,但在RDBMS或Cassandra中处理朋友关系以及用户与聊天室的关系是很难看的。我不确定仅仅为了这种关系映射在我的技术堆栈中拥有一个图形数据库是否必要、是否值得,甚至“正确”

我想MongoDB或其他一些基于文档的存储可能是一个解决方案,但查询数据似乎真的很费劲。我的想法是创建一个包含用户列表的聊天文档,然后创建几个其他文档,其中包含指向消息文档的消息id列表。这些文档将映射回chatID。我相信您可以看到,查询一组消息所需的时间和资源将非常多。也许我只是低估了MongoDB的威力,因为我还没有真正使用它。通过将用户ID存储在文档中的列表中,我还可以更轻松地处理使用文档和友谊的聊天用户关系

我知道这项工作没有完美的工具,但我希望有人能就如何设计数据存储提出想法和建议


提前谢谢你

最好在房地产数据库中保持关系。 我在聊天应用程序中使用PostgreSQL实现这一目的

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

如果事务量不高,则可以使用PostgreSQL,否则Cassandra是满足所有上述要求的最佳选择。 在Cassandra中,为了实现低延迟和高可用性,应该有多个非规范化的表

  • 用户-创建包含所有用户信息的主表
  • User\u Friend\u relationship-创建另一个表,该表的复合主键为userid和freindid,集群键为活动(0,1)desc.((userid,freindid),is\u活动)
  • Chat\u user\u friend-这是您拥有所有聊天功能的主表。使用时间戳作为集群键创建此表,并按desc顺序存储数据,这样您就可以通过实时排序节省时间,并且您首先拥有最新的数据
  • 冷聊天历史-由于Cassandra具有高度可扩展性。。。不需要这张桌子
  • 数据建模是一个需要进行大量讨论的领域,无论如何,我试图尽可能简单地回答这个问题