

# 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 中的表、属性和其他对象必须具有名称。名称应该简明扼要，例如，*Products*、*Books* 和 *Authors* 之类的名称是都是不言而喻的。

下面是 DynamoDB 的命名规则：
+ 所有名称都必须使用 UTF-8 进行编码，并且区分大小写。
+ 表名称和索引名称的长度必须介于 3 到 255 个字符之间，而且只能包含以下字符：
  + `a-z`
  + `A-Z `
  + ` 0-9 `
  + `_`（下划线）
  + `-`（短划线）
  + `.`（圆点）
+ 属性名称的长度必须至少为 1 个字符，但大小小于 64KB。最佳实践是使属性名称尽可能短。这有助于减少占用的读取请求单位数量，因为属性名称包含在存储和吞吐量使用量的计量中。

  存在以下例外。这些属性名称的长度不得超过 255 个字符：
  + 二级索引分区键名称
  + 二级索引排序键名称
  + 任意用户指定的投影属性的名称（仅适用于本地二级索引） 

### 保留字和特殊字符
<a name="HowItWorks.NamingRules.Reserved"></a>

DynamoDB 具有保留字和特殊字符的列表。有关完整列表，请参阅[DynamoDB 中的保留字](ReservedWords.md)。此外，以下字符在 DynamoDB 中具有特殊含义：**\$1**（哈希）和 **:**（冒号）。

尽管 DynamoDB 允许您将这些保留字和特殊字符用于名称，但我们建议您避免这样做，因为在表达式中使用这些名称时必须定义占位符变量。有关更多信息，请参阅 [DynamoDB 中的表达式属性名称（别名）](Expressions.ExpressionAttributeNames.md)。

## 数据类型
<a name="HowItWorks.DataTypes"></a>

DynamoDB 对表中的属性支持很多不同的数据类型。可按以下方式为属性分类：
+ **标量类型** - 标量类型可准确地表示一个值。标量类型包括数字、字符串、二进制、布尔值和 null。
+ **文档类型** - 文档类型可表示具有嵌套属性的复杂结构，例如您将在 JSON 文档中找到的内容。文档类型包括列表和映射。
+ **集类型** - 集类型可表示多个标量值。集类型包括字符串集、数字集和二进制集。

当您创建表或二级索引时，您必须指定每个主键属性（分区键和排序键）的名称和数据类型。此外，每个主键属性必须定义为字符串、数字或二进制类型。

DynamoDB 是 NoSQL 数据库并且*无架构*。这意味着，与主键属性不同，您无需在创建表时定义任何属性或数据类型。与此相对，关系数据库要求您在创建表时定义每个列的名称和数据类型。

下面是每种数据类型的说明以及采用 JSON 格式的示例。

### 标量类型
<a name="HowItWorks.DataTypes.Scalar"></a>

标量类型包括数字、字符串、二进制、布尔值和 null。

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

数字可为正数、负数或零。数字最多可精确到 38 位。超过此位数将导致异常。如果您需要 38 位以上的精度，可以使用字符串。
+ 正数范围：1E-130 到 9.9999999999999999999999999999999999999E\$1125
+ 负数范围：-9.9999999999999999999999999999999999999E\$1125 到 -1E-130

在 DynamoDB 中，数字以可变长度形式表示。系统会删减开头和结尾的 0。

所有数字将作为字符串通过网络发送到 DynamoDB，以最大程度地提高不同语言和库之间的兼容性。但是，DynamoDB 会将它们视为数字类型属性以方便数学运算。

您可以使用数字数据类型表示日期或时间戳。执行此操作的一种方法是使用纪元时间，自 1970 年 1 月 1 日 00:00:00 UTC 以来的秒数。例如，纪元时间 `1437136300` 表示 2015 年 7 月 17 日下午 12:31:40 UTC。

有关更多信息，请访问 [http://en.wikipedia.org/wiki/Unix\$1time](http://en.wikipedia.org/wiki/Unix_time)。

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

字符串是使用 UTF-8 二进制编码的 Unicode。如果属性未用作索引或表的键，并且受最大 DynamoDB 项目大小限制 400 KB 的约束，则字符串的最小长度可以为零。

以下附加约束将适用于定义为字符串类型的主键属性：
+ 对于简单的主键，第一个属性值（分区键）的最大长度为 2048 字节。
+ 对于复合主键，第二个属性值（排序键）的最大长度为 1024 字节。

DynamoDB 使用基础的 UTF-8 字符串编码字节整理和比较字符串。例如，“`a`”(0x61) 大于“`A`”(0x41)，“`¿`”(0xC2BF) 大于“`z`”(0x7A)。

您可使用字符串数据类型表示日期或时间戳。执行此操作的一种方法是使用 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 的约束，则该属性的长度可以为零。

如果您将主键属性定义为二进制类型属性，以下附加限制将适用：
+ 对于简单的主键，第一个属性值（分区键）的最大长度为 2048 字节。
+ 对于复合主键，第二个属性值（排序键）的最大长度为 1024 字节。

在将二进制值发送到 DynamoDB 之前，您的应用程序必须采用 Base64 编码格式对其进行编码。收到这些值后，DynamoDB 会将数据解码为无符号字节数组，将其用作二进制属性的长度。

下面的示例是一个采用 Base64 编码文本的二进制属性。

```
dGhpcyB0ZXh0IGlzIGJhc2U2NC1lbmNvZGVk
```

#### 布尔值
<a name="HowItWorks.DataTypes.Boolean"></a>

布尔类型属性可以存储 `true` 或 `false`。

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

空代表属性具有未知或未定义状态。

### 文档类型
<a name="HowItWorks.DataTypes.Document"></a>

文档类型包括列表和映射。这些数据类型可以互相嵌套，用来表示深度最多为 32 层的复杂数据结构。

只要包含值的项目大小在 DynamoDB 项目大小限制 (400 KB) 内，列表或映射中值的数量就没有限制。

 如果属性未用于表或索引键，属性值可以是空字符串或空二进制值。属性值不能为空集（字符串集、数字集或二进制集），但允许使用空的列表和映射。列表和映射中允许使用空的字符串和二进制值。有关更多信息，请参阅 [属性](Constraints.md#limits-attributes)。

#### 列表
<a name="HowItWorks.DataTypes.Document.List"></a>

列表类型属性可存储值的有序集合。列表用方括号括起：`[ ... ]`

列表类似于 JSON 数组。列表元素中可以存储的数据类型没有限制，列表元素中的元素也不一定为相同类型。

以下示例显示了包含两个字符串和一个数字的列表。

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

**注意**  
DynamoDB 让您可以使用列表中的单个元素，即使这些元素深层嵌套也是如此。有关更多信息，请参阅 [在 DynamoDB 中使用表达式](Expressions.md)。

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

映射类型属性可以存储名称/值对的无序集合。映射用大括号括起：`{ ... }`

映射类似于 JSON 对象。映射元素中可以存储的数据类型没有限制，映射中的元素也不一定为相同类型。

映射非常适合用来将 JSON 文档存储在 DynamoDB 中。以下示例显示了一个映射，该映射包含一个字符串、一个数字和一个含有另一个映射的嵌套列表。

```
{
    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 不支持空集，但集合中允许使用空字符串和二进制值。

以下示例显示了一个字符串集、一个数字集和一个二进制集：

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

[42.2, -19, 7.5, 3.14]

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

## 数据类型描述符
<a name="HowItWorks.DataTypeDescriptors"></a>

低级别 DynamoDB API 协议使用*数据类型描述符*作为令牌，这些令牌告诉 DynamoDB 如何解释每个属性。

以下是 DynamoDB 数据类型描述符的完整列表：
+ **`S`** – String
+ **`N`** – Number
+ **`B`** – Binary
+ **`BOOL`** – Boolean
+ **`NULL`** – Null
+ **`M`** – Map
+ **`L`** – List
+ **`SS`** – String Set
+ **`NS`** – Number Set
+ **`BS`** – Binary Set