优化Firebase数据库设计

时间:2017-08-29 11:51:01

标签: firebase firebase-realtime-database geofire

我在设计应用数据库时遇到问题。在应用中,用户可以创建作业,然后使用GeoFire我找到附近的人。

这是我迄今为止的工作设计:

enter image description here

正如您所看到的那样,有用户,然后是工作人员。在serviceUsers下将新作业推送到用户唯一ID(UID)后,我使用geoFire查找附近的workerUsers。然后我将作业推送到workerUsers的UID中。

现在我的问题是:

我基本上是在创建这些工作的副本。一次为创建它的人(在serviceUsers下)和一次为每个附近的workerUsers创建。 这效率低吗?我是否应该将某种指针而不是整个工作对象传递给附近的用户?

这里有一个更重要的问题:如果设计很好,那么当作品的创建者删除它时,我将如何继续?然后,我需要在workerUsers中找到每个作业,并使用作业UID删除作业。 Firebase是否支持对此进行查询?

非常感谢你!

1 个答案:

答案 0 :(得分:2)

  

我基本上是在创建这些工作的副本。一次为谁的人   创建它(在serviceUsers下),并为每个附近的workerUsers创建一次。   这效率低吗?我应该宁愿传递某种指针   整个工作对象对附近的用户?

每个作业都应该有一个UUID,可以充当"指针" (我宁可称它为钥匙)。然后每个用户都应该包含一个作业UUID,而不是整个副本,所以你可以参考它。我不会完全复制你的用例,但是你应该知道。

{
  users: {
   exampleUserId: {
      jobs: ['exampleUUID']
    }
  },
  jobs: {
   exampleUUID: {
     name: 'awesome job'
   }
  }
}
  

如果设计很好,我怎么会继续这样做   这份工作的创造者删除了吗?然后我需要找到每份工作   workerUsers并使用作业UID删除作业。是Firebase吗?   支持查询?

它支持它,但你应该从上面实现我的建议,以理智的方式做到这一点。在此之后,您可以创建cloud function,其作业应如下所示:&#34;当删除具有给定UUID的作业时,请遍历每个用户并删除对它的引用(如果存在)&#34; < / p>

exports.checkReferences = functions.database.ref('/jobs/{uuid}').onWrite(event => {
  // check information here

  if (!event.data.val()) {
    // job was removed! get its uuid and iterate through users and remove the uuid from them
  }
});