

# Amazon DynamoDB でサポートされるデータ型と命名規則
<a name="HowItWorks.NamingRulesDataTypes"></a>

このセクションでは、Amazon DynamoDB の命名規則と、DynamoDB がサポートするさまざまなデータ型について説明します。データタイプに適用される制限があります。詳細については、「[データ型](Constraints.md#limits-data-types)」を参照してください。

**Topics**
+ [名前付けルール](#HowItWorks.NamingRules)
+ [データ型](#HowItWorks.DataTypes)
+ [データ型記述子](#HowItWorks.DataTypeDescriptors)

## 名前付けルール
<a name="HowItWorks.NamingRules"></a>

DynamoDB のテーブル、属性、および他のオブジェクトには名前が必要です。名前には意味があり、簡潔でなければなりません。たとえば、*製品*、*ブック*、および*著者*などの名前は一目瞭然です。

DynamoDB の命名規則は次のとおりです。
+ すべての名前は UTF-8 を使用してエンコードする必要があり、大文字と小文字が区別されます。
+ テーブル名とインデックス名の長さは 3～255 文字で、次の文字のみを含めることができます。
  + `a-z`
  + `A-Z `
  + ` 0-9 `
  + `_` (下線)
  + `-` (ダッシュ)
  + `.` (ドット)
+ 属性名は 1 文字以上の長さ、64 KB 未満のサイズにする必要があります。属性名はできるだけ短くすることがベストプラクティスであると考えられています。これにより、属性名がストレージとスループットの使用量の測定に含まれるため、消費される読み取りリクエストユニットを減らすことができます。

  以下の例外があります。これらの属性名は 255 文字以下である必要があります。
  + セカンダリインデックスのパーティションキー名
  + セカンダリインデックスのソートキー名
  + ユーザー指定の射影された属性の名前 (ローカルセカンダリインデックスにのみ適用) 

### 予約語と特殊文字
<a name="HowItWorks.NamingRules.Reserved"></a>

DynamoDB には予約語と特殊文字のリストもあります。詳細な一覧については、「[DynamoDB の予約語](ReservedWords.md)」を参照してください。DynamoDB では、**\$1** (ハッシュ) および **:** (コロン) に特別な意味があります。

DynamoDB では、命名目的でこれらの予約語と特殊文字を使用することができますが、お勧めしません。これは、式でこれらの名前を使用するたびに、プレースホルダー変数を定義する必要があるためです。詳細については、「[DynamoDB の式の属性名 (エイリアス)](Expressions.ExpressionAttributeNames.md)」を参照してください。

## データ型
<a name="HowItWorks.DataTypes"></a>

DynamoDB では、テーブル内の属性に対してさまざまなデータ型がサポートされています。データ型は次のように分類できます。
+ **スカラー型** – スカラー型は 1 つの値を表すことができます。スカラー型は、数値、文字列、バイナリ、ブール、および null です。
+ **ドキュメント型** – JSON ドキュメントで見られるように、入れ子の属性を持つ複雑な構造を表すことができます。ドキュメント型は、リストとマップです。
+ **セット型** – セット型は複数のスカラー値を表すことができます。セット型は、文字セット、数値セット、およびバイナリセットです。

テーブルまたはセカンダリインデックスを作成するときは、各プライマリキー属性 (パーティションキーとソートキー) の名前とデータ型を指定する必要があります。さらに、各プライマリキー属性は、文字列、数値、またはバイナリとして定義する必要があります。

DynamoDB は NoSQL データベースであり、*スキーマレス*です。つまり、テーブルを作成する場合、プライマリキー属性を除き、属性やデータ型を定義する必要はありません。これに対して、リレーショナルデータベースでは、テーブルの作成時に各列の名前とデータ型を定義する必要があります。

ここでは、各データ型について JSON 形式の例を挙げて説明します。

### スカラー型
<a name="HowItWorks.DataTypes.Scalar"></a>

スカラー型は、数値、文字列、バイナリ、ブール、および null です。

#### Number
<a name="HowItWorks.DataTypes.Number"></a>

数値は、正、負、または 0 とすることができます。数値は最大 38 桁の精度を持つことができます。これを超えると例外が発生します。38 桁を超える精度が必要な場合は、文字列を使用できます。
+ 正の範囲: 1E-130～9.9999999999999999999999999999999999999E\$1125
+ 負の範囲: -9.9999999999999999999999999999999999999E\$1125～-1E-130

DynamoDB では、数値は可変長で表されます。先頭と末尾の 0 は切り捨てられます。

すべての数値はネットワーク経由で文字列として DynamoDB に送信され、言語やライブラリ間の互換性が最大になります。ただし、DynamoDB は算術演算では数値を数値型属性として扱います。

数値データ型を使用して、日付またはタイムスタンプを表すことができます。これを行うための方法の 1 つは、1970 年 1 月 1 日 00:00:00 UTC から経過した秒数であるエポックタイムを使用することです。たとえば、エポック時間 `1437136300` は、2015 年 7 月 17 日の 12:31:40 PM UTC を表します。

詳細については、[http://en.wikipedia.org/wiki/Unix\$1time](http://en.wikipedia.org/wiki/Unix_time) を参照してください。

#### String
<a name="HowItWorks.DataTypes.String"></a>

文字列は、UTF-8 バイナリエンコードの Unicode です。属性がインデックスまたはテーブルのキーとして使用されない場合、文字列の最小長は 0 になります。また、DynamoDB 項目の最大サイズ上限である 400 KB の制約があります。

文字列型として定義されているプライマリキー属性には、さらに以下の制約が適用されます。
+ シンプルなプライマリキーの場合、最初の属性値 (パーティションキー) の最大長は 2,048 バイトです。
+ 複合プライマリキーの場合、2 番目の属性値 (ソートキー) の最大長は 1,024 バイトです。

DynamoDB は、基礎となる UTF-8 文字列エンコードのバイトを使用して文字列を照合し、比較します。たとえば、「`a`」 (0x61) は「`A`」 (0x41) より大きく、「`¿`」 (0xC2BF) は 「`z`」 (0x7A) より大きいです。

文字列データ型を使用して、日付またはタイムスタンプを表すことができます。これを行う 1 つの方法は、これらの例に示すように、ISO 8601 文字列を使用することです。
+ `2016-02-15`
+ `2015-12-21T17:42:34Z`
+ `20150311T122706Z`

詳細については、[http://en.wikipedia.org/wiki/ISO\$18601](http://en.wikipedia.org/wiki/ISO_8601) を参照してください。

**注記**  
従来のリレーショナルデータベースとは異なり、DynamoDB は日付と時刻のデータ型をネイティブにサポートしていません。代わりに、Unix エポック時間を使用して、日付と時刻のデータを数値データ型として保存すると便利です。

#### バイナリ
<a name="HowItWorks.DataTypes.Binary"></a>

バイナリ型の属性には、圧縮テキスト、暗号化データ、イメージなど、任意のバイナリデータが保存されます。DynamoDB は、バイナリ値を比較するたびに、各バイナリデータを符号なしとして扱います。

属性がインデックスまたはテーブルのキーとして使用されず、DynamoDB 項目の最大サイズ上限が 400 KB に制約されている場合、バイナリ属性の長さは 0 になります。

プライマリキー属性をバイナリ型属性として定義する場合、以下の制約がさらに適用されます。
+ シンプルなプライマリキーの場合、最初の属性値 (パーティションキー) の最大長は 2,048 バイトです。
+ 複合プライマリキーの場合、2 番目の属性値 (ソートキー) の最大長は 1,024 バイトです。

アプリケーションは、DynamoDB に送信する前に、base64 エンコード形式のバイナリ値をエンコードする必要があります。DynamoDB は、これらの値を受信すると、データを符号なしバイト配列にデコードし、それをバイナリ属性の長さとして使用します。

次に示しているのはバイナリ属性の例であり、Base64 でエンコードされたテキストを使用しています。

```
dGhpcyB0ZXh0IGlzIGJhc2U2NC1lbmNvZGVk
```

#### ブール値
<a name="HowItWorks.DataTypes.Boolean"></a>

ブール型の属性には、`true` または `false` が格納されます。

#### Null
<a name="HowItWorks.DataTypes.Null"></a>

Null は不明または未定義の状態の属性を表します。

### ドキュメント型
<a name="HowItWorks.DataTypes.Document"></a>

ドキュメント型は、リストとマップです。これらのデータ型は、相互に入れ子にして、最大 32 レベルの深さまで複雑なデータ構造を表すことができます。

値を含む項目が DynamoDB のサイズ制限 (400 KB) 内である限り、リストまたはマップの値の最大数の制限はありません。

 属性値がテーブルまたはインデックスキーに使用されていない場合、空の文字列または空のバイナリ値にすることができます。属性値は空の文字列または空のセット (文字列セット、数値セット、またはバイナリセット) にすることはできませんが、空のリストとマップは許可されます。リストとマップ内では、空の文字列とバイナリ値が許可されます。詳細については、「[属性](Constraints.md#limits-attributes)」を参照してください。

#### リスト
<a name="HowItWorks.DataTypes.Document.List"></a>

リスト型の属性には、順序付きの値のコレクションを保存できます。リストは角括弧で囲まれます: `[ ... ]`

リストは JSON 配列に似ています。リスト要素に保存できるデータ型に制限はなく、リスト要素の要素が同じ型である必要はありません。

次の例は、2 つの文字列と数が含まれるリストを示します。

```
FavoriteThings: ["Cookies", "Coffee", 3.14159]
```

**注記**  
DynamoDB では、要素が深い入れ子になっていても、リスト内の個々の要素を操作できます。詳細については、「[DynamoDB での式の使用](Expressions.md)」を参照してください。

#### マップ
<a name="HowItWorks.DataTypes.Document.Map"></a>

マップ型属性は、順序なしの名前と値のペアのコレクションを保存できます。マップは中括弧で囲まれます: `{ ... }`

マップは、JSON オブジェクトと同様です。マップの要素に保存できるデータ型に制限はなく、マップの要素が同じ型である必要はありません。

マップは DynamoDB で JSON ドキュメントを保存するのに最適です。以下の例は、文字列、数値、別のマップを含む入れ子のリストを要素とするマップを示しています。

```
{
    Day: "Monday",
    UnreadEmails: 42,
    ItemsOnMyDesk: [
        "Coffee Cup",
        "Telephone",
        {
            Pens: { Quantity : 3},
            Pencils: { Quantity : 2},
            Erasers: { Quantity : 1}
        }
    ]
}
```

**注記**  
DynamoDB では、要素が深い入れ子になっていても、マップ内の個々の要素を操作できます。詳細については、「[DynamoDB での式の使用](Expressions.md)」を参照してください。

### セット
<a name="HowItWorks.DataTypes.SetTypes"></a>

DynamoDB は、数値、文字列、またはバイナリ値のセットを表す型をサポートします。セット内の要素はすべて、同じ型である必要があります。例えば、数値セットには数値のみを含めることができ、文字列セットには文字列のみを含めることができます。

値を含む項目が DynamoDB のサイズ制限 (400 KB) 内である限り、セットの値の最大数の制限はありません。

設定内の各値は一意である必要があります。設定内の値の順序は保持されません。したがって、アプリケーションは、設定内の要素の特定の順序に依存することはできません。DynamoDB は空のセットをサポートしていませんが、セット内の空の文字列とバイナリ値は許可されます。

次の例では、文字列セット、設定された numbet とバイナリ設定を示します:

```
["Black", "Green", "Red"]

[42.2, -19, 7.5, 3.14]

["U3Vubnk=", "UmFpbnk=", "U25vd3k="]
```

## データ型記述子
<a name="HowItWorks.DataTypeDescriptors"></a>

低レベルの DynamoDB API プロトコルは、各属性を解釈する方法を DynamoDB に伝えるトークンとして、*データ型記述子*を使用します。

DynamoDB データ型記述子の一覧を次に示します。
+ **`S`** — 文字列
+ **`N`** — 数値
+ **`B`** — バイナリ
+ **`BOOL`** — ブール
+ **`NULL`** — Null
+ **`M`** — マップ
+ **`L`** — リスト
+ **`SS`** — 文字列セット
+ **`NS`** — 数値セット
+ **`BS`** — バイナリセット