【问题标题】:Multi-users chat room data structure in Firebase DatabaseFirebase 数据库中的多用户聊天室数据结构
【发布时间】:2019-02-12 13:25:21
【问题描述】:

我很难弄清楚如何正确构建多用户聊天室 FirebaseDatabase 架构。

基本上,该应用程序支持用户之间的私人消息(可以是 2 个用户或多个用户之间)。如果只是在 2 个用户之间,数据结构真的很简单。

我正在尝试降低成本(我不希望当前登录的用户正在与某人聊天并且观察者收到与此特定聊天无关的所有消息)并正确构建数据.如果仅在 2 个用户之间,我总是可以在当前用户 ID 下添加接收者并仅查询该节点。但是对于多个用户(甚至不确定其中有多少),我需要依赖聊天室 ID,但我很难做到这一点。

所以,这里的想法,假设用户选择另一个开始聊天。我在想这样的事情:

我面临的问题是维护chatId。每次用户要发送新消息时,如何根据chatId 检查是否已经与相同的接收者(或多个接收者)进行了聊天。这对我来说是令人困惑的部分。我已经坚持了好几天了,我想不出一种正确的方法来维护chatId 并正确查询它。欢迎任何帮助。

【问题讨论】:

  • 我通常建议使用基于参与者 UID 的“房间 ID”。这意味着您将始终为相同的参与者获得相同的房间 ID。有关这方面的一个简单示例,请参阅stackoverflow.com/questions/33540479/…
  • @FrankvanPuffelen 如果你有 30 个参与者怎么办? uid 会不会太长?我不确定Firebase 中的id 长度是否有最大限制。比如,假设你的典型用户uid 是这么长的5JiKVeb2FmdMD626iyYjRyKDkkf2。现在,如果我们获得所有用户 uids,是否会被允许/接受为 roomId 值,因为它会很长?
  • 在这种情况下,您可以对连接的 UID 进行哈希处理。碰撞的机会对我来说似乎很小。或者,您可以为每个用户创建单独的房间 ID 查找,如下所示:stackoverflow.com/questions/51885395/…stackoverflow.com/questions/50146628/… 和这里 stackoverflow.com/questions/48178492/…

标签: swift firebase firebase-realtime-database


【解决方案1】:

如果我理解这个问题,该应用有多个用户,这些用户可能会进行一对一或一对多的聊天,而您希望避免用户收到他们不参与的聊天的事件。

让我们从用户节点开始

users
  uid_0
    name: "Bill"
    chats:
      chat_id_0: true
      chat_id_9: true
  uid_1
    name: "Jesse"
    chats:
      chat_id_0: true
      chat_id_6: true
  .
  .
  .

然后是一个简化的聊天节点

chats
   chat_id_0:
     uid_0: "Hey there, Jesse"
     uid_1: "Sup Bill?"
   chat_id_6:
     uid_0: "This is Bill, anyone around?"
   chat_id_9:
     uid_1: "Look ma, no hands"
     uid_7: "Impressive"

在上面,chat_id_x 是在用户开始聊天时使用 .childByAutoId 创建的。

当 Bill 登录时 (uid_0) 读取他的聊天节点,然后将观察者添加到该节点中列出的聊天中。在这种情况下,Bill 是 chat_id_0 和 chat_id_9 的一部分。对属于 0 和 6 的 Jesse 执行相同的过程。

Bill 和 Jesse 正在 chat_id_0 中聊天,Bill 正在等待任何同时观看 chat_id_6 的用户的回复,而 Jesse 正在 chat_id_9 中与 uid_7 交谈。

只要有事件发生(例如,将新消息添加到聊天中时添加 .childAdded),只有观察该聊天(“订阅”)的用户才会收到事件。

显然每个聊天节点中都会包含更多细节(时间戳等)

我如何检查是否已经与同一接收者聊天(或 接收者)基于chatId

有几种方法可以解决这个问题;

一个是当观察者被添加到每个聊天时,您是 (.childAdded) 的一部分,该聊天节点中的每个子节点都将返回到您的应用程序。这对两件事有好处 - 一是使用现有聊天消息填充 UI,二是......然后您将知道谁参与了该聊天。将这些 UID 与聊天 ID 保存在数组中,然后在向该人发送聊天之前查看它们是否作为现有聊天存在于数组中。

第二个选项是查询用户 uid 出现的所有聊天记录(使用 .observeSingleEvent 查询)。这将返回他们所属的所有聊天节点,然后有他们正在聊天的其他人的 uid 以及聊天 id。

另一个选项是在创建聊天时,/chat_id_0,添加一个名为 /who_dat 的子节点,用于保存受邀加入聊天的人员列表

chats
  chat_id_0
     who_dat
        uid_0: true
        uid_1: true
        uid_2: true
     messages:
        uid_0: "Hey there, Jesse"
        uid_1: "Sup Bill?"

在这种情况下,uid_2 也已添加到 chat_id_0 但尚未收到他们的消息。

【讨论】:

  • 太棒了!谢谢你的详细解释,我觉得我还有更多问题,但当我到达那个点时,我会单独发布它们。再次感谢您!
猜你喜欢
  • 2017-01-04
  • 1970-01-01
  • 2018-06-01
  • 2017-11-16
  • 2014-10-01
  • 2023-04-06
  • 1970-01-01
  • 1970-01-01
  • 2018-03-03
相关资源
最近更新 更多