您将如何为Firebase中的用户和朋友模型建模?

Joh*_*oah 2 json nosql firebase firebase-realtime-database

我正在尝试使用Firebase创建一个数据库(json).我搜索了文档和网络,但找不到明确的方法开始.我想拥有一个用户数据库.每个用户(表示为UID)应该有一个昵称和一个朋友列表.

我尝试制作一个如下所示的.json文件:

{
  users:{

  }
}
Run Code Online (Sandbox Code Playgroud)

并将其添加到Firebase控制台以开始,但它不起作用.我该怎么做?

数据库应如下所示:

{
  users:{
       UID:{
          nickname: hello
          friends: UID2
       }
       UID2:{
          nickname: world
          friends: UID
  }
}
Run Code Online (Sandbox Code Playgroud)

我不知道我是否做得对,所以我非常感谢你们在这个问题上能给我的任何帮助.提前致谢!

Fra*_*len 9

似乎是一个好的起点.我会做两个改变.

  1. 保持列表是朋友分开
  2. 将朋友保留为一组,而不是单个值或数组

保持列表是朋友分开

使用Firebase数据库时的基本建议是保持数据结构浅/平.这有很多原因,你至少有两个.

  1. 使用您当前的数据结构,假设您要显示用户名列表.您只能通过收听来获取该列表/users.这意味着您不仅要获取每个用户的用户名,还要获取他们的朋友列表.您将向用户显示所有数据的机会很小,这意味着您只是浪费了一些带宽.

  2. 假设您希望允许每个人阅读用户名列表.但是您只希望每个用户都能够阅读他们自己的朋友列表.您当前的数据结构很难,因为权限级联规则不是过滤器.

更好的结构是将用户配置文件列表(当前只是他们的名称)与每个用户的朋友列表分开.

把朋友当作一套

您当前只拥有该friends属性的单个值.当您开始构建应用程序时,您将需要存储多个朋友.最常见的是然后存储一个数组或UIDS列表:

[ UID1, UID2, UID3 ]
Run Code Online (Sandbox Code Playgroud)

要么

{
  "-K.......1": "UID1"
  "-K.......5": "UID2"
  "-K.......9": "UID3"
}
Run Code Online (Sandbox Code Playgroud)

遗憾的是,这些数据结构的类型错误.数组和第二个集合都是列表:(可能)非唯一值的有序集合.但是,不需要订购朋友的集合,它必须是独一无二的.我要么在收藏中,要么我不在那里,我不能在那里多次,订单通常无关紧要.这就是为什么你经常最终寻找friends.contains("UID1")ref.orderByValue().equalTo("UID1")操作上述模型.

更好的模型是将数据存储为一组.集合是无序值的集合,必须是唯一的.非常适合朋友聚会.要将其存储在Firebase中,我们使用UID作为集合的关键字.由于我们无法在没有值的情况下存储密钥,因此我们将其true用作虚拟值.

所以这导致了这个数据模型:

{
  users:{
     UID:{
       nickname: hello
     }
     UID2:{
       nickname: world
     }
  }
  friends:{
     UID:{
       UID2: true
     }
     UID2:{
       UID: true
     }
  }
}
Run Code Online (Sandbox Code Playgroud)

对于一般的NoSQL数据建模和Firebase,还有更多的说法/了解.要了解这一点,我建议阅读NoSQL数据建模并观看Firebase for SQL开发人员.