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

Realtime Scalable Chat App - which database should I choose?

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

我知道对于冷聊天历史,RDBMS 或 Cassandra 可能是我最好的选择,但在 RDBMS 或 Cassandra 中处理朋友关系以及用户与聊天的关系是丑陋的。我不确定是否有必要、是否值得,甚至是否“正确”地在我的技术栈中为这种关系映射建立一个图形数据库。

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

我知道没有完美的工具来完成这项工作,但我希望有人对如何设计数据存储有想法和意见。

提前致谢!

最好在真实数据库中保持关系。 我在聊天应用程序中将 PostgreSQL 用于此类目的。

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

如果交易量不高,那么您可以使用 Postgresql,否则 Cassandra 是满足您提到的所有要求的不错选择。 在 Cassandra 中,您应该有多个 table 去规范化以实现低延迟和高可用性。

  1. 用户 - 创建一个拥有任何用户所有信息的主控table。
  2. User_Friend_relation - 创建另一个 table 具有复合主键作为 userid 和 freindid 以及集群键 is_active(0,1) desc。 ((userid,freindid),is_active)
  3. Chat_user_friend - 这是您的主要 table 聊天。创建此 table 并以时间戳作为聚类键并按降序存储数据,以便您可以通过实时排序节省时间,并且您首先拥有最新数据。
  4. 冷聊天历史 - 由于 Cassandra 具有高度可扩展性......不需要这个 table。

数据建模是一个需要大量讨论的领域,无论如何我尽量简单地回答这个问题。