【问题标题】:Firebase chat app: query messages, optimize query that should be OR, or improve NoSQL db structureFirebase 聊天应用:查询消息,优化应该是 OR 的查询,或改进 NoSQL 数据库结构
【发布时间】:2016-05-10 13:08:40
【问题描述】:

我正在使用 Firebase 在 Android 上开发一个应该嵌入聊天的应用。

我的问题是,要获取消息,我需要查询在发送者或接收者字段中具有我的 uid 的所有消息。这在 MySQL 中非常容易做到,但在 Firebase 中(我必须坚持使用 Firebase)看起来有点痛苦。

我不能像那样过滤它们。作为聊天对象的receiversender 字段,当我使用像firebase.myapp.io/chat 这样的Firebase url 时,我什至无法过滤它们。

因此,此模型中唯一可能的解决方案是获取所有聊天记录并通过客户端过滤它们。这几乎是完成这项工作的好方法。此外,当消息很多时,如果应该的话,一切都可能变得非常缓慢。

所以我想了不同的方法来达到这个结果:

  • 我在聊天中获得了与用户 uid 对应的键。在这些值中,我从用户的角度获得了聊天,或者我将接收者的键作为值,并在消息中

但我不太喜欢这个,因为它可能非常多余,因为每条消息都应该在数据库中插入两次。

另一种方法是将消息键存储到另一个对象中,例如聊天消息,在其中我将用户 uid 作为值和包含聊天消息键的键。

管理多个私人聊天对话的最佳 NoSQL 方式是什么?

【问题讨论】:

  • 复制数据在 NoSQL 数据库中很常见。请参阅 stackoverflow.com/questions/33540479/… 了解建模聊天室的一种方法。
  • 所以我应该创建像chat_uid1_uid2和chat_uid2_uid1这样的对象?在里面我应该把对话放在正确的位置(带有时间和文本的消息对象,最终还有其他内容)?
  • 我经常发现自己在数据库中建模,我在屏幕上看到的内容。因此,如果您想要个人聊天室,我会为个人聊天室建模。究竟什么最适合您,取决于许多我不知道的因素(您可能也不知道)。如果您想阅读更多内容,我推荐this article about NoSQL data modeling

标签: java android firebase firebase-realtime-database nosql


【解决方案1】:

我目前在创建聊天应用程序时遇到了同样的问题。我最近找到了一个解决方案:

1) 我基本上使用了两个用户的唯一 ID,并使用 ID.getBytes() 将它们转换为数字。

2)然后我将两个数字相加(加法)并再次将它们转换为 base64 数字。

3) 使用生成的数字作为聊天室的 id。

它有效,但由于我为一个 android 应用程序做所有这些,它向我显示了一个警告,即在主线程上做太多工作。 如果有人知道更好的方法,请告诉我!

【讨论】:

  • 根据字母顺序组合两个用户 ID,并将其用作聊天室 ID。
猜你喜欢
  • 1970-01-01
  • 2016-04-21
  • 2016-06-28
  • 1970-01-01
  • 2017-01-04
  • 2018-06-01
  • 1970-01-01
  • 2012-05-06
  • 1970-01-01
相关资源
最近更新 更多