我对firebase数据库中数据结构的最佳实践提出了一个简单的问题。
我希望我的应用用户能够维护朋友列表。 firebase文档建议创建一个尽可能平坦的模式(不确定这是否是这个上下文中的正确单词)。因此,我认为将朋友部分与数据库中的播放器部分分开是个好主意,如下所示:
{
"players":{
"player1id":{
"username":"john",...
},
"player2id": ...,
"player3id": ...
}
"friends": {
"player1id"{
"friends":{
"friend1Id":true,
"friend2Id":true
}
},
}
"player2id"{
"friends":{
"friend1Id":true,
"friend2Id":true
}
},
}
}
所以我的问题如下:
这是我的架构的好设计吗?
当为一个玩家拉出好友列表时,每个玩家的好友列表都会被拉出来吗?如果是的话,这可以避免吗?
此外,一旦应用程序拥有所有ID,最好的方法是获取有关朋友的其他信息。例如获取所有用户名,这些用户名将作为字符串存储在其播放器配置文件中。
答案 0 :(得分:3)
这是我的架构的好设计吗?
你已经在思考正确的方向了。但是,“朋友”节点可以简化为:
"friends": {
"player1id": {
"friend1Id":true,
"friend2Id":true
}
}
请记住,Firebase节点名称不能使用字符点(。)。所以,如果您的ID是整数,如1,2和3,一切都可以,但如果ID是用户名,请小心(例如“super123”可以,但“super.duper”不是)
当为一个玩家拉出好友列表时,每个玩家的好友列表都会被拉出来吗?如果是的话,这可以避免吗?
没有。如果你拉/朋友/ 1它显然不会拉/朋友/ 2等。
此外,一旦应用程序拥有所有ID,最好的方法是获取有关朋友的其他信息。例如获取所有用户名,这些用户名将作为字符串存储在其播放器配置文件中。
循环访问ID并再次从Firebase获取相应的节点。例如,如果用户1有朋友2,3和4,那么使用for循环获取/ players / 2,/ players / 3和/ players / 4
由于firebase pull异步工作,您可能需要使用计数器或其他一些机制,以便在拉出最后一个数据时可以继续运行完成代码。