IBM Cloud Docs
使用 IBM Cloudant

使用 IBM Cloudant

如果从不使用 IBM Cloudant 或 NoSQL 数据库,请先扫描此简介和一些最佳实践,然后再进一步阅读。 它描述了您需要了解的有关 IBM Cloudant 以及如何最佳使用它的最重要内容。 本文档的其余部分假定您已了解这些基础知识。

您可以在以下部分中找到有关 IBM Cloudant 的更多信息:

连接到 IBM Cloudant

要访问 IBM Cloudant,您必须具有 IBM Cloud® 帐户

HTTP API

所有对 IBM Cloudant 的请求都会通过 Web 执行。 此语句表示可以与 Web 通信的任何系统都可以与 IBM Cloudant通信。 IBM Cloudant 的所有特定于语言的库都只是包装器,它们提供了一些便利性和语言细节,可帮助您使用简单的 API。 许多用户选择通过原始 HTTP 库来使用 IBM Cloudant。

有关 IBM Cloudant 如何使用 HTTP 的更多信息,请参阅 API 参考中的 HTTP

IBM Cloudant 支持以下 HTTP 请求方法:

GET
请求指定的项。 与标准 HTTP 请求一样,URL 的格式定义了返回的内容。 通过 IBM Cloudant,此定义可以包含静态项,数据库文档以及配置和统计信息。 在大多数情况下,将以 JSON 文档形式返回信息。
HEAD
HEAD 方法在没有响应主体的情况下检索 GET 请求的 HTTP 头。
POST
上传数据。 在 IBM Cloudant的 API 中, POST 方法会设置值,上载文档,设置文档值,并启动一些管理命令。
PUT
用于 "存储" 特定资源。 在 IBM Cloudant的 API 中, PUT 会创建新对象,包括数据库,文档,视图和设计文档。
DELETE
删除指定的资源,包括文档、视图和设计文档。
COPY
复制文档和对象的特殊方法。

如果客户机 (例如,某些 Web 浏览器) 不支持使用 HTTP 方法,那么可以在将 X-HTTP-Method-Override 请求头设置为实际 HTTP 方法的情况下使用 POST

“不允许的方法”错误

如果将不受支持的 HTTP 请求类型与不支持指定类型的 URL 配合使用,那么将返回 405 错误。 列示受支持的 HTTP 方法的错误,如以下示例中所示。

用于响应不支持的请求的错误消息示例

{
    "error":"method_not_allowed",
    "reason":"Only GET,HEAD allowed"
}

JSON

IBM Cloudant 存储使用 JSON (JavaScript 对象表示法) 编码的文档,因此编码为 JSON 的任何内容都可以存储为文档。 包含媒体 (例如图像,视频和音频) 的文件称为 BLOB (二进制大对象)。 BLOB 可以存储为与文档关联的附件。

有关 JSON 的更多信息,请参阅 JSON 指南

分布式系统

通过使用 IBM Cloudant的 API ,您可以与众多机器 (称为集群) 的协作进行交互。 集群中的机器必须位于同一数据中心内,但可以位于该数据中心内的不同 "pod" 中。 使用不同的 pod 有助于增强 IBM Cloudant 的高可用性特征。

集群的一个优点是,当您需要更多计算能力时,可以添加更多机器。 与扩展或增强现有单台机器相比,此方法通常更具成本效益和容错性。

有关 IBM Cloudant 和分布式系统概念的更多信息,请参阅 CAP 定理指南。

复制

复制 是后跟 IBM Cloudant的过程。 CouchDBPouchDB和其他分布式数据库。 复制可同步两个数据库的状态,使其内容完全相同。

您可以持续复制。 持续复制意味着每当源数据库发生更改时,目标数据库都会更新。 连续复制可用于数据备份,跨多个数据库聚集数据或共享数据。

但是,持续复制也意味着持续测试源数据库是否有任何更改。 此测试需要持续的内部调用,可能会影响性能或数据库的使用成本。

持续复制可导致许多内部调用。 这些调用可能影响 IBM Cloudant 系统的多租户用户的成本。 缺省情况下,持续复制已禁用。

对作业使用正确的工具

IBM Cloudant 是具有 HTTP API 的可扩展,持久,高可用性的可操作 JSON 文档库。 适合以下用途:

  • 支持您的永续 Web 应用程序。
  • 是移动应用程序的服务器端数据存储器。
  • 将时间序列数据存储在时间框数据库中,然后归档到对象存储器并删除原始数据。
  • 从辅助索引交付查询时,将应用程序对象存储为 JSON。
  • 在不同地理位置复制数据集,以实现灾难恢复,额外容量或使数据更接近用户。

IBM Cloudant 不包含以下功能:

有关更多信息,请参阅 最佳和最差实践 博客。

组织文档和数据库

IBM Cloudant 数据组织在数据库和文档的层次结构中。 文档是具有唯一标识的 JSON 对象: 其 _id。 数据库是具有主索引的文档集合,允许 _id检索文档。 它还具有可选的辅助索引,允许通过对象中的其他属性来查询文档。

当开发人员启动项目时,他们有时会迂到以下问题:

  • 我可以将多少数据放入单个对象中?
  • 我必须将不同的文档类型存储在同一集合中,还是每个文档类型存储一个数据库?

文档必须包含由应用程序建模的对象 (例如,用户,订单或产品) 的所有相关数据。 此做法可确保您在一次 API 调用中从数据库访存整个对象。 IBM Cloudant 没有类似于关系数据库的 连接 概念,因此数据未 规范化。 但是,数据可以跨对象重复。 例如, 订单 文档可以包含已购买的部分 产品 文档。

通常在同一数据库中存储多个对象类型: 约定是使用 type 属性来表示对象类型。 如果需要执行返回多种对象类型的查询,或者如果需要将数据库完全复制到其他位置,那么此选项是一个不错的选项。 否则,单独的数据库 (例如, usersordersproducts) 可能更好,以便辅助索引特定于每种对象类型。

如果要在文档中存储对象数组,请考虑数组项是否必须是它们自己的文档。 例如, 产品 和每个 产品复审 必须存储在单独的文档中,但 用户 和该用户的每个 订单 必须具有自己的文档。

如果您有一个不断增长的数据集,那么您可能不希望将数据存储在单个不断增长的数据库中。 数据最好存储在 时间框数据库 中,这些数据库允许对较旧的数据进行完全归档和删除。 删除 IBM Cloudant 文档会留下 tombstone 文档,因此不要依赖删除文档来恢复磁盘空间。 相反,您必须依赖于删除整个数据库。

JSON 不提供存储日期或时间戳记的本机方法。 如果您打算稍后进行查询,请仔细选择 日期格式

最大文档大小为 1 MB ,但文档必须远小于该大小 (通常为几 KB)。

有关更多信息,请参阅以下博客帖子:

充分利用主索引

IBM Cloudant 具有文档的 _id 属性的主索引。 此索引允许 _id (GET /db/id) 或 _ids (GET /db/_all_docs?startkey="a"&endkey="z") 范围检索文档。 通过将数据存储在主键中并确保每个 _id 都是唯一的,可以使用主索引来访存文档和文档范围,而无需二次建立索引。 请参阅以下构想列表:

  • 如果您在对象中具有可用于查询的唯一内容,请将其用作 _id 字段,例如 bob.smith@gmail.comisbn9780241265543oakland,ca
  • 如果对象包含层次结构,请在 _id中进行建模: usa:ca:oaklandbooks:fiction:9780241265543。 层次结构从最大到最小,因此您可以使用主索引来查找 * usa* 中的所有城市或 * usa:ca中的所有城市*,而无需辅助索引。
  • 如果要存储时间序列数据,那么在 _id 开始时的编码时间将按时间对主索引进行排序,例如 001j40Ox1b2c1B2ubbtm4CsuLB4L35wQ
  • 分区数据库将共享分区密钥的文档分组在一起。 分区键必须具有许多值,并且不得包含热点,以避免将应用程序的大部分流量定向到几个分区。

有关更多信息,请参阅以下博客帖子:

查询和辅助索引

IBM Cloudant 允许对返回匹配文档数组和书签的单个数据库运行查询,这允许访问下一个搜索结果块。 实现更好的查询性能取决于您的查询是否受合适的辅助索引支持。 索引允许数据库回答查询,而不必拖过数据库中的每个文档,从而产生更快的性能。

请参阅以下提示:

  • 有时很难度量查询的性能,直到您的数据集足够大以公开缓慢的操作。 生成足够的实际数据,以便您可以在进入生产之前测试索引和查询性能。
  • IBM Cloudant 可能会在没有索引的情况下向您返回数据,但您绝不能将此数据用于生产工作负载。 如果结果集包含警告,那么 No matching index found. Create an index to optimize query time, 需要重新查看索引策略。 使用 explain 功能来查看正在为每个查询选择哪个索引。
  • 通过同一数据库中的多种对象类型,许多用例可以由固定属性的一些索引提供服务。 有关更多信息,请参阅 Optimal IBM Cloudant Indexing
  • 为索引指定有意义的名称,并在查询时指定索引名,以便显而易见的是,哪个索引对应于应用程序的哪些查询。

有关更多信息,请参阅以下博客帖子: