优化 Firebase 数据库设计

Optimize Firebase database design

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

这是我目前的工作设计:

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

下面是我的问题:

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

还有一个更重要的问题:如果设计没问题,当工作的创建者删除它时,我将如何继续?然后我需要在 workerUsers 中找到每个作业并删除具有作业 UID 的作业。 Firebase 是否支持对此的查询?

非常感谢您!

I am basically creating copies of these jobs. Once for the person who created it (under serviceUsers) and once for every nearby workerUsers. Is this inefficient? Should I rather pass some kind of pointer instead of the whole job object to the nearby users?

每个作业都应该有一个 UUID,它可以充当 "pointer"(我宁愿称它为密钥)。然后每个用户应该包括一个作业 UUID,而不是一个完整的副本,这样你就可以参考它。我不会完全复制您的用例,但您应该有一个想法。

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

If the design is fine as it is, how would I go on about when the creator of the job deletes it? I would then need to find each job in workerUsers and delete the job with the jobs UID. Does Firebase support queries for this?

它确实支持它,但你应该按照我上面的建议以一种理智的方式去做。在此之后,您可以创建一个 cloud function,其工作听起来应该是这样的:"When a job with given UUID is removed, then go through every user and remove a reference to it if it exists"

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
  }
});