Firestore数据重复

时间:2018-01-11 19:13:38

标签: firebase google-cloud-firestore

我试图在Firestore中设置朋友系统。我的数据模型目前看起来像这样:

collection("users") -> 
  document("user1")
  document("user2")
  ...

users集合中的文档包含用户的nameemail ...等数据。我想让用户现在有朋友,但我不确定对此进行建模的最佳方式。
因此,我确定在用户的文档中添加了friends字段,但该字段应包含哪些内容?我的第一个想法是指向一个名为friends的新集合的指针,其中文档是用户。像这样:

collection("users") { 
  document("user1") {
    name:user1,
    friends: -> collection("friends") {
      document("user2"),
      ...
    }
  }
}

这似乎是合理的,但这意味着我的数据库中有大量重复数据,因为每个有朋友的用户都会在friends集合中重复。我应该担心这个还是在Firestore数据库结构中这是正常的? 是否可以指向users集合中friends集合中的文档?类似的东西:

collection("users") { 
  document("user1") {
    name:user1,
    friends: -> collection("friends") {
      document, -----
      ...            |
    }                |
  },                 |
  document("user2")<-
}

或者我应该抛弃为朋友使用收藏品的想法,并且只保留一份包含用户所有朋友的用户名单的列表?

1 个答案:

答案 0 :(得分:0)

似乎您正在为usersfriends使用两个单独的集合,首先您可以通过一个集合执行此操作。但我不想去那里可能还有另一种情况。 作为单独的收集方式,您可以设计friends收集模型以避免重复:

{ name : 'Name', email : 'email@mail.com' has_connected : { 'user1' : true // here you can use anyother unique key from user } } 问题是 firestore 推荐这种类型的设计用于查询,为了提高性能,您可以将has_connected密钥作为索引。

在这种方法中,您必须在通过电子邮件或任何其他唯一密钥添加新朋友时进行检查。如果存在,则只需将另一个密钥放入has_connected与相应的用户。例如user2 : true

最后,为了获取用户的所有朋友,您必须执行以下查询:例如:在javascript中

let ref = firebase.firestore().collection("friends"); ref .where(`has_connected.${username}`, "==", true) .get() .then(//do your logic) .catch()

由于