什么';在firebase实时数据库中存储聊天日志的最具可扩展性和性能的解决方案是什么?

什么';在firebase实时数据库中存储聊天日志的最具可扩展性和性能的解决方案是什么?,firebase,firebase-realtime-database,Firebase,Firebase Realtime Database,我正在使用firebase实时数据库作为数据库开发聊天客户端。它目前的工作方式是,它将两个人之间的聊天日志保存在聊天记录集中,每个条目的格式如下-。这非常有用,因为它只需查找您的uid和您想要聊天的人的uid,然后对其进行排序,因此它始终是一种一致的格式,然后查看聊天集合中是否存在该条目,如果存在,它只会添加到该条目中。否则它会创建一个新的 这真是太棒了。不过,如果我们想让多人像闲聊一样一起交谈,我会尝试提前思考。我可以添加3个甚至4个用户的uid作为密钥,但最终它会非常长。firebase密

我正在使用firebase实时数据库作为数据库开发聊天客户端。它目前的工作方式是,它将两个人之间的聊天日志保存在聊天记录集中,每个条目的格式如下
-
。这非常有用,因为它只需查找您的uid和您想要聊天的人的uid,然后对其进行排序,因此它始终是一种一致的格式,然后查看聊天集合中是否存在该条目,如果存在,它只会添加到该条目中。否则它会创建一个新的

这真是太棒了。不过,如果我们想让多人像闲聊一样一起交谈,我会尝试提前思考。我可以添加3个甚至4个用户的uid作为密钥,但最终它会非常长。firebase密钥的限制为768字节。显然,这大约在500到700个字符之间。我怀疑我们的关键是否会持续那么久,但如果我们现在能够找到一个更具可扩展性的解决方案,并且不需要我们以后修复数据,我宁愿这样做。 我认为每个聊天条目都可以有一个参与者数组,其中包含该聊天中所有用户的uid。然后,如果您想与某人聊天,我们需要查询所有聊天条目,并检查每个条目中的数组,以查找当前用户uid和他们想要聊天的人的uid。但这似乎不是很有效


您对哪种实现更好/更具可扩展性/性能有何想法?或者是对另一个实现的建议?

简单地使用结果UID串联的哈希值怎么样

或者:

  • 拿出自己独特的房间钥匙,例如使用推送ID
  • 使用聊天室键创建一个新的顶级节点,并将连接的UID作为值存储在该节点中:

    聊天室钥匙 push-id1:uid1-uid2-uid3 push-id2:uid1-uid2-uid3-uid4-uid5-uid6 push-id3:uid3-uid4-uid5-uid6-uid7-uid8-uid8-uid10

  • 在此结构中,您可以通过以下方式查找一组参与者的房间钥匙:

    firebase.database().ref("chatroom-keys").orderByValue().equalTo("uid1-uid2-uid3")
    

    简单地使用UID的结果串联的散列如何

    或者:

  • 拿出自己独特的房间钥匙,例如使用推送ID
  • 使用聊天室键创建一个新的顶级节点,并将连接的UID作为值存储在该节点中:

    聊天室钥匙 push-id1:uid1-uid2-uid3 push-id2:uid1-uid2-uid3-uid4-uid5-uid6 push-id3:uid3-uid4-uid5-uid6-uid7-uid8-uid8-uid10

  • 在此结构中,您可以通过以下方式查找一组参与者的房间钥匙:

    firebase.database().ref("chatroom-keys").orderByValue().equalTo("uid1-uid2-uid3")
    

    谢谢你的回复!我意识到,一旦与指定用户开始聊天,那么如果我想向聊天中添加另一个用户,我需要与以前的用户以及新用户开始新的聊天。这似乎并不理想。但你的替代方案似乎能解决这个问题,对吗?因为我可以从特定聊天室密钥的值中添加/删除uid,对吗?是的,这两个问题都是一样的。聊天工具通常会考虑添加一个新的人成为一个新的聊天室(因此失去历史)。我不久前在这里写了一个答案:。通常,我会在您描述的另一个场景中使用“命名房间”,并保留一个
    userRooms
    列表,您可以在其中将每个
    UID
    与其房间关联。在我看来,您的想法解决了这一问题,因为我们可以删除特定的UID&然后用户就不再具有访问权限。如果我们添加uid,那么新用户可以访问现有房间的消息,并可以查看以前的消息。我错过什么了吗?我认为另一个可行的想法是,
    chat
    集合中的每个聊天条目都是一个聊天室。每个聊天室都有一个
    参与者
    字符串属性,其中包含推送消息的UID和messages对象属性。然后,我可以根据需要从
    participants
    属性中删除/添加参与者。您认为这有什么问题吗?您通常会同时需要:
    /participantroom
    /roomParticipants
    。在
    participantRooms
    中,每把钥匙都是一个UID,在该UID下,您有他们的房间ID。在
    roomParticipants
    中,每把钥匙都是一个房间ID,在该ID下保存参与者的UID。然后,您可以签入用户只能读取其参与的房间的安全规则。将所有数据保存在顶级集合中可以使用这些安全规则,并尽可能轻量级地加载列表。为什么我需要将数据保存在顶级集合中才能使用您提到的安全规则?你知道有没有更详细的证明文件?谢谢你的回复!我意识到,一旦与指定用户开始聊天,那么如果我想向聊天中添加另一个用户,我需要与以前的用户以及新用户开始新的聊天。这似乎并不理想。但你的替代方案似乎能解决这个问题,对吗?因为我可以从特定聊天室密钥的值中添加/删除uid,对吗?是的,这两个问题都是一样的。聊天工具通常会考虑添加一个新的人成为一个新的聊天室(因此失去历史)。我不久前在这里写了一个答案:。通常,我会在您描述的另一个场景中使用“命名房间”,并保留一个
    userRooms
    列表,您可以在其中将每个
    UID
    与其房间关联。在我看来,您的想法解决了这一问题,因为我们可以删除特定的UID&然后用户就不再具有访问权限。如果我们添加uid,那么新用户可以访问现有房间的消息,并可以查看以前的消息。我错过什么了吗?我认为另一个可行的想法是,
    chat
    coll中的每个聊天条目