

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

# Amazon QLDB 控制台入门
<a name="getting-started"></a>

**重要**  
终止支持通知：现有客户将能够使用 Amazon QLDB，直到 2025 年 7 月 31 日终止支持。有关更多详细信息，请参阅[将亚马逊 QLDB 账本迁移到亚马逊 Aurora PostgreSQL](https://aws.amazon.com/blogs/database/migrate-an-amazon-qldb-ledger-to-amazon-aurora-postgresql/)。

本教程指导您完成创建第一个 Amazon QLDB 分类账的步骤，并用表和样例数据填充它。您在此场景中创建的示例分类账是一个机动车辆部门（DMV）数据库，用于追踪有关车辆登记的完整历史信息。

资产的历史是 QLDB 的常见用例，因为它涉及各种场景和操作，这些场景和操作突显了分类账数据库的用处。使用 QLDB，您可以在支持类似 SQL 的查询功能的面向文档的数据库中直接访问、查询和验证数据更改的完整历史记录。

使用本教程，以下主题说明了如何添加车辆登记、修改车辆登记，以及如何查看这些登记的更改历史记录。本指南还向您展示了如何以加密方式验证注册文档，并通过清理资源和删除示例分类账来结束。

本教程中的每个步骤都有使用的 AWS 管理控制台说明。

**Topics**
+ [教程先决条件和注意事项](getting-started.prereqs.md)
+ [第 1 步：创建新分类账](getting-started-step-1.md)
+ [步骤 2：在分类账中创建表、索引和示例数据](getting-started-step-2.md)
+ [第 3 步：查询分类账中的表](getting-started-step-3.md)
+ [第 4 步：修改分类账中的文档](getting-started-step-4.md)
+ [第 5 步：查看文档修订历史记录](getting-started-step-5.md)
+ [第 6 步：验证分类账中的文档](getting-started-step-6.md)
+ [步骤 7（可选）：清除资源](getting-started-step-7.md)
+ [Amazon QLDB 入门：后续步骤](getting-started-next-steps.md)

# 教程先决条件和注意事项
<a name="getting-started.prereqs"></a>

**重要**  
终止支持通知：现有客户将能够使用 Amazon QLDB，直到 2025 年 7 月 31 日终止支持。有关更多详细信息，请参阅[将亚马逊 QLDB 账本迁移到亚马逊 Aurora PostgreSQL](https://aws.amazon.com/blogs/database/migrate-an-amazon-qldb-ledger-to-amazon-aurora-postgresql/)。

在开始本 Amazon QLDB 教程之前，请确保满足以下先决条件：

1. 如果您尚未执行此操作[访问 Amazon QLDB](accessing.md)，请按照中的 AWS 设置说明进行操作。这些步骤包括注册 AWS 和创建管理用户。

1. 按照中的 [设置权限](#getting-started.prereqs.permissions) 说明为您的 QLDB 资源设置 IAM 权限。要完成本教程中的所有步骤，您需要通过 AWS 管理控制台对分类账资源拥有完全管理权限。
**注意**  
如果您已经以具有完全 AWS 管理权限的用户身份登录，则可以跳过此步骤。

1. （可选）QLDB 使用 () 中的密钥对静态数据进行加密。 AWS Key Management Service AWS KMS选择以下 AWS KMS keys类型之一：
   + **AWS 拥有的 KMS 密**钥 — 使用由 AWS 您代表拥有和管理的 KMS 密钥。这是默认选项，无需额外设置。
   + **有效的对称客户托管 KMS 密钥**：在您创建、拥有和管理的账户中使用指定的对称加密 KMS 密钥。QLDB 不支持[非对称密钥](https://docs.aws.amazon.com/kms/latest/developerguide/symmetric-asymmetric.html)。

     此选项要求您创建 KMS 密钥或使用账户中现有密钥。有关创建客户托管密钥的说明，请参阅 *AWS Key Management Service 《开发者指南》* 中的 [创建对称加密 KMS 密钥](https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html#create-symmetric-cmk)。

     要指定客户托管的 KMS 密钥，您可以使用其密钥 ID、别名或 Amazon 资源名称（ARN）。要了解更多信息，请参阅《*AWS Key Management Service 开发者指南》*中的[密钥标识符 (KeyId)](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#key-id)。
**注意**  
不支持跨区域密钥。指定的 KMS 密钥必须与您的分类账处于同一 AWS 区域 中。

## 设置权限
<a name="getting-started.prereqs.permissions"></a>

在此步骤中，您将通过控制台为 AWS 账户中的所有 QLDB 资源设置完全访问权限。要快速授予这些权限，请使用 AWS 托管策略 [Amazon QLDBConsole FullAccess](security-iam-awsmanpol.md#security-iam-awsmanpol-AmazonQLDBConsoleFullAccess)。

要提供访问权限，请为您的用户、组或角色添加权限：
+ 中的用户和群组 AWS IAM Identity Center：

  创建权限集合。按照《AWS IAM Identity Center 用户指南》**中[创建权限集](https://docs.aws.amazon.com/singlesignon/latest/userguide/howtocreatepermissionset.html)的说明进行操作。
+ 通过身份提供商在 IAM 中托管的用户：

  创建适用于身份联合验证的角色。按照《IAM 用户指南》**中[针对第三方身份提供商创建角色（联合身份验证）](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-idp.html)的说明进行操作。
+ IAM 用户：
  + 创建您的用户可以担任的角色。按照《IAM 用户指南》**中[为 IAM 用户创建角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-user.html)的说明进行操作。
  + （不推荐使用）将策略直接附加到用户或将用户添加到用户组。按照《IAM 用户指南》**中[向用户添加权限（控制台）](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users_change-permissions.html#users_change_permissions-add-console)中的说明进行操作。

**重要**  
在本教程中，您授予自己对所有 QLDB 资源的完全管理权限。但是，对于生产用例，请遵循[授予最低权限](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#grant-least-privilege)，或仅授予执行任务所需的权限这一安全最佳实践。有关示例，请参阅 [Amazon QLDB 基于身份的策略示例](security_iam_id-based-policy-examples.md)。

要创建名为 `vehicle-registration` 的分类账，请进入 [第 1 步：创建新分类账](getting-started-step-1.md)。

# 第 1 步：创建新分类账
<a name="getting-started-step-1"></a>

**重要**  
终止支持通知：现有客户将能够使用 Amazon QLDB，直到 2025 年 7 月 31 日终止支持。有关更多详细信息，请参阅[将亚马逊 QLDB 账本迁移到亚马逊 Aurora PostgreSQL](https://aws.amazon.com/blogs/database/migrate-an-amazon-qldb-ledger-to-amazon-aurora-postgresql/)。

在此步骤中，您将创建一个名为 `vehicle-registration` 的新 Amazon QLDB 分类账。然后，确认分类账的状态为 **Active**。您还可以验证添加到分类账中的任何标签。

创建分类账时，将默认启用 *删除保护*。QLDB 中有一项删除保护功能，可防止分类账被任何用户删除。在使用 QLDB API 或 AWS Command Line Interface () 创建账本时，您可以禁用删除保护。AWS CLI

**创建新分类账**

1. [登录并打开亚马逊 QLDB 控制台，网址为 /qldb。 AWS 管理控制台 https://console.aws.amazon.com](https://console.aws.amazon.com/qldb)

1. 在导航窗格中，选择 **开始**。

1. 在**创建您的第一张分类账**明细中，选择**创建分类账**。

1. 在 **穿件分类账** 页面上，执行以下操作：
   + **分类账信息** - **分类账名称**应预先填充。**vehicle-registration**
   + **权限模式** - 要分配给分类账的权限模式。请选择以下选项之一：
     + **允许所有** – 这是一种旧式权限模式，支持对分类账进行 API 级别粒度的访问控制。

       此模式允许拥有此分类账的 `SendCommand` API 权限的用户在指定分类账中的任何表上运行所有 PartiQL 命令（因此，`ALLOW_ALL`）。此模式忽略您为分类账创建的任何表级或命令级 IAM 权限策略。
     + **标准** –（*推荐*）一种权限模式，可以对分类账、表格和 PartiQL 命令进行更精细粒度的访问控制。我们强烈建议使用此权限模式来最大限度地提高分类账数据的安全性。

       默认情况下，此模式拒绝所有用户请求在此分类账中的任何表上运行任何 PartiQL 命令。要允许 PartiQL 命令运行，除了分类账的 `SendCommand` API 权限外，您还必须为特定表资源和 PartiQL 操作创建 IAM 权限策略。有关信息，请参阅[请参阅《Amazon QLDB 开发人员》中的标准权限模式入门](getting-started-standard-mode.md)。
   + **加密静态数据** – 用于在 AWS Key Management Service （AWS KMS）中的加密静态数据的密钥。请选择以下选项之一：
     + **使用 AWS 拥有的 KMS 密**钥-使用由 AWS 您代表拥有和管理的 KMS 密钥。这是默认选项，无需额外设置。
     + **选择其他 AWS KMS 密钥**-在您的账户中使用由您创建、拥有和管理的对称加密 KMS 密钥。

       要使用 AWS KMS 控制台创建新密钥，请选择**创建 AWS KMS 密钥**。有关更多信息，请参阅 [AWS Key Management Service 开发人员指南](https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html#create-symmetric-cmk) 中的*创建对称加密 KMS 密钥*。

       要使用现有 KMS 密钥，请从下拉列表中选择一个密钥或指定 KMS 密钥 ARN。
   + **标签** –（可选）通过以键值对的形式附加标签来向分类账添加元数据。您可以向分类账添加标签来帮助组织和标识它们。有关更多信息，请参阅 [为 Amazon QLDB 资源贴标签](tagging.md)。

     选择**添加标签**，然后输入合适的键值对。

1. 根据需要进行设置后，选择 **创建分类账**。
**注意**  
当 QLDB 分类账的状态变为“**活跃**”时，您可以访问该 QLDB 分类账。这个过程可能需要几分钟。

1. 在**分类账**列表中，找到 `vehicle-registration` 并确认该分类账的状态是否为 **Active**。

1. （可选）选择 `vehicle-registration` 分类账名称。在**车辆登记**分类账详细信息页面上，确认您添加到分类账的所有标签都显示在**标签**卡上。您也可以使用此控制台页面编辑分类账标签。

要在 `vehicle-registration` 分类账中创建表，请继续 [步骤 2：在分类账中创建表、索引和示例数据](getting-started-step-2.md)。

# 步骤 2：在分类账中创建表、索引和示例数据
<a name="getting-started-step-2"></a>

**重要**  
终止支持通知：现有客户将能够使用 Amazon QLDB，直到 2025 年 7 月 31 日终止支持。有关更多详细信息，请参阅[将亚马逊 QLDB 账本迁移到亚马逊 Aurora PostgreSQL](https://aws.amazon.com/blogs/database/migrate-an-amazon-qldb-ledger-to-amazon-aurora-postgresql/)。

当您的 Amazon QLDB 分类账处于活动状态时，您可以开始创建有关车辆、车主和注册信息的数据表。创建表和索引后，可以向其中加载数据。

在此步骤中，您将在`vehicle-registration`分类账中创建四个表格：
+ `VehicleRegistration`
+ `Vehicle`
+ `Person`
+ `DriversLicense`

您还可创建以下索引。


****  

| 表名称 | 字段 | 
| --- | --- | 
| VehicleRegistration | VIN | 
| VehicleRegistration | LicensePlateNumber | 
| Vehicle | VIN | 
| Person | GovId | 
| DriversLicense | LicensePlateNumber | 
| DriversLicense | PersonId | 

您可以使用 QLDB 控制台自动创建这些带有索引的表，并在其中加载示例数据。[或者，您可以使用控制台上的 P **artiQL 编辑器**来手动运行每个 PartiQL 语句。](ql-reference.md) step-by-step

## 自动选项
<a name="getting-started-step-2.con-auto"></a>

**创建表、索引与示例数据**

1. [在 /qldb 上打开亚马逊 QLDB 控制台。https://console.aws.amazon.com](https://console.aws.amazon.com/qldb)

1. 在导航窗格中，选择 **开始**。

1. 在**示例应用程序数据**卡上的 **自动选项**下，在分类账列表中进行选择 `vehicle-registration`。

1. 选择 **加在示例数据**。

   如果操作成功完成，控制台将显示消息**样本数据已加载**。

   此脚本在单个事务中运行所有语句。如果事务的任何部分失败，则会回滚每条语句，并显示相应的错误消息。解决任何问题后，您可以重试该操作。
**注意**  
事务失败的一个可能原因是尝试创建重复表。如果您的分类账中已存在以下任何表名，则您的加载示例数据的请求将失败：`VehicleRegistration``Vehicle`、`Person`、和`DriversLicense`。  
相反，请尝试将此示例数据加载到一个空分类账中。
此脚本运行参数化 `INSERT` 语句。因此，这些 PartiQL 语句使用绑定参数而不是文字数据记录在日记账块中。例如，您可能会在日记块中看到以下语句，其中问号（`?`）是文档内容的变量占位符。  

     ```
     INSERT INTO Vehicle ?
     ```

## 手动选项
<a name="getting-started-step-2.con"></a>

使用空 `PrimaryOwner` 字段将文档插入 `VehicleRegistration`，使用空 `PersonId` 字段将文档插入 `DriversLicense`。稍后，您将使用 `Person` 表中系统分配的文档 `id` 填充这些字段。

**提示**  
最佳做法是使用此文档 `id` 元数据字段作为外键。有关更多信息，请参阅 [查询文档元数据](working.metadata.md)。

**创建表、索引与示例数据**

1. [在 /qldb 上打开亚马逊 QLDB 控制台。https://console.aws.amazon.com](https://console.aws.amazon.com/qldb)

1. 在导航窗格中，选择 **PartiQL 编辑器**。

1. 选择 `vehicle-registration` 分类账。

1. 首先创建四个表。QLDB 支持开放内容且不强制架构，因此不需要定义属性或数据类型。

   在查询编辑器窗口中输入以下语句，然后选择 **运行**。要运行语句，您可对 Windows 使用快捷键Ctrl\$1Enter，对 macOS 使用Cmd\$1Return。有关更多键盘快捷键的信息，请参阅 [PartiQL 编辑器键盘快捷键](console_QLDB.md#console_QLDB.partiql-editor-shortcuts)。

   ```
   CREATE TABLE VehicleRegistration
   ```

   对以下每个步骤重复此步骤。

   ```
   CREATE TABLE Vehicle
   ```

   ```
   CREATE TABLE Person
   ```

   ```
   CREATE TABLE DriversLicense
   ```

1. 接下来，创建可优化每个表的查询性能的索引。
**重要**  
QLDB 需要索引才能高效查找文档。如果没有索引，QLDB 在读取文档时需进行全表扫描。这可能会导致大型表出现性能问题，包括并发冲突与事务超时。  
为避免表扫描，必须在索引字段或文档 ID 上使用*相等*运算符（`=`或`IN`）运行带有`WHERE`谓词子句的语句。有关更多信息，请参阅 [优化查询性能](working.optimize.md)。

   在查询编辑器窗口中输入以下语句，然后选择 **运行**。

   ```
   CREATE INDEX ON VehicleRegistration (VIN)
   ```

   对以下每个步骤重复此步骤。

   ```
   CREATE INDEX ON VehicleRegistration (LicensePlateNumber)
   ```

   ```
   CREATE INDEX ON Vehicle (VIN)
   ```

   ```
   CREATE INDEX ON Person (GovId)
   ```

   ```
   CREATE INDEX ON DriversLicense (LicensePlateNumber)
   ```

   ```
   CREATE INDEX ON DriversLicense (PersonId)
   ```

1. 创建索引后，您可以开始将数据加载到表中。在此步骤中，将包含分类账所跟踪车辆所有者的个人信息的文档插入 `Person` 表中。

   在查询编辑器窗口中输入以下语句，然后选择 **运行**。

   ```
   INSERT INTO Person
   << {
       'FirstName' : 'Raul',
       'LastName' : 'Lewis',
       'DOB' : `1963-08-19T`,
       'GovId' : 'LEWISR261LL',
       'GovIdType' : 'Driver License',
       'Address' : '1719 University Street, Seattle, WA, 98109'
   },
   {
       'FirstName' : 'Brent',
       'LastName' : 'Logan',
       'DOB' : `1967-07-03T`,
       'GovId' : 'LOGANB486CG',
       'GovIdType' : 'Driver License',
       'Address' : '43 Stockert Hollow Road, Everett, WA, 98203'
   },
   {
       'FirstName' : 'Alexis',
       'LastName' : 'Pena',
       'DOB' : `1974-02-10T`,
       'GovId' : '744 849 301',
       'GovIdType' : 'SSN',
       'Address' : '4058 Melrose Street, Spokane Valley, WA, 99206'
   },
   {
       'FirstName' : 'Melvin',
       'LastName' : 'Parker',
       'DOB' : `1976-05-22T`,
       'GovId' : 'P626-168-229-765',
       'GovIdType' : 'Passport',
       'Address' : '4362 Ryder Avenue, Seattle, WA, 98101'
   },
   {
       'FirstName' : 'Salvatore',
       'LastName' : 'Spencer',
       'DOB' : `1997-11-15T`,
       'GovId' : 'S152-780-97-415-0',
       'GovIdType' : 'Passport',
       'Address' : '4450 Honeysuckle Lane, Seattle, WA, 98101'
   } >>
   ```

1. 然后，在 `DriversLicense` 表格中填入包含每位车主驾驶执照信息的文档。

   在查询编辑器窗口中输入以下语句，然后选择 **运行**。

   ```
   INSERT INTO DriversLicense
   << {
       'LicensePlateNumber' : 'LEWISR261LL',
       'LicenseType' : 'Learner',
       'ValidFromDate' : `2016-12-20T`,
       'ValidToDate' : `2020-11-15T`,
       'PersonId' : ''
   },
   {
       'LicensePlateNumber' : 'LOGANB486CG',
       'LicenseType' : 'Probationary',
       'ValidFromDate' : `2016-04-06T`,
       'ValidToDate' : `2020-11-15T`,
       'PersonId' : ''
   },
   {
       'LicensePlateNumber' : '744 849 301',
       'LicenseType' : 'Full',
       'ValidFromDate' : `2017-12-06T`,
       'ValidToDate' : `2022-10-15T`,
       'PersonId' : ''
   },
   {
       'LicensePlateNumber' : 'P626-168-229-765',
       'LicenseType' : 'Learner',
       'ValidFromDate' : `2017-08-16T`,
       'ValidToDate' : `2021-11-15T`,
       'PersonId' : ''
   },
   {
       'LicensePlateNumber' : 'S152-780-97-415-0',
       'LicenseType' : 'Probationary',
       'ValidFromDate' : `2015-08-15T`,
       'ValidToDate' : `2021-08-21T`,
       'PersonId' : ''
   } >>
   ```

1. 现在，在 `VehicleRegistration` 表中填入车辆登记文件。这些文档包括存储主要和次要所有者的嵌套 `Owners` 结构。

   在查询编辑器窗口中输入以下语句，然后选择 **运行**。

   ```
   INSERT INTO VehicleRegistration
   << {
       'VIN' : '1N4AL11D75C109151',
       'LicensePlateNumber' : 'LEWISR261LL',
       'State' : 'WA',
       'City' : 'Seattle',
       'PendingPenaltyTicketAmount' : 90.25,
       'ValidFromDate' : `2017-08-21T`,
       'ValidToDate' : `2020-05-11T`,
       'Owners' : {
           'PrimaryOwner' : { 'PersonId': '' },
           'SecondaryOwners' : []
       }
   },
   {
       'VIN' : 'KM8SRDHF6EU074761',
       'LicensePlateNumber' : 'CA762X',
       'State' : 'WA',
       'City' : 'Kent',
       'PendingPenaltyTicketAmount' : 130.75,
       'ValidFromDate' : `2017-09-14T`,
       'ValidToDate' : `2020-06-25T`,
       'Owners' : {
           'PrimaryOwner' : { 'PersonId': '' },
           'SecondaryOwners' : []
       }
   },
   {
       'VIN' : '3HGGK5G53FM761765',
       'LicensePlateNumber' : 'CD820Z',
       'State' : 'WA',
       'City' : 'Everett',
       'PendingPenaltyTicketAmount' : 442.30,
       'ValidFromDate' : `2011-03-17T`,
       'ValidToDate' : `2021-03-24T`,
       'Owners' : {
           'PrimaryOwner' : { 'PersonId': '' },
           'SecondaryOwners' : []
       }
   },
   {
       'VIN' : '1HVBBAANXWH544237',
       'LicensePlateNumber' : 'LS477D',
       'State' : 'WA',
       'City' : 'Tacoma',
       'PendingPenaltyTicketAmount' : 42.20,
       'ValidFromDate' : `2011-10-26T`,
       'ValidToDate' : `2023-09-25T`,
       'Owners' : {
           'PrimaryOwner' : { 'PersonId': '' },
           'SecondaryOwners' : []
       }
   },
   {
       'VIN' : '1C4RJFAG0FC625797',
       'LicensePlateNumber' : 'TH393F',
       'State' : 'WA',
       'City' : 'Olympia',
       'PendingPenaltyTicketAmount' : 30.45,
       'ValidFromDate' : `2013-09-02T`,
       'ValidToDate' : `2024-03-19T`,
       'Owners' : {
           'PrimaryOwner' : { 'PersonId': '' },
           'SecondaryOwners' : []
       }
   } >>
   ```

1. 最后，在 `Vehicle` 表中填入描述在分类账中注册的车辆的文档。

   在查询编辑器窗口中输入以下语句，然后选择 **运行**。

   ```
   INSERT INTO Vehicle
   << {
       'VIN' : '1N4AL11D75C109151',
       'Type' : 'Sedan',
       'Year' : 2011,
       'Make' : 'Audi',
       'Model' : 'A5',
       'Color' : 'Silver'
   },
   {
       'VIN' : 'KM8SRDHF6EU074761',
       'Type' : 'Sedan',
       'Year' : 2015,
       'Make' : 'Tesla',
       'Model' : 'Model S',
       'Color' : 'Blue'
   },
   {
       'VIN' : '3HGGK5G53FM761765',
       'Type' : 'Motorcycle',
       'Year' : 2011,
       'Make' : 'Ducati',
       'Model' : 'Monster 1200',
       'Color' : 'Yellow'
   },
   {
       'VIN' : '1HVBBAANXWH544237',
       'Type' : 'Semi',
       'Year' : 2009,
       'Make' : 'Ford',
       'Model' : 'F 150',
       'Color' : 'Black'
   },
   {
       'VIN' : '1C4RJFAG0FC625797',
       'Type' : 'Sedan',
       'Year' : 2019,
       'Make' : 'Mercedes',
       'Model' : 'CLK 350',
       'Color' : 'White'
   } >>
   ```

接下来，您可以使用 `SELECT` 语句从 `vehicle-registration` 分类账中的表中读取数据。继续执行[第 3 步：查询分类账中的表](getting-started-step-3.md)。

# 第 3 步：查询分类账中的表
<a name="getting-started-step-3"></a>

**重要**  
终止支持通知：现有客户将能够使用 Amazon QLDB，直到 2025 年 7 月 31 日终止支持。有关更多详细信息，请参阅[将亚马逊 QLDB 账本迁移到亚马逊 Aurora PostgreSQL](https://aws.amazon.com/blogs/database/migrate-an-amazon-qldb-ledger-to-amazon-aurora-postgresql/)。

在 Amazon QLDB 分类账中创建表格和加载数据后，您可运行查询以查看刚刚插入的车辆登记数据。QLDB 使用 PartiQL作为其查询语言，使用 Amazon Ion作为其面向文档的数据模型。

PartiQL 是开源、与 SQL 兼容的查询语言，现已扩展为可与 Ion 配合使用。使用 PartiQL，您可使用熟悉的 SQL 运算符插入、查询和管理数据。Amazon Ion 是 JSON 的超集。Ion 是基于文档的开源数据格式，可让您灵活地存储和处理结构化、半结构化和嵌套数据。

在此步骤中，您将使用 `SELECT` 语句从 `vehicle-registration`分类账中的表中读取数据。

**警告**  
当您在没有索引查找的情况下运行查询时，它会调用全表扫描。PartiQL 之所以支持此类查询，是因为其与 SQL 兼容。但是，*切勿*在 QLDB 中对生产用例运行表扫描。表扫描可能会导致大型表出现性能问题，包括并发冲突与事务超时。  
为避免表扫描，必须在索引字段或文档 ID 上使用*相等*运算符（`WHERE indexedField = 123`或`WHERE indexedField IN (456, 789)`）运行带有`WHERE`谓词子句的语句。有关更多信息，请参阅 [优化查询性能](working.optimize.md)。

**查询表格**

1. [在 /qldb 上打开亚马逊 QLDB 控制台。https://console.aws.amazon.com](https://console.aws.amazon.com/qldb)

1. 在导航窗格中，选择 **PartiQL 编辑器**。

1. 选择 `vehicle-registration` 分类账。

1. 在查询编辑器窗口中，输入以下语句在 `Vehicle` 表中查询您添加到分类账中的特定车辆识别码（VIN），然后选择** Run（运行）**。

   要运行语句，您可对 Windows 使用快捷键Ctrl\$1Enter，对 macOS 使用Cmd\$1Return。有关更多键盘快捷键的信息，请参阅 [PartiQL 编辑器键盘快捷键](console_QLDB.md#console_QLDB.partiql-editor-shortcuts)。

   ```
   SELECT * FROM Vehicle AS v
   WHERE v.VIN = '1N4AL11D75C109151'
   ```

1. 您也可编写内部联接查询。此查询示例连接 `Vehicle` 与 `VehicleRegistration`，并返回注册信息以及指定 `VIN` 的已注册车辆的属性。

   输入以下语句并选择**运行**。

   ```
   SELECT v.VIN, r.LicensePlateNumber, r.State, r.City, r.Owners
   FROM Vehicle AS v, VehicleRegistration AS r
   WHERE v.VIN = '1N4AL11D75C109151'
   AND v.VIN = r.VIN
   ```

   您也可以加入 `Person` 和 `DriversLicense` 表来查看与添加到分类账的驱动程序相关的属性。

   对以下每个步骤重复此步骤。

   ```
   SELECT * FROM Person AS p, DriversLicense AS l
   WHERE p.GovId = l.LicensePlateNumber
   ```

要了解如何修改 `vehicle-registration` 分类账表格中的文档，请参阅 [第 4 步：修改分类账中的文档](getting-started-step-4.md)。

# 第 4 步：修改分类账中的文档
<a name="getting-started-step-4"></a>

**重要**  
终止支持通知：现有客户将能够使用 Amazon QLDB，直到 2025 年 7 月 31 日终止支持。有关更多详细信息，请参阅[将亚马逊 QLDB 账本迁移到亚马逊 Aurora PostgreSQL](https://aws.amazon.com/blogs/database/migrate-an-amazon-qldb-ledger-to-amazon-aurora-postgresql/)。

现在您有了要处理的数据，可以开始在 Amazon QLDB 中对 `vehicle-registration` 分类账文档进行更改。例如，以带VIN `1N4AL11D75C109151` 的奥迪 A5 为例。这辆车最初属于华盛顿州西雅图的一位名叫 Raul Lewis 的司机。

假设 Raul 把车卖给了华盛顿州埃弗雷特的一位名叫 Brent Logan 的居民。然后，Brent和 Alexis Pena 决定结婚。Brent 想把 Alexis 列为第二车主。在此步骤中，以下数据操作语言（DML）语句演示了如何在分类账中进行适当的更改以反映这些事件。

**提示**  
最佳做法是使用系统分配的文档 `id` 作为外键。虽然您可以定义作为唯一标识符的字段（例如车辆的 VIN），但文档的真正唯一标识符是`id`。字段都包含在文档元数据中，您可以在*提交视图*（系统定义的表格视图）中对其进行查询。  
有关 QLDB 中的视图的更多信息，请参阅[核心概念](ledger-structure.md)。了解有关元数据的更多信息，请参阅 [查询文档元数据](working.metadata.md)。

**修改文档**

1. [在 /qldb 上打开亚马逊 QLDB 控制台。https://console.aws.amazon.com](https://console.aws.amazon.com/qldb)

1. 在导航窗格中，选择 **PartiQL 编辑器**。

1. 选择 `vehicle-registration` 分类账。
**注意**  
如果您使用控制台的自动**加载样本数据**功能设置分类账，请跳至步骤 6。

1. 如果您手动运行 `INSERT` 语句来加载示例数据，请继续执行这些步骤。

   要最初将 Raul 注册为这辆车的车主，首先要在 `Person`表中找到他由系统分配的文件 `id`。字段都包含在文档元数据中，您可以在*提交视图*（系统定义的表格视图）中对其进行查询。

   在查询编辑器窗口中输入以下语句，然后选择 **运行**。

   ```
   SELECT metadata.id FROM _ql_committed_Person AS p
   WHERE p.data.FirstName = 'Raul' and p.data.LastName = 'Lewis'
   ```

   前缀`_ql_committed_`是保留的前缀，表示您要查询的`Person` 表的已提交视图。在此视图中，您的数据嵌套至`data`字段中，元数据嵌套至`metadata`字段中。

1. 现在，在 `UPDATE` 语句中使用这个 `id` 来修改`VehicleRegistration`表中的相应文档。输入以下语句并选择**运行**。

   ```
   UPDATE VehicleRegistration AS r
   SET r.Owners.PrimaryOwner.PersonId = '294jJ3YUoH1IEEm8GSabOs' --replace with your id
   WHERE r.VIN = '1N4AL11D75C109151'
   ```

   发布此语句，确认您修改了 `Owners` 字段。

   ```
   SELECT r.Owners FROM VehicleRegistration AS r
   WHERE r.VIN = '1N4AL11D75C109151'
   ```

1. 要将车辆的所有权转让给埃弗里特市的 Brent，请先使用以下语句从 `Person` 表中找到他的 `id`。

   ```
   SELECT metadata.id FROM _ql_committed_Person AS p
   WHERE p.data.FirstName = 'Brent' and p.data.LastName = 'Logan'
   ```

   接下来，使用这个 `id` 来更新 `VehicleRegistration` 表中的 `PrimaryOwner` 和 `City`。

   ```
   UPDATE VehicleRegistration AS r
   SET r.Owners.PrimaryOwner.PersonId = '7NmE8YLPbXc0IqesJy1rpR', --replace with your id
       r.City = 'Everett'
   WHERE r.VIN = '1N4AL11D75C109151'
   ```

   发布此语句，确认您修改了 `PrimaryOwner` 和 `City` 字段。

   ```
   SELECT r.Owners.PrimaryOwner, r.City
   FROM VehicleRegistration AS r
   WHERE r.VIN = '1N4AL11D75C109151'
   ```

1. 要将 Alexis 添加为汽车的次要车主，请找到她的 `Person id`。

   ```
   SELECT metadata.id FROM _ql_committed_Person AS p
   WHERE p.data.FirstName = 'Alexis' and p.data.LastName = 'Pena'
   ```

   然后，使用以下 [FROM-INSERT](ql-reference.from.md) DML 语句将这个 `id` 插入到 `SecondaryOwners` 列表中。

   ```
   FROM VehicleRegistration AS r 
   WHERE r.VIN = '1N4AL11D75C109151'
   INSERT INTO r.Owners.SecondaryOwners
       VALUE { 'PersonId' : '5Ufgdlnj06gF5CWcOIu64s' } --replace with your id
   ```

   发布此语句，确认您修改了 `SecondaryOwners`。

   ```
   SELECT r.Owners.SecondaryOwners FROM VehicleRegistration AS r
   WHERE r.VIN = '1N4AL11D75C109151'
   ```

若要查看 `vehicle-registration` 分类账中的这些更改，请参阅[第 5 步：查看文档修订历史记录](getting-started-step-5.md)。

# 第 5 步：查看文档修订历史记录
<a name="getting-started-step-5"></a>

**重要**  
终止支持通知：现有客户将能够使用 Amazon QLDB，直到 2025 年 7 月 31 日终止支持。有关更多详细信息，请参阅[将亚马逊 QLDB 账本迁移到亚马逊 Aurora PostgreSQL](https://aws.amazon.com/blogs/database/migrate-an-amazon-qldb-ledger-to-amazon-aurora-postgresql/)。

在上一步中修改车辆 VIN ` 1N4AL11D75C109151` 注册数据后，您可查询其所有注册车主的历史记录以及任何其他更新的字段。通过查询内置的 [历史记录函数](working.history.md#working.history.function)，您可以查看之前在中插入、更新和删除的车辆登记文件的所有三个修订版。

历史函数从表的*已提交视图*返回修订，其中包括应用程序数据和相关元数据。元数据准确显示了每次修订的时间、顺序以及提交修订的事务。

在此步骤中，您将在`vehicle-registration`分类账的`VehicleRegistration`表格中查询文档的修订历史记录。

**若要查看修订历史记录**

1. [在 /qldb 上打开亚马逊 QLDB 控制台。https://console.aws.amazon.com](https://console.aws.amazon.com/qldb)

1. 在导航窗格中，选择 **PartiQL 编辑器**。

1. 选择 `vehicle-registration` 分类账。

1. 要查询文档的历史记录，首先要找到其唯一的 `id`。除了查询已提交的视图外，获取文档 `id` 的另一种方法是在表格的默认用户视图中使用 `BY` 关键字。要了解更多信息，请参阅 [通过 BY 子句查询文档 ID](working.metadata.by-clause.md)。

   在查询编辑器窗口中输入以下语句，然后选择 **运行**。

   ```
   SELECT r_id FROM VehicleRegistration AS r BY r_id
   WHERE r.VIN = '1N4AL11D75C109151'
   ```

1. 接下来，您可以使用此 `id` 值来查询历史记录函数。输入以下语句并选择**运行**。确保将这些 `id` 值替换为自己文档 ID 的适当值。

   ```
   SELECT h.data.VIN, h.data.City, h.data.Owners
   FROM history(VehicleRegistration) AS h
   WHERE h.metadata.id = 'ADR2LQq48kB9neZDupQrMm' --replace with your id
   ```
**注意**  
在本教程中，此历史查询将返回文档 ID `ADR2LQq48kB9neZDupQrMm` 的所有修订版本。最佳做法是，使用日期范围（开始时间和结束时间）和文档 ID 来限定历史查询。  
QLDB 中的每个 `SELECT` 查询都是在事务中处理的，并且受[事务超时限制](limits.md#limits.fixed)的约束。包含开始时间和结束时间的历史记录查询将从日期范围限定中获得便利。有关更多信息，请参阅 [历史记录函数](working.history.md#working.history.function)。

   历史函数以与提交视图相同的模式返回文档。此示例投射您修改后的车辆登记数据。 输出应类似于以下内容。  
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/qldb/latest/developerguide/getting-started-step-5.html)
**注意**  
历史查询可能并不总是按顺序返回文档修订版。

   查看输出并确认更改是否反映了您在 [第 4 步：修改分类账中的文档](getting-started-step-4.md) 中所做的事情。

1. 然后，您可以检查每个修订版的文档元数据。输入以下语句并选择**运行**。同样，请务必根据需要将 `id` 值替换为您自己的证件 ID。

   ```
   SELECT VALUE h.metadata
   FROM history(VehicleRegistration) AS h
   WHERE h.metadata.id = 'ADR2LQq48kB9neZDupQrMm' --replace with your id
   ```

    输出应类似于以下内容。  
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/qldb/latest/developerguide/getting-started-step-5.html)

   这些元数据字段提供了有关每项何时修改以及由哪个事务修改的详细信息。从这些数据中，您可看到以下内容：
   + 该文档由系统分配的`id`唯一标识：`ADR2LQq48kB9neZDupQrMm`。这是以 Base62 编码的字符串表示的通用唯一识别码（UUID）。
   + `txTime` 显示文档的初始修订版（版本`0`）是在 `2019-05-23T19:20:360d-3Z` 创建的。
   + 每个后续事务会创建包含相同文档 `id` 和递增版本号的新修订版，以及更新的 `txId`和 `txTime`。

要以加密方式验证 `vehicle-registration` 分类账中的文档修订版，请继续[第 6 步：验证分类账中的文档](getting-started-step-6.md)。

# 第 6 步：验证分类账中的文档
<a name="getting-started-step-6"></a>

**重要**  
终止支持通知：现有客户将能够使用 Amazon QLDB，直到 2025 年 7 月 31 日终止支持。有关更多详细信息，请参阅[将亚马逊 QLDB 账本迁移到亚马逊 Aurora PostgreSQL](https://aws.amazon.com/blogs/database/migrate-an-amazon-qldb-ledger-to-amazon-aurora-postgresql/)。

借助 Amazon QLDB，您可在 SHA-256 中使用加密哈希，从而有效地验证分类账日记账中文档的完整性。在此示例中，Alexis 和 Brent 决定通过在汽车经销商处用 VIN `1N4AL11D75C109151` 交换车辆来升级到一款新车型。经销商通过向登记处核实车辆的所有权来开始这一流程。

要详细了解验证和加密哈希在 QLDB 中的工作原理，请参阅 [Amazon QLDB 中的数据验证](verification.md)。

在此步骤中，您将验证 `vehicle-registration` 分类账中的文档修订版本。首先，您请求一份摘要，该摘要作为输出文件返回，并作为分类账整个变更历史记录的签名。然后，您要求提供与此摘要相关的修订证明。使用此证明，如果所有验证检查都可通过，可以验证修订版的完整性。

## 请求摘要
<a name="getting-started-step-6.digest"></a>

1. [在 /qldb 上打开亚马逊 QLDB 控制台。https://console.aws.amazon.com](https://console.aws.amazon.com/qldb)

1. 在导航窗格中，选择**分类账**。

1. 在分类账列表中，选择 `vehicle-registration`。

1. 选择“**获取摘要**”。**获取摘要**对话框显示以下摘要详细信息：
   + **摘要** - 您请求的摘要的 SHA-256 哈希值。
   + **摘要提示地址** - 您请求的摘要所涵盖的日记中的最新[块](verification.md#verification.structure)位置。地址包含以下两个字段：
     + `strandId` — 包含数据块的日记账链的唯一 ID。
     + `sequenceNo` — 一个索引号，用于指定数据块在链中的位置。
   + **分类账** - 您请求摘要的分类账名称。
   + **日期** - 您请求摘要时的时间戳。

1. 检查摘要信息。然后选择 **Save**（保存）。您可以保留默认文件名，或输入新名称。

   此步骤将保存一个内容为 [Amazon Ion](ion.md) 格式的纯文本文件。该文件的文件扩展名为 `.ion.txt`，包含前面对话框中列出的所有摘要信息。以下是摘要内容的示例。字段的顺序可能因您的浏览器而异。

   ```
   {
     "digest": "42zaJOfV8iGutVGNaIuzQWhD5Xb/5B9lScHnvxPXm9E=",
     "digestTipAddress": "{strandId:\"BlFTjlSXze9BIh1KOszcE3\",sequenceNo:73}",
     "ledger": "vehicle-registration",
     "date": "2019-04-17T16:57:26.749Z"
   }
   ```

1. 将此文件保存在以后可以访问的某个位置。在以下步骤中，您将使用此文件来验证文档修订版。

保存分类账摘要后，您可以开始根据该摘要验证文档修订的过程。

**注意**  
在用于验证的生产用例中，您可以使用先前保存的摘要，而不是连续执行这两个任务。最佳做法是，在日记账中写入要稍后验证的修订版本后，立即请求并保存摘要。

## 验证文档的修订版
<a name="getting-started-step-6.verify"></a>

1. 首先，在分类账中查询要验证的文档修订版本的 `id`和 `blockAddress`。字段都包含在文档元数据中，您可以在提交视图中对其进行查询。

   文档 `id` 是系统分配的唯一 ID 字符串。`blockAddress` 是一种 Ion 结构，用于指定提交修订版本的块位置。

   在 QLDB 控制台的导航窗格中，选择 **PartiQL 编辑器**。

1. 选择 `vehicle-registration` 分类账。

1. 在查询编辑器窗口中输入以下语句，然后选择 **运行**。

   ```
   SELECT r.metadata.id, r.blockAddress
   FROM _ql_committed_VehicleRegistration AS r 
   WHERE r.data.VIN = '1N4AL11D75C109151'
   ```

1. 复制并保存查询返回的 `id` 和 `blockAddress` 值。请务必省略 `id` 字段的双引号。在 Amazon Ion 中，字符串数据类型用双引号分隔。

1. 您已经选择了文档修订版，现在可以开始对其进行验证。

   在导航窗格中选择**验证**。

1. 在“**验证文档**”表单中，在**“指定要验证的文档”**下，输入以下输入参数：
   + **分类账** - 选择 `vehicle-registration`。
   + **块地址** - 您在步骤 3 中查询返回的`blockAddress`值。
   + **文档 ID** - 您在步骤 3 中查询返回的 `id` 值。

1. 在 “**指定要验证的摘要**” 下，通过选择 “**选择摘要**”，选择之前保存的摘要。如果文件有效，则会自动填充控制台上的所有摘要字段。或者，您可以直接从摘要文件中手动复制和粘贴以下值：
   + **摘要** - 摘要文件中的 `digest` 值。
   + **摘要提示地址** - 摘要文件中的 `digestTipAddress` 值。

1. 查看您的文档和摘要输入参数，然后选择**Verify（验证）**。

   控制台为您自动执行两个步骤：

   1. 向 QLDB 请求指定文档的证明。

   1. 使用 QLDB 返回的证明来调用客户端 API，该API会根据提供的摘要验证您的文档修订版本。

   控制台在**验证结果**卡中显示您的请求结果。有关更多信息，请参阅 [验证结果](verification.results.md)。

1. 要测试验证逻辑，请重复“**验证文档修订版**” 下的步骤 6—8，但要更改**摘要**输入字符串中的单个字符。这应该会导致您的**验证**请求失败，并显示相应的错误消息。

如果您不再需要使用`vehicle-registration`分类账，请继续[步骤 7（可选）：清除资源](getting-started-step-7.md)。

# 步骤 7（可选）：清除资源
<a name="getting-started-step-7"></a>

**重要**  
终止支持通知：现有客户将能够使用 Amazon QLDB，直到 2025 年 7 月 31 日终止支持。有关更多详细信息，请参阅[将亚马逊 QLDB 账本迁移到亚马逊 Aurora PostgreSQL](https://aws.amazon.com/blogs/database/migrate-an-amazon-qldb-ledger-to-amazon-aurora-postgresql/)。

您可以继续使用 `vehicle-registration` 分类账。但是，如果您不再需要，请将其删除。

如果您的账本启用了删除保护，则必须先将其禁用，然后才能使用 QLDB API AWS Command Line Interface 、AWS CLI() 或 QLDB 控制台删除账本。

**删除分类账**

1. [在 /qldb 上打开亚马逊 QLDB 控制台。https://console.aws.amazon.com](https://console.aws.amazon.com/qldb)

1. 在导航窗格中，选择**分类账**。

1. 如果启用了分类账删除保护，则必须先禁用它。

   在分类账列表中，选择 `vehicle-registration`，然后选择**编辑分类账**。

1. 在**编辑分类账**页面上，关闭**删除保护**，然后选择**确认更改**。

1. 在分类账列表中，再次选择 `vehicle-registration`，然后选择**删除**。

1. 通过在提供的字段中输入 **delete vehicle-registration** 来确认这一点。

要了解有关在 QLDB 中使用分类账的更多信息，请参阅 [Amazon QLDB 入门：后续步骤](getting-started-next-steps.md)。

# Amazon QLDB 入门：后续步骤
<a name="getting-started-next-steps"></a>

**重要**  
终止支持通知：现有客户将能够使用 Amazon QLDB，直到 2025 年 7 月 31 日终止支持。有关更多详细信息，请参阅[将亚马逊 QLDB 账本迁移到亚马逊 Aurora PostgreSQL](https://aws.amazon.com/blogs/database/migrate-an-amazon-qldb-ledger-to-amazon-aurora-postgresql/)。

有关使用 Amazon QLDB 的更多信息，请参见以下主题：
+ [在 Amazon QLDB 中处理数据与历史记录](working-with-data.md)
+ [Amazon QLDB 驱动程序入门](getting-started-driver.md)
+ [Amazon QLDB 并发模型](concurrency.md)
+ [从Amazon QLDB 导出日记账数据](export-journal.md)
+ [Amazon QLDB 流式传输日记账数据](streams.md)
+ [Amazon QLDB 中的数据验证](verification.md)
+ [Amazon QLDB PartiQL 参考](ql-reference.md)