选择原生模式或 Datastore 模式

创建 Firestore 数据库时,您必须在两种模式之间做出选择:原生模式或 Datastore 模式。本页介绍了这两种模式之间的区别。

选择数据库模式

创建新的 Firestore 数据库时,必须选择数据库模式。 您可以在同一项目中同时拥有原生模式和 Datastore 模式数据库,但每个数据库只能采用一种模式。

选择数据库模式时,建议采用以下方法:

  • 为所有新应用(服务器、移动应用和 Web 应用)使用原生模式 Firestore。

    原生模式下的 Firestore 使用符合行业标准的基于文档的数据模型。除了高度一致且可伸缩的数据库之外,原生模式下的 Firestore 还提供实时数据同步和后端即服务功能。

  • 如果您的应用依赖于 Datastore API,请使用 Datastore 模式的 Firestore。

    Datastore 模式完全受支持,建议依赖于 Datastore API 的应用使用此模式。原生模式和 Datastore 模式共享一个底层存储层,该层具有相同的可用性、一致性和伸缩能力。

原生模式 Firestore

Firestore 是 Datastore 的下一代主要版本,也是对该产品的一次品牌重塑。Firestore 是一个 NoSQL 文档数据库,其设计支持自动扩缩、具备出色的性能,并且易于进行应用开发;它结合了 Datastore 和 Firebase 实时数据库两者各自的优点。

Firestore 引入了以下功能:

  • 具有强一致性的存储层
  • 集合和文档数据模型
  • 实时更新
  • 移动和 Web 客户端库

虽然 Firestore 向后兼容 Datastore,但新数据模型、实时更新以及移动和 Web 客户端库功能无法向后兼容。如需访问所有 Firestore 功能,您必须使用原生模式 Firestore。

Datastore 模式 Firestore

Datastore 模式 Firestore 遵循 Datastore 系统行为,但使用 Firestore 的存储层,因而摆脱了以下 Datastore 限制:

  • 除非您明确请求最终一致性,否则所有 Datastore 查询现在都具有高度一致性。
  • 事务中的查询不再是祖先查询的必要条件。
  • 事务不再限于 25 个实体组。
  • 对实体组的写入不再限于每秒 1 次。

Datastore 模式会停用与 Datastore 不兼容的 Firestore 功能:

  • 该项目将接受 Datastore API 请求,并拒绝 Firestore API 请求。
  • 该项目将使用 Datastore 索引,而不是 Firestore 索引。
  • 您可以将 Datastore 客户端库用于该项目,但不能将 Firestore 客户端库用于该项目。
  • Firestore 实时功能将无法使用。
  • 在 Google Cloud 控制台中,数据库将使用 Datastore 查看器。

价格和位置

原生模式数据库和 Datastore 模式数据库都遵循相同的价格结构,并且位于相同位置。如需详细了解价格和位置,请参阅以下页面:

原生模式 Firestore

Datastore 模式 Firestore

特性比较

下表比较了两种数据库模式的系统行为:

原生模式
Firestore
Datastore 模式
Firestore
数据模型 以文档和集合的形式整理文档数据库。 以种类和实体组的形式整理实体。
存储层 具有强一致性的存储层。 具有强一致性的存储层。
查询和事务
  • 整个数据库保持高度一致的查询
  • 摆脱了 Datastore 以前的一致性限制
  • 整个数据库保持高度一致的查询
  • 事务可以访问任意数量的实体组
Datastore v1 API 支持 否,请求会被拒绝
Firestore v1 API 支持 否,请求会被拒绝
实时更新

支持侦听一个文档或一组文档以进行实时更新。

在侦听一个文档或一组文档时,您的客户端会收到有关任何数据更改的通知,并会收到最新的数据集。

不支持
离线数据持久化 移动和网页客户端库支持离线数据持久化。 不支持
客户端库 Firestore 客户端库:
  • Java
  • Python
  • PHP
  • Go
  • Ruby
  • C#
  • Node.js
  • Android
  • iOS+
  • Web
  • C++
  • Unity
Datastore 客户端库:
  • Java
  • Python
  • PHP
  • Go
  • Ruby
  • C#
  • Node.js
  • C++
安全性
  • Identity and Access Management (IAM) 管理数据库访问权限
  • Firestore 安全规则支持移动和 Web 客户端库的无服务器身份验证及授权
IAM 管理数据库访问权限
性能 自动扩容为数百万个并发客户端。 自动扩容为每秒数百万次写入。
服务等级协议 (SLA) Firestore SLA Firestore SLA
位置

这两种模式支持相同的位置。如需查看详细的位置列表,请参阅以下页面:

价格

这两种模式为实体和文档操作使用相同的价格结构。

Datastore 模式 Firestore 不会对小规模操作收费。

这两种模式对存储的数据和网络带宽使用相同的价格结构。

如需详细了解价格,请参阅以下页面:

控制台 Firebase 控制台和 Google Cloud 控制台 Firestore 查看器 Google Cloud 控制台 Datastore 查看器
命名空间 不支持 支持命名空间
App Engine 客户端库集成

在 App Engine 标准环境 Python 2.7 和 PHP 5.5 运行时中不受支持

App Engine 标准环境的所有其他运行时中都受支持

App Engine 柔性环境的所有运行时中都受支持

在所有运行时中都受支持

创建一个新数据库

您可以创建原生模式或 Datastore 模式的新 Firestore 数据库。此选择不取决于项目中的任何现有数据库的模式。

如需了解详情,请参阅创建和管理数据库

在原生模式和 Datastore 模式之间切换

如果数据库为空,您可以在原生模式和 Datastore 模式之间进行更改。

将数据库更改为原生模式

gcloud

使用 gcloud firestore databases update 命令将数据库更改为原生模式。

gcloud firestore databases update --type=firestore-native --database='DATABASE_ID'

DATABASE_ID 替换为您的数据库 ID。

rest

curl --request PATCH \
--header "Authorization: Bearer "$(gcloud auth print-access-token) \
--header 'Accept: application/json' \
--header 'Content-Type: application/json' \
--data '{"type":"FIRESTORE_NATIVE"}' \
"https://firestore.googleapis.com/v1/projects/PROJECT_ID/databases/DATABASE_ID?updateMask=type"

替换以下内容:

  • PROJECT_ID:项目 ID
  • DATABASE_ID:数据库 ID

将数据库更改为 Datastore 模式

gcloud

使用 gcloud firestore databases update 命令将数据库更改为 Datastore 模式。

 gcloud firestore databases update --type=datastore-mode --database='DATABASE_ID'

DATABASE_ID 替换为您的数据库 ID。

rest

curl --request PATCH \
--header "Authorization: Bearer "$(gcloud auth print-access-token) \
--header 'Accept: application/json' \
--header 'Content-Type: application/json' \
--data '{"type":"DATASTORE_MODE"}' \
"https://firestore.googleapis.com/v1/projects/PROJECT_ID/databases/DATABASE_ID?updateMask=type"

替换以下内容:

  • PROJECT_ID:项目 ID
  • DATABASE_ID:数据库 ID