优化 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
}
});
我在设计我的应用程序的数据库时遇到问题。在应用程序中,用户可以创建工作,然后使用 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
}
});