繁体   English   中英

你如何将model的用户和Firebase中的朋友收藏起来?

[英]How would you model a collection of users and friends in Firebase?

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

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

{
  users:{

  }
}

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

数据库应如下所示:

{
  users:{
       UID:{
          nickname: hello
          friends: UID2
       }
       UID2:{
          nickname: world
          friends: UID
  }
}

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

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

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

保持列表是朋友分开

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

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

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

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

把朋友当作一套

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

[ UID1, UID2, UID3 ]

要么

{
  "-K.......1": "UID1"
  "-K.......5": "UID2"
  "-K.......9": "UID3"
}

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

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

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

{
  users:{
     UID:{
       nickname: hello
     }
     UID2:{
       nickname: world
     }
  }
  friends:{
     UID:{
       UID2: true
     }
     UID2:{
       UID: true
     }
  }
}

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

我保留了一个Friends集合,其中users字段是 2 个用户 ID 的数组: ['user1', 'user2']

获得用户的朋友很容易:

friendsCollection.where("users", "array-contains", "user1").get()

这应该会为您提供 user1 出现的所有文档。

现在棘手的部分是如何查询单个朋友。 理想情况下, firebase 将支持array-contains中的多个值,但他们不会这样做: https://github.com/firebase/firebase-js-sdk/issues/1169

所以他们解决这个问题的方法是在添加文档之前规范化users列表。 基本上,我利用 JS 的真实性来检查哪个userId更大,哪个更小,然后按该顺序制作一个列表。

添加好友时:

const user1 = sentBy > sentTo ? sentBy : sentTo
const user2 = sentBy > sentTo ? sentTo : sentBy

const friends = { users: [user1, user2] }

await friendsCollection.add(friends)

这基本上确保了无论谁是友谊的一部分,都将始终以相同的顺序列出,因此在查询时,您可以:

await friendsCollection.where("users", "==", [user1, user2]).get()

这显然只有效,因为我相信列表总是有 2 个项目,并且相信 JS 真实性会确定性地工作,但它是解决这个特定问题的一个很好的解决方案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM