【问题标题】:Optimize Firebase database design优化 Firebase 数据库设计
【发布时间】:2017-08-29 11:51:01
【问题描述】:

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

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

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

现在是我的问题:

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

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

非常感谢您!

【问题讨论】:

    标签: firebase firebase-realtime-database geofire


    【解决方案1】:

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

    每个作业都应该有一个可以充当“指针”的 UUID(我宁愿称它为键)。然后每个用户都应该包含一个作业 UUID,而不是整个副本,以便您可以参考它。我不会完全复制您的用例,但您应该有所了解。

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

    如果设计是好的,我将如何继续当 作业的创建者删除它?然后我需要在 workerUsers 并使用作业 UID 删除作业。 Firebase 是否 支持查询吗?

    它确实支持它,但你应该按照我上面的建议以一种理智的方式去做。在此之后,您可以创建一个cloud function,其工作听起来应该是这样的:“当具有给定 UUID 的工作被删除时,然后遍历每个用户并删除对它的引用(如果存在)”

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

    【讨论】:

    • 非常感谢您的回答 :) 还有一个后续问题:我知道这是一种更理智的做事方式,因为我的数据库不会因重复数据而膨胀。但目前我的workerUsers 有一个.on('value') 监听jobs/workerUsers/{uid} 的变化。如果我在哪里有一个带有 jobKeys 的数组,那么我将不得不重复查询 serviceUsers 中的作业。这会是一个公平的权衡吗?
    • 恕我直言,应该这样做。这只是一个普通的 JSON 对象,我们不能依赖数据之间的任何高级关系。您始终可以分析您的数据库并寻求更多方法来优化它。 - firebase.google.com/docs/database/usage/profile
    • 非常感谢您帮助我:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-19
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-31
    相关资源
    最近更新 更多