

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

# 对中的 DynamoDB 数据源进行版本控制 AWS AppSync
<a name="versioned-data-sources"></a>

AWS AppSync 目前支持 DynamoDB 数据源的版本控制。冲突检测、冲突解决和同步操作需要 `Versioned` 数据来源。在数据源上启用版本控制后， AWS AppSync 将自动：
+ 使用对象版本化元数据增强项目。
+ 将对具有 AWS AppSync 突变的项目所做的更改记录到 *Delt* a 表中。
+ 使用“逻辑删除”将*基本* 表中的已删除项目保留可配置的时间。

## 版本控制的数据来源配置
<a name="versioned-data-source-configuration"></a>

对 DynamoDB 数据来源启用版本控制时，可以指定以下字段：

** `BaseTableTTL` **  
使用“逻辑删除”（一个元数据字段，指示项目已被删除）保留*基本* 表中已删除项目的分钟数。如果希望删除项目时立即将其移除，则可以将此值设置为 *0*。该字段为必填。

** `DeltaSyncTableName` **  
存储对具有 AWS AppSync 突变的项目所做的更改的表的名称。该字段为必填。

** `DeltaSyncTableTTL` **  
在*增量* 表中保留项目的分钟数。该字段为必填。

## 增量同步表日志记录
<a name="delta-sync-table"></a>

AWS AppSync 目前支持使用`PutItem`、`UpdateItem`和 Dynamo `DeleteItem` DB 操作对突变进行增量同步日志记录。

*当 AWS AppSync 突变更改版本化数据源中的项目时，该更改的记录将存储在针对增量更新进行了优化的增量表中。*您可以选择对其他版本化数据源使用不同的 *Delta* 表（例如，每种类型一个，每个域区域一个），或者对您的 API 使用单个 *Delta* 表。 AWS AppSync 建议不要对多个*增量表使用单个 Delta* 表， APIs 以免主键发生冲突。

此表所需的架构如下所示：

** `ds_pk` **  
用作分区键的字符串值。这是将*基本*数据来源名称和更改发生日期的 ISO 8601 格式连接在一起而构建的（例如 `Comments:2019-01-01`）。  
*将 VTL 映射模板中的`customPartitionKey`标志设置为分区键的列名时（参见《*AWS AppSync 开发者指南》*中的 [DynamoDB 解析器映射模板参考](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-mapping-template-reference-dynamodb.html#aws-appsync-resolver-mapping-template-reference-dynamodb-updateitem)），格式会`ds_pk`发生变化，字符串是通过在基表的新记录中追加分区键的值来构造的。*例如，如果*基* 表中的记录的分区键值为 `1a`，排序键值为 `2b`，则字符串的新值为：`Comments:2019-01-01:1a`。

** `ds_sk` **  
用作排序键的字符串值。这是将更改发生时间的 ISO 8601 格式、项目的主键和项目的版本连接在一起而构建的。这些字段的组合保证了*增量* 表中的每个条目的唯一性（例如，如果时间为 `09:30:00`，ID 为`1a`，版本为 `2`，则该值为 `09:30:00:1a:2`）。  
*将 VTL 映射模板中的`customPartitionKey`标志设置为分区键的列名时（参见《*AWS AppSync 开发者指南》*中的 [DynamoDB 解析器映射模板参考](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-mapping-template-reference-dynamodb.html#aws-appsync-resolver-mapping-template-reference-dynamodb-updateitem)），格式会`ds_sk`发生变化，字符串的构造方法是将组合键的值替换为基表中的排序键的值。*使用上面的示例，如果*基* 表中的记录的分区键值为 `1a`，排序键值为 `2b`，则字符串的新值为：`09:30:00:2b:3`。

** `_ttl` **  
一个数值，用于存储应从*增量* 表中移除项目时的时间戳（以纪元秒为单位）。此值是通过将数据来源上配置的 `DeltaSyncTableTTL` 值添加到发生更改那一刻的时间来确定的。该字段应配置为 DynamoDB TTL 属性。

配置为与*基本* 表一起使用的 IAM 角色还必须包含对*增量* 表进行操作的权限。在该示例中，显示了名为 `Comments` 的*基* 表和名为 `ChangeLog` 的*增量* 表的权限策略：

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "dynamodb:DeleteItem",
                "dynamodb:GetItem",
                "dynamodb:PutItem",
                "dynamodb:Query",
                "dynamodb:Scan",
                "dynamodb:UpdateItem"
            ],
            "Resource": [
                "arn:aws:dynamodb:us-east-1:000000000000:table/Comments",
                "arn:aws:dynamodb:us-east-1:000000000000:table/Comments/*",
                "arn:aws:dynamodb:us-east-1:000000000000:table/ChangeLog",
                "arn:aws:dynamodb:us-east-1:000000000000:table/ChangeLog/*"
            ]
        }
    ]
}
```

------

## 版本控制的数据来源元数据
<a name="versioned-data-source-metadata"></a>

AWS AppSync 代表您管理`Versioned`数据源上的元数据字段。自行修改这些字段可能会导致应用程序中的错误或数据丢失。这些字段包括：

** `_version` **  
一个单调递增的计数器，在项目发生更改时随时更新。

** `_lastChangedAt` **  
一个数值，用于存储上次修改项目时的时间戳（以纪元毫秒为单位）。

** `_deleted` **  
一个布尔型“逻辑删除”值，指示项目已被删除。应用程序可以使用此功能从本地数据存储中移除已删除的项目。

** `_ttl` **  
一个数值，用于存储应从底层数据来源中移除项目时的时间戳（以纪元秒为单位）。

** `ds_pk` **  
用作*增量* 表的分区键的字符串值。

** `ds_sk` **  
用作*增量* 表的排序键的字符串值。

**`gsi_ds_pk`**  
生成的字符串值属性，用于支持将全局二级索引作为分区键。*只有在 VTL 映射模板中同时启用`customPartitionKey`和`populateIndexFields`标志时，才会将其包括在内（参见《开发者指南》中的 [DynamoDB 解析器映射模板参考](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-mapping-template-reference-dynamodb.html#aws-appsync-resolver-mapping-template-reference-dynamodb-updateitem)）。AWS AppSync *如果启用，则将*基本* 数据来源名称和更改发生日期的 ISO 8601 格式连接在一起以构建该值（例如，如果*基*表名为 *Comments*，该记录将设置为 `Comments:2019-01-01`）。

**`gsi_ds_sk`**  
生成的字符串值属性，用于支持将全局二级索引作为排序键。*只有在 VTL 映射模板中同时启用`customPartitionKey`和`populateIndexFields`标志时，才会将其包括在内（参见《开发者指南》中的 [DynamoDB 解析器映射模板参考](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-mapping-template-reference-dynamodb.html#aws-appsync-resolver-mapping-template-reference-dynamodb-updateitem)）。AWS AppSync *如果启用，则将更改发生时间的 ISO 8601 格式、*基* 表中的项目的分区键、*基*表中的项目的排序键以及项目的版本连接在一起以构建该值（例如，如果时间为 `09:30:00`，分区键值为 `1a`，排序键值为 `2b`，版本为 `3`，则该值为 `09:30:00:1a#2b:3`）。

这些元数据字段将影响基础数据源中项目的总体大小。 AWS AppSync 建议在设计应用程序时为版本化数据源元数据保留 *500 字节以上的最大主键大小的*存储空间。要在客户端应用程序中使用此元数据，请在您的 GraphQL 类型和变更的选择集中包括 `_version`、`_lastChangedAt` 和 `_deleted` 字段。