Firebase数据扁平化

时间:2016-09-06 19:32:44

标签: android firebase firebase-realtime-database

我对firebase数据库中数据结构的最佳实践提出了一个简单的问题。

我希望我的应用用户能够维护朋友列表。 firebase文档建议创建一个尽可能平坦的模式(不确定这是否是这个上下文中的正确单词)。因此,我认为将朋友部分与数据库中的播放器部分分开是个好主意,如下所示:

{


  "players":{
    "player1id":{
        "username":"john",...
    },
    "player2id": ...,
    "player3id": ...
  }


  "friends": {
     "player1id"{
        "friends":{
            "friend1Id":true,
            "friend2Id":true
        }
      },
   }
 "player2id"{
        "friends":{
            "friend1Id":true,
            "friend2Id":true
        }
      },
   }
 }

所以我的问题如下:

这是我的架构的好设计吗?

当为一个玩家拉出好友列表时,每个玩家的好友列表都会被拉出来吗?如果是的话,这可以避免吗?

此外,一旦应用程序拥有所有ID,最好的方法是获取有关朋友的其他信息。例如获取所有用户名,这些用户名将作为字符串存储在其播放器配置文件中。

1 个答案:

答案 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异步工作,您可能需要使用计数器或其他一些机制,以便在拉出最后一个数据时可以继续运行完成代码。