

# 关系（SQL）数据库和 DynamoDB 在创建表方面的差异
<a name="SQLtoNoSQL.CreateTable"></a>

表是关系数据库和 Amazon DynamoDB 中的基本数据结构。关系数据库管理系统 (RDBMS) 要求您在创建表时定义表的架构。相比之下，DynamoDB 表没有架构—与主键不同，您在创建表时无需定义任何属性或数据类型。

以下章节将使用 SQL 创建表的方式与使用 DynamoDB 创建表的方式进行了比较。

**Topics**
+ [

## 使用 SQL 创建表
](#SQLtoNoSQL.CreateTable.SQL)
+ [

## 使用 DynamoDB 创建表
](#SQLtoNoSQL.CreateTable.DynamoDB)

## 使用 SQL 创建表
<a name="SQLtoNoSQL.CreateTable.SQL"></a>

通过 SQL，您将使用 `CREATE TABLE` 语句创建表，如以下示例所示。

```
CREATE TABLE Music (
    Artist VARCHAR(20) NOT NULL,
    SongTitle VARCHAR(30) NOT NULL,
    AlbumTitle VARCHAR(25),
    Year INT,
    Price FLOAT,
    Genre VARCHAR(10),
    Tags TEXT,
    PRIMARY KEY(Artist, SongTitle)
);
```

此表的主键包含 *Artist* 和 *SongTitle*。

您必须定义表的所有列和数据类型以及表的主键。(如有必要，您稍后可以使用 `ALTER TABLE` 语句更改这些定义。)

许多 SQL 实现可让您将表的存储规范定义为 `CREATE TABLE` 语句的一部分。除非另外指明，否则使用默认存储设置创建表。在生产环境中，数据库管理员可以帮助确定最佳存储参数。

## 使用 DynamoDB 创建表
<a name="SQLtoNoSQL.CreateTable.DynamoDB"></a>

使用 `CreateTable` 操作可创建预调配的模式表，同时指定参数，如下所示：

```
{
    TableName : "Music",
    KeySchema: [
        {
            AttributeName: "Artist",
            KeyType: "HASH" //Partition key
        },
        {
            AttributeName: "SongTitle",
            KeyType: "RANGE" //Sort key
        }
    ],
    AttributeDefinitions: [
        {
            AttributeName: "Artist",
            AttributeType: "S"
        },
        {
            AttributeName: "SongTitle",
            AttributeType: "S"
        }
    ],
    ProvisionedThroughput: {       // Only specified if using provisioned mode
        ReadCapacityUnits: 1,
        WriteCapacityUnits: 1
    }
}
```

此表的主键包括 *Artist*（分区键）和 *SongTitle*（排序键）。

您必须向 `CreateTable` 提供以下参数：
+ `TableName` – 表名称。
+ `KeySchema` – 用于主键的属性。有关更多信息，请参阅[表、项目和属性](HowItWorks.CoreComponents.md#HowItWorks.CoreComponents.TablesItemsAttributes)和[主键](HowItWorks.CoreComponents.md#HowItWorks.CoreComponents.PrimaryKey)。
+ `AttributeDefinitions` – 键架构属性的数据类型。
+ `ProvisionedThroughput (for provisioned tables)` – 每秒需对此表执行的读取和写入次数。DynamoDB 将保留足量的存储和系统资源，以便始终满足您的吞吐量需求。如有必要，您稍后可使用 `UpdateTable` 操作后更改这些设置。由于存储分配完全由 DynamoDB 管理，因此您无需指定表的存储要求。