我在设计应用数据库时遇到问题。在应用中,用户可以创建作业,然后使用GeoFire我找到附近的人。
这是我迄今为止的工作设计:
正如您所看到的那样,有用户,然后是工作人员。在serviceUsers下将新作业推送到用户唯一ID(UID)后,我使用geoFire查找附近的workerUsers。然后我将作业推送到workerUsers的UID中。
现在我的问题是:
我基本上是在创建这些工作的副本。一次为创建它的人(在serviceUsers下)和一次为每个附近的workerUsers创建。 这效率低吗?我是否应该将某种指针而不是整个工作对象传递给附近的用户?
这里有一个更重要的问题:如果设计很好,那么当作品的创建者删除它时,我将如何继续?然后,我需要在workerUsers中找到每个作业,并使用作业UID删除作业。 Firebase是否支持对此进行查询?
非常感谢你!
答案 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
}
});