Firebase数据库中的多用户聊天室数据结构

时间:2018-09-07 08:21:10

标签: swift firebase firebase-realtime-database

我很难确定如何正确构造多用户聊天室FirebaseDatabase的体系结构。

基本上,该应用程序支持用户之间的私人消息(可以是2个用户或多个用户之间)。如果仅在2个用户之间,则数据结构确实非常容易。

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

所以,这就是想法,假设用户选择了另一个聊天对象。我在想这样的事情:

enter image description here

enter image description here

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

1 个答案:

答案 0 :(得分:2)

如果我理解这个问题,则该应用有多个用户,并且这些用户可能会进行1-1或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进行对话。

在任何时间都有事件(例如,将新消息添加到聊天中时添加.childAdd),只有那些观察该聊天(“已订阅”)的用户才会收到事件。

显然,每个聊天节点(时间戳等)中将包含更多详细信息

  

我如何检查是否已经有与相同收件人的聊天(或   收件人)基于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中,但尚未收到他们的来信。