Firebase查询双向链接

时间:2016-05-22 19:26:45

标签: firebase

我正在设计一个类似Facebook Messenger的聊天应用程序。我的两个当前根节点是chatsusers。用户具有关联的聊天列表users/user/chats,并且聊天是通过chats节点chats/a151jl1j6中的autoID添加的。该节点存储诸如消息列表,最后消息的时间,是否有人打字等信息。

我挣扎的是在哪里定义哪两个用户在聊天中。最初,我将对其他用户的引用作为users/user/chats节点中chatId键的值,但我认为这是一个坏主意,因为我曾经想过群聊。

更合理的是拥有chats/chat/members节点,我在其中定义userId: true, user2id: true。我的问题是如何有效地查询它。例如,如果用户要与用户创建新聊天,我们想要检查他们之间是否已存在聊天。我不确定如何查询"查找成员包含currentUserIdfriendUserId"或者,如果这是一种有效的非规范化的做事方式。

任何提示?

2 个答案:

答案 0 :(得分:2)

虽然以id1---||---id2格式使用id的想法肯定会完成工作,但如果您希望拥有大型组并且您必须考虑id2---||---id1比较,那么它可能无法扩展当你在谈话中有更多的人时很复杂。如果你不需要担心大群体,你应该去做。

我实际上使用autoId chats/a151jl1j6,因为你免费获得它。构建数据的推荐方法是使autoId成为具有相关子对象的其他节点中的键。因此chats/a151jl1j6将包含会话元数据,members/a151jl1j6将包含该会话中的成员,messages/a151jl1j6将包含消息等。

"chats":{
    "a151jl1j6":{}}

"members":{
    "a151jl1j6":{
        "user1": true,
        "user2": true
    }
}

"messages":{
    "a151jl1j6":{}}

这得到的部分很少“低效”是查询包含user1和user2的对话。建议的方法是为每个用户创建会话索引,然后查询members数据。

"user1":{
    "chats":{
        "a151jl1j6":true
    }
}

在查询与扁平化数据结构的关系时,这是一种权衡。查询速度很快,因为您只处理数据的子集,但最终需要在修改/删除时需要考虑大量重复数据,即当用户离开聊天对话时,您必须更新多个结构。

参考:https://firebase.google.com/docs/database/ios/structure-data#flatten_data_structures

答案 1 :(得分:1)

我记得我前段时间有过类似的问题。我如何解决它的方式:

  • 用户1具有唯一ID id1
  • 用户2具有唯一ID id2

而不是通过autoId chats/a151jl1j6添加新聊天,聊天的ID是id1---||---id2 (超级原始的人类可读的分隔符)

(这正是您最初的建议)

  

最初,我将对其他用户的引用作为users / user / chats节点中chatId键的值,但我认为这是一个坏主意,以防我想要群组聊天。

有一句话:https://en.wikipedia.org/wiki/You_aren%27t_gonna_need_it

路径中可能存在多少个用户ID可能存在限制 - 您始终可以对该值进行哈希处理...