Firestore数据建模可减少请求

时间:2018-12-24 16:46:28

标签: database firebase nosql google-cloud-firestore

我想知道我是否正确地对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是嵌套数组而导致更新困难?

1 个答案:

答案 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。

此外,在复制数据时,需要记住一件事。用与添加数据相同的方式,您需要对其进行维护。换句话说,如果您想更新/删除锻炼,则需要在存在的每个位置进行锻炼。