

 AWS Mobile SDK for Xamarin が に含まれるようになりました AWS SDK for .NET。このガイドでは、Mobile SDK for Xamarin のアーカイブバージョンについて説明します。

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# 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 では、テーブルに 1 つのプライマリキーが設定されていることのみが必要であり、すべての属性名とデータ型を事前に定義する必要はありません。

テーブルの操作方法の詳細については、「[DynamoDB のテーブルの操作](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/WorkingWithTables.html)」を参照してください。

### 項目と属性
<a name="items-and-attributes"></a>

DynamoDB テーブル内の個々の項目には多数の属性があります。ただし、項目サイズに対する 400KB の制限があります。項目のサイズは、属性名と値の長さの合計です（バイナリおよび UTF-8 の長さ）。

項目の各属性は、名前と値のペアです。属性には単一値または多値のセットを指定できます。たとえば書籍項目には、題名と著者の属性を指定できます。それぞれの書籍の題名は 1 つですが、多数の著者を指定できます。多値属性は 1 つのセットであり、値の重複は許可されていません。

たとえば、製品カタログを DynamoDB に保存するとします。ID 属性をプライマリキーとして ProductCatalog テーブルを作成します。プライマリキーは各項目を一意に識別するため、テーブル内の 2 つの製品が同じ 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>

テーブルを作成する場合には、テーブル名に加えて、テーブルのプライマリキーを指定する必要があります。プライマリキーはテーブル内の各項目を一意に識別するため、2 つの項目が同じキーを持つことはできません。DynamoDB では、次の 2 つのタイプのプライマリキーがサポートされています。
+  **ハッシュキー**: プライマリキーは、ハッシュ属性という 1 つの属性で構成されています。DynamoDB では、このプライマリキー属性について、順序を指定しないハッシュインデックスを構築します。テーブルの各項目は、ハッシュキー値によって一意に識別されます。
+  **ハッシュキーおよびレンジキー**: プライマリキーは、2 つの属性で構成されています。最初の属性はハッシュ属性で、2 番目の属性が範囲属性です。DynamoDB では、ハッシュプライマリキー属性に基づいて、順序を指定しないハッシュインデックスを構築し、レンジプライマリキー属性に基づいて、ソートされたレンジインデックスを構築します。テーブルの各項目は、ハッシュキーと範囲キーの値の組み合わせによって識別されます。2 つの項目でハッシュキー値を同じにすることは可能ですが、これらの 2 つの項目の範囲キー値は異なっている必要があります。

### セカンダリインデックス
<a name="secondary-indexes"></a>

ハッシュキーおよびレンジキーを使用してテーブルを作成するときに、必要に応じてそのテーブルで 1 つ以上のセカンダリインデックスを定義できます。セカンダリインデックスでは、プライマリキーに対するクエリに加えて、代替キーを使用して、テーブル内のデータのクエリを行うことができます。

DynamoDB では、2 種類のセカンダリインデックス (ローカルセカンダリインデックスおよびグローバルセカンダリインデックス) をサポートしています。
+  **ローカルセカンダリインデックス**: テーブルと同じハッシュキーと、異なるレンジキーを持つインデックス。
+  **グローバルセカンダリインデックス**: テーブルと異なるハッシュキーとレンジキーを持つインデックス。

テーブルあたり最大 5 個のグローバルセカンダリインデックスと 5 個のローカルセカンダリインデックスを定義できます。詳細については、DynamoDB 開発者ガイドの「[DynamoDB でのセカンダリインデックスを使用したデータアクセス性の向上](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/SecondaryIndexes.html)」を参照してください。

### クエリおよびスキャン
<a name="query-and-scan"></a>

Amazon DynamoDB では、プライマリキーを使用した項目へのアクセスに加えて、データの検索用に Query と Scan という 2 つの API も用意されています。いくつかのベストプラクティスを理解するために、DynamoDB 開発者ガイドの「[クエリおよびスキャンのガイドライン](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/QueryAndScanGuidelines.html)」をお読みになることをお勧めします。

#### クエリ
<a name="query"></a>

Query オペレーションでは、プライマリキーの属性値を使用してテーブルまたはセカンダリインデックスの項目を検索します。ハッシュキーの属性名と検索対象の個別の値を指定する必要があります。必要に応じて、レンジキーの属性名と値を指定し、比較演算子を使用して、検索結果をさらに絞り込むことができます。

サンプルクエリについては、以下を参照してください。
+  [ドキュメントモデルを使用する](dynamodb-integration-docmodel.md) 
+  [オブジェクト永続性モデルの使用](dynamodb-integration-objectpersistencemodel.md) 
+  [DynamoDB サービスレベル API を使用する](dynamodb-integration-lowlevelapi.md) 

Query の詳細については、DynamoDB 開発者ガイドの「[Query](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/QueryAndScan.html#QueryAndScan.Query)」を参照してください。

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

Scan オペレーションでは、テーブルまたはセカンダリインデックスのすべての項目を読み込みます。デフォルトでは、Scan オペレーションはテーブルまたはインデックスのすべての項目のデータ属性を返します。ProjectionExpression パラメータを使用し、Scan がすべての属性ではなく一部のみを返すようにできます。

サンプルの Scan については、以下を参照してください。
+  [ドキュメントモデルを使用する](dynamodb-integration-docmodel.md) 
+  [オブジェクト永続性モデルの使用](dynamodb-integration-objectpersistencemodel.md) 
+  [DynamoDB サービスレベル API を使用する](dynamodb-integration-lowlevelapi.md) 

Scan の詳細については、DynamoDB 開発者ガイドの「[Scan](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/QueryAndScan.html#QueryAndScan.Scan)」を参照してください。

## プロジェクトのセットアップ
<a name="project-setup"></a>

### 前提条件
<a name="prerequisites"></a>

アプリケーションで DynamoDB を使用するには、プロジェクトに SDK を追加する必要があります。「[AWS Mobile SDK for .NET and Xamarin をセットアップする](setup.md)」の手順に従って、追加します。

### DynamoDB テーブルの作成
<a name="create-a-dynamodb-table"></a>

テーブルを作成するには、[DynamoDB コンソール](https://console.aws.amazon.com/dynamodb/home)に移動し、次の手順に従って操作します。

1. [**テーブルの作成**] をクリックします。

1. テーブルの名前を入力します。

1. プライマリキーのタイプとして、[**ハッシュ**] を選択します。

1. タイプを選択し、ハッシュ属性名の値を入力します。[**次へ**] をクリックします。

1. [**Add Indexes (インデックスの追加)**] ページで、グローバルセカンダリインデックスを使用する予定の場合は、[**Index Type (インデックスタイプ)**] に「グローバルセカンダリインデックス」を設定し、[**Index Hash Key (インデックスハッシュキー)**] で、セカンダリインデックスの値を入力します。これにより、プライマリインデックスとセカンダリインデックスの両方を使用して、クエリとスキャンを行うことができます。[**Add Index To Table (テーブルにインデックスを追加)**] をクリックし、続いて [**続行**] をクリックします。グローバルセカンダリインデックスを使用してスキップするには、[**続行**] をクリックします。

1. 読み込みおよび書き込みキャパシティーを目的のレベルに設定します。キャパシティー設定の詳細については、「[Provisioned Throughput in Amazon DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ProvisionedThroughputIntro.html)」を参照してください。[**次へ**] をクリックします。

1. 次の画面で、通知 E メールを入力し、必要に応じてスループットアラームを作成します。[**次へ**] をクリックします。

1. [概要] ページで、[**作成**] をクリックします。DynamoDB にデータベースが作成されます。

### DynamoDB のアクセス許可を設定する
<a name="set-permissions-for-dynamodb"></a>

DynamoDB をアプリケーションで使用するには、適切なアクセス許可を設定する必要があります。次の IAM ポリシーでは、ユーザーは特定の DynamoDB テーブルの項目を削除、取得、挿入、クエリ、スキャン、更新することができます。このポリシーは、[ARN](https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html) によって識別されます。

```
{
  "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>

AWS Mobile SDK for .NET and Xamarin には、DynamoDB を操作するための高レベルのライブラリが用意されています。低レベルの DynamoDB API に対してリクエストすることもできますが、ほとんどのユースケースにおいて、ハイレベルのライブラリが推奨されています。特に、AmazonDynamoDBClient は高レベルライブラリの便利な部分です。このクラスを使用することで、さまざまな (CRUD) 操作の作成、読み取り、更新、削除、およびクエリの実行を行うことができます。

AWS Mobile SDK for .NET and Xamarin では、DynamoDB を操作するために、AWS SDK for .NET から API を使用して呼び出すことができます。API はすべて、AWSSDK.dll で利用できます。AWS SDK for .NET のダウンロードの詳細については、「[AWS SDK for .NET](https://aws.amazon.com/sdk-for-net/)」を参照してください。

Xamarin アプリケーションで DynamoDB を操作する方法は、3 種類あります。
+  **ドキュメントモデル**: この API には、お客様のプログラミングタスクを簡素化する低レベル DyanmoDB API のラッパークラスが用意されています。テーブルとドキュメントが主要なラッパークラスです。ドキュメントモデルは、項目の作成、取得、更新、削除などのデータオペレーションに使用できます。この API は、Amazon.DynamoDB.DocumentModel 名前空間で利用できます。
+  **オブジェクト永続性モデル**: オブジェクト永続性 API では、クライアント側のクラスを DynamoDB テーブルにマッピングすることができます。各オブジェクトインスタンスが、対応するテーブルの項目にマッピングされます。この API 内にある DynamoDBContext クラスによって、クライアント側オブジェクトをテーブルに保存し、項目をオブジェクトとして取得し、クエリおよびスキャンを実行するメソッドが提供されます。オブジェクト永続性モデルは、項目の作成、取得、更新、削除などのデータオペレーションに使用できます。まず、サービスクライアント API を使用してテーブルを作成する必要があります。次に、オブジェクト永続性モデルを使用して、クラスをテーブルにマッピングします。この API は、Amazon.DynamoDB.DataModel 名前空間で利用できます。
+  **サービスクライアント API**: これは、プロトコルレベルの API であり、DynamoDB API に緊密にマッピングされます。この低レベル API は、テーブルおよび項目のすべてのオペレーション (テーブルおよび項目の作成、更新、削除など) に使用できます。テーブルに対するクエリおよびスキャンも可能です。この API は、Amazon.DynamoDB 名前空間で利用できます。

これらの 3 つのモデルは、次のトピックで詳しく説明します。

**Topics**