获取我们在 Firebase 峰会上发布的所有信息,了解 Firebase 可如何帮助您加快应用开发速度并满怀信心地运行应用。了解详情

将 Cloud Firestore 与 Firebase 实时数据库结合使用

使用集合让一切井井有条 根据您的偏好保存内容并对其进行分类。

您可以在应用中同时使用 Firebase 实时数据库和 Cloud Firestore,并利用每个数据库解决方案的优势来满足您的需求。例如,您可能希望利用实时数据库对状态的支持,如在 Cloud Firestore 中构建状态中所述。

了解有关数据库之间差异的更多信息。

将数据移动到 Cloud Firestore

如果您决定要将部分数据从实时数据库迁移到 Cloud Firestore,请考虑以下流程。因为每个数据库都有独特的需求和结构考虑,所以没有自动迁移路径。相反,您可以遵循以下一般进展:

  1. 将数据结构和安全规则从实时数据库映射到 Cloud Firestore。实时数据库和 Cloud Firestore 都依赖 Firebase 身份验证,因此您无需更改应用的用户身份验证。但是,安全规则和数据模型不同,在开始将数据移动到 Cloud Firestore 之前仔细考虑这些差异非常重要。

  2. 移动历史数据。在 Cloud Firestore 中设置新数据结构时,您可以将现有数据从实时数据库映射并移动到新的 Cloud Firestore 实例。但是,如果您在应用程序中同时使用这两个数据库,则无需将历史数据移出实时数据库。

  3. 将新数据实时镜像到 Firestore。在新的 Cloud Firestore 数据库添加到实时数据库时,使用 Cloud Functions 将新数据写入其中。

  4. 将 Cloud Firestore 设为迁移数据的主数据库。迁移部分数据后,将 Cloud Firestore 用作主数据库并减少实时数据库对迁移数据的使用。考虑仍然与实时数据库相关联的应用程序版本以获取该数据,以及您计划如何继续支持它们。

确保您考虑了实时数据库Cloud Firestore计费费用

映射您的数据

实时数据库中的数据结构为一棵树,而 Cloud Firestore 通过文档、集合和子集合支持更明确的数据层次结构。如果您将部分数据从实时数据库移动到 Cloud Firestore,您可能需要考虑为您的数据采用不同的架构。

需要考虑的主要差异

如果您将数据从现有实时数据库树移至 Cloud Firestore 文档和集合,请注意数据库之间的以下主要差异可能会影响您在 Cloud Firestore 中构建数据的方式:

  • 浅查询在分层数据结构中提供了更大的灵活性。
  • 复杂查询提供更多粒度并减少对重复数据的需求。
  • 查询游标提供更健壮的分页。
  • 事务不再需要所有数据的共同根,而且效率更高。
  • 实时数据库和 Cloud Firestore 的结算费用不同。在许多情况下,Cloud Firestore 可能比实时数据库更昂贵,尤其是在您依赖许多小型操作的情况下。考虑减少对数据库的操作数量并避免不必要的写入。详细了解实时数据库和 Cloud Firestore 之间的计费差异。

最佳实践

以下示例反映了您在数据库之间转移数据时可能需要考虑的一些注意事项。您可以利用浅读取和改进的查询功能来获得比您在实时数据库中使用的更自然的数据结构。

考虑一个城市指南应用程序,它可以帮助用户在世界各地的城市中找到著名的地标。由于实时数据库缺乏浅读,您可能不得不在两个顶级节点中构造数据,如下所示:

// /cities/$CITY_KEY
{
  name: "New York",
  population: 8000000,
  capital: False
}

// /city-landmark/$CITY_KEY/$LANDMARK_KEY
{
  name: "Empire State Building",
  category: "Architecture"
}

Cloud Firestore 具有浅读取,因此查询集合中的文档不会从子集合中提取数据。因此,您可以将地标信息存储在子集合中:

// /cities/$CITY_ID
{
  name: "New York",
  population: 8000000,
  capital: False,
  landmarks: [... subcollection ...]
}

文档的最大大小为 1MB,这是将地标存储为子集合的另一个原因,可以使每个城市文档保持较小,而不是使用嵌套列表来膨胀文档。

Cloud Firestore 的高级查询功能减少了为常见访问模式复制数据的需要。例如,考虑城市指南应用程序中的一个屏幕,显示按人口排序的所有首府城市。在实时数据库中,最有效的方法是维护一个单独的首都城市列表,该列表复制cities列表中的数据,如下所示:

{
   cities: {
    // ...
   },

   capital-cities: {
     // ...
   }
}

在 Cloud Firestore 中,您可以将按人口顺序排列的首府城市列表表示为单个查询:

db.collection('cities')
    .where('capital', '==', true)
    .orderBy('population')

阅读有关Cloud Firestore 数据模型的更多信息,并查看我们的解决方案,了解有关如何构建 Cloud Firestore 数据库的更多想法。

保护您的数据

无论您是为 Android、Apple 或网络客户端使用Cloud Firestore 安全规则,还是为服务器使用身份访问管理 (IAM) ,请确保您在 Cloud Firestore 和实时数据库中保护您的数据。用户身份验证由两个数据库的身份验证处理,因此您在开始使用 Cloud Firestore 时无需更改身份验证的实现。

需要考虑的主要差异

  • 移动和网络 SDK 使用 Cloud Firestore 安全规则,而服务器 SDK 使用身份访问管理 (IAM) 来保护数据。
  • Cloud Firestore 安全规则不会级联,除非您使用通配符。文档和集合不会继承规则。
  • 您不再需要单独验证数据(就像在实时数据库中所做的那样)。
  • Cloud Firestore 在执行查询之前会检查规则,以确保用户对查询返回的所有数据具有适当的访问权限。

将历史数据移至 Cloud Firestore

将数据和安全结构映射到 Cloud Firestore 的数据和安全模型后,您就可以开始添加数据了。如果您计划在将应用从实时数据库移至 Cloud Firestore 后查询历史数据,请将旧数据的导出添加到新的 Cloud Firestore 数据库。如果您计划在应用中同时使用实时数据库和 Cloud Firestore,则可以跳过此步骤。

为避免用旧数据覆盖新数据,您可能需要先添加历史数据。如果您同时向两个数据库添加新数据(如下一步所述),请确保优先考虑由 Cloud Functions 添加到 Cloud Firestore 的新数据。

要将历史数据迁移到 Cloud Firestore,请按以下步骤操作:

  1. 从实时数据库导出数据或使用最近的备份
    1. 转到 Firebase 控制台中的实时数据库部分
    2. 从“数据”选项卡中,选择数据库的根级节点,然后从菜单中选择“导出 JSON ”。
  2. 在 Cloud Firestore 中创建新数据库并添加数据

    将部分数据移至 Cloud Firestore 时,请考虑以下策略:

    • 编写一个自定义脚本,为您移植数据。虽然我们无法为此脚本提供模板,但因为每个数据库都有独特的需求,我们的Slack 频道Stack Overflow上的 Cloud Firestore 专家可以查看您的脚本或针对您的具体情况提供建议。
    • 使用服务器 SDK(Node.js、Java、Python 或 Go)将数据直接写入 Cloud Firestore。有关设置服务器 SDK 的说明,请参阅入门
    • 要加快大型数据迁移,请使用批量写入并在单个网络请求中发送多达 500 个操作。
    • 要保持在Cloud Firestore 速率限制之下,请将每个集合的操作限制为 500 次/秒。

向 Cloud Firestore 添加新数据

要保持数据库之间的一致性,请实时向两个数据库添加新数据。每当客户端写入实时数据库时,使用 Cloud Functions 触发对 Cloud Firestore 的写入。确保 Cloud Firestore 优先于来自 Cloud Functions 的新数据,而不是您从历史数据迁移中进行的任何写入。

每次客户端将数据写入实时数据库时,创建一个函数以将新数据或更改数据写入 Cloud Firestore。详细了解 Cloud Functions 的实时数据库触发器

将 Cloud Firestore 设为迁移数据的主数据库

如果您决定使用 Cloud Firestore 作为您的某些数据的主数据库,请确保考虑到您设置的所有数据镜像功能并验证您的 Cloud Firestore 安全规则。

  1. 如果您使用 Cloud Functions 来维护数据库之间的奇偶校验,请确保您没有在循环中跨两个数据库重复写入操作。将您的函数切换为写入单个数据库,或完全删除该函数并开始逐步淘汰仍与实时数据库相关联的应用程序中迁移数据的写入功能。你如何为你的应用处理这个取决于你的特定需求和你的用户。

  2. 验证您的数据是否得到适当保护。验证您的 Cloud Firestore 安全规则或 IAM 设置。