我正在设计一个类似Facebook Messenger的聊天应用程序。我的两个当前根节点是chats
和users
。用户具有关联的聊天列表users/user/chats
,并且聊天是通过chats
节点chats/a151jl1j6
中的autoID添加的。该节点存储诸如消息列表,最后消息的时间,是否有人打字等信息。
我挣扎的是在哪里定义哪两个用户在聊天中。最初,我将对其他用户的引用作为users/user/chats
节点中chatId键的值,但我认为这是一个坏主意,因为我曾经想过群聊。
更合理的是拥有chats/chat/members
节点,我在其中定义userId: true, user2id: true
。我的问题是如何有效地查询它。例如,如果用户要与用户创建新聊天,我们想要检查他们之间是否已存在聊天。我不确定如何查询"查找成员包含currentUserId
和friendUserId
"或者,如果这是一种有效的非规范化的做事方式。
任何提示?
答案 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)
我记得我前段时间有过类似的问题。我如何解决它的方式:
id1
id2
而不是通过autoId chats/a151jl1j6
添加新聊天,聊天的ID是id1---||---id2
(超级原始的人类可读的分隔符)
(这正是您最初的建议)
最初,我将对其他用户的引用作为users / user / chats节点中chatId键的值,但我认为这是一个坏主意,以防我想要群组聊天。
有一句话:https://en.wikipedia.org/wiki/You_aren%27t_gonna_need_it
路径中可能存在多少个用户ID可能存在限制 - 您始终可以对该值进行哈希处理...