Datastore 模式 Firestore (Datastore) 是一个 NoSQL 文档数据库,能够自动扩缩、具备出色的性能,并且易于进行应用开发。Datastore 特性包括:
- 原子化事务。Datastore 在执行一组操作时,可以确保这些操作要么全部成功、要么全部不发生。
- 读取和写入的高可用性。Datastore 在 Google 数据中心中运行,这些数据中心使用冗余来最大限度地降低故障点产生的影响。
- 高性能的大规模可扩缩性。Datastore 使用分布式架构来自动管理扩缩。Datastore 混合使用各种索引和查询约束条件,因此查询可以根据结果集的大小(而非数据集的大小)进行扩缩。
- 灵活的数据存储和查询。Datastore 可自然地映射到面向对象的语言和脚本语言,并可通过多个客户端向应用提供服务。它还提供了一种类似于 SQL 的查询语言。
- 强一致性。Datastore 可确保所有查询都保持强一致性。
- 静态加密。Datastore 会在所有数据写入磁盘之前自动对其加密,并在已获授权的用户读取数据时自动将其解密。如需了解详情,请参阅服务器端加密。
- 完全托管,无计划内停机时间。Google 负责管理服务,因此您可以专注于自己的应用。在服务进行计划内升级时,您的应用仍然可以使用 Datastore。
与关系型数据库比较
虽然 Datastore 接口具有许多与关系型数据库类似的功能,但作为 NoSQL 数据库,它在描述数据对象之间关系的方式上有所不同。以下是 Datastore 与关系型数据库的简要对比:
概念 | Datastore | Firestore | 关系型数据库 |
---|---|---|---|
对象类别 | 种类 | 集合组 | 表 |
一个对象 | 实体 | 文档 | 行 |
一个对象的单个数据 | 属性 | 字段 | 列 |
对象的唯一 ID | 键 | 文档 ID | 主键 |
与关系型数据库表中的行不同,同一种类的 Datastore 实体可以具有不同的属性,并且不同实体可以具有名称相同但值类型不同的属性。这些独特的特征意味着您需要以不同的方式设计和管理数据,以充分利用自动扩缩功能。具体来说,Datastore 与传统关系型数据库的不同之处体现在以下几个重要方面:
- Datastore 的设计能够自动扩容来承载超大数据集,因而应用在收到更多流量时也能保持高性能:
- Datastore 会根据需要自动进行数据分布,实现写入规模的扩缩。
- Datastore 只支持性能随结果集而非数据集的大小而扩缩的查询,因此也能实现读取能力的扩缩。这意味着,如果一个查询的结果集包含 100 个实体,无论它搜索的是一百个实体还是一百万个实体,其性能始终相同。这一属性是某些类型的查询不受支持的关键原因。
- 由于所有查询都由预先构建的索引提供结果,因此可以执行的查询种类比支持 SQL 的关系型数据库所允许的查询种类更有限。具体来说,Datastore 不支持联接操作、对多个属性的不等性过滤,也不支持基于子查询的结果对数据进行过滤。
- 与强制执行某种架构的关系型数据库不同,Datastore 是无架构的。它不要求相同种类的实体拥有一致的属性集(但您可以选择在自己的应用代码中强制执行这样的要求)。
适合的场景
Datastore 极为适合那些依赖大规模高可用性结构化数据的应用。您可以使用 Datastore 来存储和查询以下所有类型的数据:
- 供零售商了解实时库存和商品详情的商品目录。
- 根据用户过去的活动和偏好提供定制体验的用户个人资料。
- 基于 ACID 属性的事务。例如,将资金从一个银行账户转移到另一个银行账户。
其他存储和数据库选项
Datastore 并不适合所有使用场景。例如,Datastore 不是关系型数据库,也不是分析数据的有效解决方案。
在如下这些常见场景中,您可能应该考虑使用其他产品,而不是 Datastore:
- 如果您需要为联机事务处理 (OLTP) 系统提供完整支持 SQL 的关系型数据库,请考虑 Cloud SQL。
- 如果您不需要支持 ACID 事务,或者您的数据并非高度结构化的数据,请考虑使用 Bigtable。
- 如果您需要在联机分析处理 (OLAP) 系统中进行交互式查询,请考虑 BigQuery。
- 如果您需要存储大型不可变 blob 对象(例如大型图片或电影),请考虑 Cloud Storage。
如需详细了解其他数据库选项,请参阅数据库服务概览。