

适用于 Xamarin 的 AWS 移动 SDK 现已包含在。 适用于 .NET 的 AWS SDK本指南参考了适用于 Xamarin 的 Mobile SDK 的存档版本。

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# Amazon DynamoDB
<a name="dynamodb"></a>

## 什么是 Amazon DynamoDB？
<a name="what-is-amazon-dynamodb"></a>

 [Amazon DynamoDB](https://aws.amazon.com/dynamodb/) 是一个快速、高度可扩展的非关系型数据库服务。DynamoDB 消除了传统上对数据存储可扩展性的限制，同时保留了低延迟性和可预测的性能。

## 重要概念
<a name="key-concepts"></a>

DynamoDB 数据模型概念包括表、项目和属性。

### 表
<a name="tables"></a>

在 Amazon DynamoDB 中，数据库是表的集合。表是项目的集合，而每个项目是属性的集合。

在关系数据库中，表具有预定义的架构，例如表名、主键、其列名称列表及其数据类型。存储在表中的所有记录必须具有相同的列集。相反，DynamoDB 只需要表具有一个主键，而不需要您预先定义所有属性名称和数据类型。

要了解使用表的更多信息，请参阅[使用 DynamoDB 表](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/WorkingWithTables.html)。

### 项目和属性
<a name="items-and-attributes"></a>

DynamoDB 表中的各个项目可以有任意数量的属性，但项目大小的上限为 400 KB。项目大小是其属性名称和值的长度总和（二进制和 UTF-8 长度）。

项目中的每个属性都是名称值对。属性可以是单值或多值。例如，书籍项目可以具有标题和作者属性。每本书都有一个书名，但可以有多个作者。多值属性是一个集合；不允许使用重复的值。

例如，假设要在 DynamoDB 中存储产品目录。您可以创建一个以 Id 属性作为其主键的表。 ProductCatalog主键唯一地标识每一项，因此，表中不会有两个产品具有相同 ID。

要了解使用项目的更多信息，请参阅[使用 DynamoDB 项目](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/WorkingWithItems.html)。

### 数据类型
<a name="data-types"></a>

Amazon DynamoDB 支持以下数据类型：
+  **标量类型** – 数字、字符串、二进制、布尔和 Null。
+  **多值类型** – 字符串集、数字集和二进制集。
+  **文档类型** – 列表和映射。

有关标量数据类型、多值数据类型和文档数据类型的更多信息，请参阅 [DynamoDB 数据类型](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DataModel.html#DataModel.DataTypes)。

### 主键
<a name="primary-key"></a>

创建表时，除表名称外，您还必须指定表的主键。主键唯一标识表中的每个项目，因此，任意两个项目的主键都不相同。DynamoDB 支持以下两类主键：
+  **哈希主键** – 这类主键由一个属性（哈希属性）构成。DynamoDB 基于此主键属性构建无序的哈希索引。表中的每个项目由其哈希键值进行唯一标识。
+  **哈希和范围主键** – 这类主键由两个属性构成。第一个属性是哈希属性，第二个属性是范围属性。DynamoDB 基于哈希主键属性构建无序的哈希索引，基于范围主键属性构建有序的范围索引。表中的每一项由其哈希和范围键值的组合进行唯一标识。两个项目可能具有相同的哈希键值，但是这两个项目必须具有不同的范围键值。

### 二级索引
<a name="secondary-indexes"></a>

当您创建具有哈希和范围键的表时，可以选择在该表上定义一个或多个二级索引。利用二级索引，除了可对主键进行查询外，还可使用替代键查询表中的数据。

DynamoDB 支持两种类型的二级索引：本地二级索引和全局二级索引。
+  **本地二级索引**：具有与表相同的哈希键、不同范围键的索引。
+  **全局二级索引**：具有与表不同的哈希键和范围键的索引。

您最多可以为每个表定义 5 个全局二级索引和 5 个本地二级索引。有关更多信息，请参阅《DynamoDB 开发人员指南》中的[在 DynamoDB 中使用二级索引改善数据访问](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/SecondaryIndexes.html)。

### 查询和扫描
<a name="query-and-scan"></a>

除了使用主键访问项目外，Amazon DynamoDB 还提供了 APIs 两个用于搜索数据的功能：查询和扫描。建议您阅读《DynamoDB 开发人员指南》中的[查询和扫描指南](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/QueryAndScanGuidelines.html)，以熟悉一些最佳实践。

#### 查询
<a name="query"></a>

查询操作仅使用主键属性值查找表或二级索引中的项目。您必须提供哈希键属性名称和要搜索的确切值。您可以选择提供范围键属性名称和值，并使用比较运算符来优化搜索结果。

有关示例查询，请参阅：
+  [使用文档模型](dynamodb-integration-docmodel.md) 
+  [使用对象持久化模型](dynamodb-integration-objectpersistencemodel.md) 
+  [使用 DynamoDB 服务级别 APIs](dynamodb-integration-lowlevelapi.md) 

有关查询的更多信息，请参阅《DynamoDB 开发人员指南》中的[查询](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/QueryAndScan.html#QueryAndScan.Query)。

#### Scan
<a name="scan"></a>

扫描操作读取表或二级索引中的每个项目。默认情况下，扫描操作返回表或索引中每个项目的全部数据属性。您可以使用 ProjectionExpression 参数，以便 Scan 仅返回部分属性，而不是全部属性。

有关示例扫描，请参阅：
+  [使用文档模型](dynamodb-integration-docmodel.md) 
+  [使用对象持久化模型](dynamodb-integration-objectpersistencemodel.md) 
+  [使用 DynamoDB 服务级别 APIs](dynamodb-integration-lowlevelapi.md) 

有关扫描的更多信息，请参阅《DynamoDB 开发人员指南》中的[扫描](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/QueryAndScan.html#QueryAndScan.Scan)。

## 项目设置
<a name="project-setup"></a>

### 先决条件
<a name="prerequisites"></a>

要在您的应用程序中使用 DynamoDB，需要将开发工具包添加到您的项目中。为此，请按照[设置适用于 .NET 和 Xamarin 的 AWS Mobile SDK](setup.md) 中的说明操作。

### 创建 DynamoDB 表
<a name="create-a-dynamodb-table"></a>

要创建表，请转至 [DynamoDB 控制台](https://console.aws.amazon.com/dynamodb/home)并执行以下步骤：

1. 单击**创建表**。

1. 输入表的名称。

1. 选择 **Hash** 作为主键类型。

1. 选择一个类型并输入哈希属性名称的值。单击**继续**。

1. 在**添加索引**页面上，如果您计划使用全局二级索引，请将**索引类型**设置为“全局二级索引”，然后在**索引哈希键**下，输入二级索引的值。这将使您能够同时使用主索引和二级索引进行查询和扫描。单击**将索引添加到表**，然后单击**继续**。要跳过使用全局二级索引，请单击 **Continue**。

1. 将读取和写入容量设置为所需水平。有关配置容量的更多信息，请参阅 [Amazon DynamoDB 中预配置的吞吐量](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ProvisionedThroughputIntro.html)。单击**继续**。

1. 在下一个屏幕中，输入通知电子邮件以创建吞吐量警报（如果需要）。单击**继续**。

1. 在摘要页面上，单击**创建**。DynamoDB 将创建您的数据库。

### 设置 DynamoDB 的权限
<a name="set-permissions-for-dynamodb"></a>

要在应用程序中使用 DynamoDB，必须设置正确的权限。以下 IAM 策略允许用户删除、获取、放置、查询、扫描和更新特定的用 [ARN](https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html) 标识的 DynamoDB 表中的项目：

```
{
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "dynamodb:DeleteItem",
        "dynamodb:GetItem",
        "dynamodb:PutItem",
        "dynamodb:Query",
        "dynamodb:Scan",
        "dynamodb:UpdateItem"
      ],
      "Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/MyTable"
    }
  ]
}
```

您可以在 [IAM 控制台](https://console.aws.amazon.com/iam/)中修改策略。应根据您的应用程序的需要添加或删除允许的操作。

要了解有关 IAM 策略的更多信息，请参阅[使用 IAM](https://docs.aws.amazon.com/IAM/latest/UserGuide/IAM_Introduction.html)。

要了解更多有关 DynamoDB 特定策略的信息，请参阅《DynamoDB 开发人员指南》中的[使用 IAM 控制对 DynamoDB 资源的访问](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/UsingIAMWithDDB.html)。

## 将 DynamoDB 与您的应用程序集成
<a name="integrating-dynamodb-with-your-application"></a>

适用于 .NET 和 Xamarin 的 AWS Mobile SDK 可为您使用 DynamoDB 提供高级库。您也可以直接针对低级 DynamoDB API 发出请求，但在大多数情况下，建议您使用高级库。 AmazonDynamoDBClient 是高级库中特别有用的部分。使用此类，您可以执行创建、读取、更新和删除 (CRUD) 操作和执行查询。

适用于.NET 和 Xamarin 的 AWS 移动软件开发工具包允许您 APIs 使用适用于.NET 的 AWS 开发工具包拨打电话，以便与 DynamoDB 配合使用。所有这些 APIs 都可以在 AWSSDK .dll 中找到。有关下载适用于 .NET 的 AWS SDK 的信息，请参阅[适用于 .NET 的 AWS SDK](https://aws.amazon.com/sdk-for-net/)。

您可以通过三种方式在您的 Xamarin 应用程序中与 DynamoDB 交互：
+  **文档模型**：该 API 提供有关低级 DyanmoDB API 的封装类，以进一步简化编程任务。表和文档是主要的封装类。您可以使用文档模式执行数据操作，例如创建、检索、更新和删除项目。该 API 已在 Amazon.dynamoDB 中提供。 DocumentModel 命名空间。
+  **对象持久化模型**：对象持久化 API 允许您将客户端类映射到 DynamoDB 表。然后，每个对象实例映射到对应表中的项目。此 API 中的 Dynamo DBContext 类为您提供了将客户端对象保存到表中、将项目作为对象检索以及执行查询和扫描的方法。您可以使用对象持久化模型执行数据操作，例如创建、检索、更新和删除项目。您必须先使用服务客户端 API 创建表，然后才能使用对象持久化模型将类映射到表。该 API 已在 Amazon.dynamoDB 中提供。 DataModel 命名空间。
+  **服务客户端 API**：这是与 DynamoDB API 密切相关的协议级 API。您可以针对所有表和项目操作（例如创建、更新、删除表和项目）使用该低级 API。您还可以查询和扫描自己的表。该 API 在 Amazon.DynamoDB 命名空间中提供。

以下主题更深入地探讨了这三个模型：

**Topics**