我想知道我是否正确地对Firestore数据模型进行建模,因为我意识到当前的方式会导致对服务器的大量请求。
上下文:
我有一个exercises
收藏。
{
exercises: {
abc123: {
name: "Squat",
vidUrl: 'https://example.com'
},
bcd234: {
name: "Push Up",
vidUrl: 'https://example.com'
}
}
}
我有一个workouts
收藏。当我加载特定的锻炼内容时,我将遍历并加载各个步骤的练习并将其映射到原始响应。
{
workouts: {
uniqueId: {
name: 'Strength',
circuits: [{
steps: [
{
duration: 45,
exerciseId: 'abc123'
},
{
duration: 30,
exerciseId: 'bcd234'
}
]
}]
}
}
}
这是最好的方法吗?还是应该首先将练习数据映射到步骤?
此外,这种数据建模是否会因为circuits.steps
是嵌套数组而导致更新困难?
答案 0 :(得分:1)
我意识到当前的方式将导致对服务器的大量请求。
Firestore中的查询很浅,这意味着它们仅从查询所针对的集合中获取项目。在单个查询中无法从两个顶级集合中获取文档。因此,在您的情况下,您需要查询数据库两次,一次是从exerciseId
数组中获取每个steps
,第二次是基于该ID,您需要进行每次特定的练习。
根据有关usage and limits的官方文档,Firestore中的所有内容都是关于读写次数的。
根据您的评论:
对于锻炼集合中
steps
数组中的每个exerciseId,我正在查询以获取每个锻炼。
要减少读取次数,您可以在整个steps
对象的exercise
数组下托管。这意味着您只需要查询数据库一次,因为所需的一切都已经存在。这种做法称为denormalization
,是Firebase的常见做法。如果您不熟悉NoQSL数据库,建议您观看此视频Denormalization is normal with the Firebase Database,以更好地理解。它用于Firebase实时数据库,但相同的规则适用于Cloud Firestore。
此外,在复制数据时,需要记住一件事。用与添加数据相同的方式,您需要对其进行维护。换句话说,如果您想更新/删除锻炼,则需要在存在的每个位置进行锻炼。