

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

# 什么是 Amazon QLDB？
<a name="what-is"></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 Quantum Ledger Database（Amazon QLDB）是一个完全托管的分类账数据库，提供了一个透明、不可变、可通过加密方式验证的事务日志，且该事务日志由一家可信的中央机构拥有。您可以使用 Amazon QLDB 来跟踪所有应用程序数据更改，并不断维护完整且可验证的更改历史记录。要详细了解 Amazon Web Services 上提供的各种数据库选项，请参阅[为 AWS上的组织选择合适的数据库](https://aws.amazon.com/getting-started/decision-guides/databases-on-aws-how-to-choose/)。

分类账通常用于记录组织中的经济和金融活动历史记录。许多组织构建具有类似分类账功能的应用程序，因为他们希望维护应用程序数据的准确历史记录。例如，他们可能想要跟踪银行事务中的贷方和借方历史记录，验证保险索赔的数据谱系，或跟踪供应链网络中项目的移动。分类帐应用程序通常通过在关系数据库中创建的自定义审计表或审计跟踪记录来实现。

Amazon QLDB 是一种全新的数据库，您无需参与构建类似分类账的应用程序的复杂开发工作。使用 QLDB，您的数据更改历史是无法更改的，无法在原地覆盖或更改。而且，您可通过加密技术，以验证应用程序的数据是否没有发生意外更改。QLDB 使用不可改变的事务日志，即*日记账*。该日记账仅限追加，由一组有序和哈希链的*数据块*组成，其中包含您提交的数据。

## Amazon QLDB 视频
<a name="what-is.video"></a>

以下视频概述了 Amazon QLDB，并说明了其如何使您受益。

[![AWS Videos](http://img.youtube.com/vi/https://www.youtube.com/embed/jcZ_rsLJrqk/0.jpg)](http://www.youtube.com/watch?v=https://www.youtube.com/embed/jcZ_rsLJrqk)


## Amazon QLDB 定价
<a name="what-is.pricing"></a>

使用 Amazon QLDB，您只需按使用量付费，没有最低费用或强制使用服务。您只需为您的分类账数据库使用的资源支付费用即可，无需提前进行预配置。

有关更多信息，请参阅 [Amazon QLDB 定价](https://aws.amazon.com/qldb/pricing/)。

## QLDB 入门
<a name="what-is.get-started"></a>

我们建议您首先阅读以下主题：
+ **[Amazon QLDB 概览](what-is.overview.md)** — 了解 QLDB 的高级概述。
+ **[Amazon QLDB 中的核心概念和术语](ledger-structure.md)** — 学习 QLDB 的基本概念和术语。
+ **[访问 Amazon QLDB](accessing.md)**— 了解如何使用 AWS 管理控制台、API 或 () 访问 QLDB。 AWS Command Line Interface AWS CLI
+ **[Amazon MQ 如何与 IAM 协同工作](security_iam_service-with-iam.md)**— 学习如何 AWS Identity and Access Management 使用 (IAM) 控制对 QLDB 的访问权限。

要快速开始使用 QLDB 控制台，请参阅[Amazon QLDB 控制台入门](getting-started.md)。

要了解如何使用提供的驱动程序使用 QLDB 进行开发 AWS ，请参阅。[Amazon QLDB 驱动程序入门](getting-started-driver.md)

# Amazon QLDB 概览
<a name="what-is.overview"></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 服务组件及其交互方式。

**Topics**
+ [

## 日记账优先
](#what-is.overview.journal)
+ [

## 不可变的
](#what-is.overview.immutable)
+ [

## 可通过密码验证
](#what-is.overview.verifiable)
+ [

## 类似 SQL、且文档灵活
](#what-is.overview.sql-like)
+ [

## 开源开发人员工具
](#what-is.overview.open-source)
+ [

## 无服务器且高度可用
](#what-is.overview.scalable)
+ [

## 企业级
](#what-is.overview.enterprise)

## 日记账优先
<a name="what-is.overview.journal"></a>

在传统的数据库架构中，通常将数据写入表中作为事务的一部分。事务日志 —（通常是内部实现）记录了所有事务及其对数据库所做的修改。事务日志是数据库的重要组成部分。在发生系统故障、灾难恢复或者数据复制时，您需要使用日志来重播事务。但是，数据库事务日志并非一成不变，也不是为用户提供直接、便捷的访问而设计的。

在 Amazon QLDB 中，日记账是数据库的核心。此日记账在结构上与事务日志类似，是一种不可变的、仅限附加的数据结构，用于存储您的应用程序数据以及相关的元数据。所有写入事务（包含更新和删除）都将首先提交到日记账中。

QLDB 使用日记账确定分类账数据的当前状态，方法是将其具体化为可查询的、用户定义的表格。这些表格还提供了所有事务数据（包含文档修订版和元数据）的可访问历史记录。此外，该日记账还处理分类账数据的并发性、排序、加密验证和可用性。

下图所示为 QLDB 日记账体系结构。

![\[标题为 QLDB 的示意图：日记账是数据库，显示了日记账架构，其应用程序连接到分类账并将事务提交到日记账，这些事务被具体化为表格。\]](http://docs.aws.amazon.com/zh_cn/qldb/latest/developerguide/images/journal-first.png)

+ 在此示例中，应用程序连接到分类账并运行在名为`cars`的表中插入、更新和删除文档的事务。
+ 数据首先按顺序写入日记账。
+ 然后，使用内置视图将数据具体化至表中。您可通过这些视图查询汽车的当前状态和完整历史记录，并为每个版本分配一个版本号。
+ 您也可直接从日记中导出或流式传输数据。

## 不可变的
<a name="what-is.overview.immutable"></a>

由于 QLDB 日记账仅限追加，因此它会完整记录所有无法修改或者覆盖的数据更改。没有 APIs 其他方法可以更改任何已提交的数据。这种日记账结构允许您访问和查询分类账完整历史记录。

**注意**  
*QLDB 支持不可变性的唯一例外是数据编修。*使用此功能，您可以遵守监管法规，例如欧盟的《通用数据保护条例》（GDPR）与《加州消费者隐私法》（CCPA）。  
QLDB 还支持数据编修操作，允许您永久删除表历史记录中的非活动文档的修订内容。密文操作仅删除指定修订版中的用户数据，而日记账序列和文档元数据则保持不变。这样可保持分类账的整体数据完整性。有关更多信息，请参阅 [对文档修订版执行编校](working.redaction.md)。

QLDB 在事务中向日记账中写入一个数据块。每个块都包含代表您插入、更新和删除的文档修订版本的条目对象，以及提交这些修订的语句。这些数据块是按顺序排列以及哈希链的，以保证数据的完整性。

下面的示意图阐明了此日记账结构。

![\[标题为记录的图表无法更改，它显示了 QLDB 中不可变的、仅限附加的日记结构，以及每个哈希链式日记账数据块的序号。\]](http://docs.aws.amazon.com/zh_cn/qldb/latest/developerguide/images/immutable.png)


该图显示，事务以数据块的形式提交到日记账中，这些数据块被哈希链连接以供验证。每个数据块都有一个序列号来指定其地址。

## 可通过密码验证
<a name="what-is.overview.verifiable"></a>

日记账数据块通过加密哈希技术进行排序并链接在一起，类似于数据块链。QLDB 使用日记账哈希链，通过加密验证方法提供事务数据的完整性。使用*摘要*（代表日记账截至某个时间点的完整哈希链的哈希值）和*默克尔审计证明*（一种证明二叉哈希树中任何节点有效性的机制），您可以验证您的数据在任何时候都没有发生意想不到的变化。

下图显示了涵盖日记账在某个时间点的完整哈希链的摘要。

![\[标题为使用 SHA-256 进行哈希链的示意图，显示了涵盖日记账完整哈希链的摘要，其日记账数据块结构包含表示 Ion 文档、PartiQL 语句和元数据的条目。\]](http://docs.aws.amazon.com/zh_cn/qldb/latest/developerguide/images/verifiable.png)


在此图中，使用 SHA-256 加密哈希函数对日记账数据块进行哈希处理，并按顺序链接到后续块。每个数据块都包含包含您的数据文档、元数据和事务中运行的 PartiQL 语句的条目。

有关更多信息，请参阅 [Amazon QLDB 中的数据验证](verification.md)。

## 类似 SQL、且文档灵活
<a name="what-is.overview.sql-like"></a>

QLDB 使用 PartiQL 作为其查询语言，使用 Amazon Ion 作为其面向文档的数据模型。PartiQL 是开源、与 SQL 兼容的查询语言，现已扩展为可与 Ion 配合使用。使用 PartiQL，您可使用熟悉的 SQL 运算符插入、查询和管理数据。查询平面文档时，语法与使用 SQL 查询的关系表相同。要了解有关 PartiQL 的 QLDB 实现的更多信息，请参阅[Amazon QLDB PartiQL 参考](ql-reference.md)。

Amazon Ion 是 JSON 的超集。Ion 是基于文档的开源数据格式，可让您灵活地存储和处理结构化、半结构化和嵌套数据。要了解有关 QLDB 中 Ion 的更多信息，请参阅 [Amazon QLDB 中的 Amazon Ion 数据格式参考](ion.md)。

有关传统关系数据库与 QLDB 中核心组件和功能的高级比较，请参阅[从关系至分类账](what-is.relational-ledger.md)。

## 开源开发人员工具
<a name="what-is.overview.open-source"></a>

为了简化应用程序开发，QLDB 提供了各类编程语言的开源驱动程序。您可使用这些驱动程序通过在分类账上运行 PartiQL 语句，并处理这些语句的结果来与事务数据 API 进行交互。有关当前支持的驱动程序语言的信息和教程，请参阅 [Amazon QLDB 驱动程序入门](getting-started-driver.md)。

Amazon Ion 还提供可为您处理 Ion 数据客户端库。有关处理 Ion 数据的开发者指南和代码示例，请参阅上的 [Amazon Ion 文档](http://amzn.github.io/ion-docs/) GitHub。

## 无服务器且高度可用
<a name="what-is.overview.scalable"></a>

QLDB 完全托管、无服务器、且高度可用。该服务会自动扩展，以支持您的应用程序需求，您无需预配置实例或容量。您的数据的多个副本将在 AWS 区域中的可用区内复制，并在中的可用区之间复制。

## 企业级
<a name="what-is.overview.enterprise"></a>

QLDB 事务完全符合原子性、一致性、隔离性与持久性（ACID）属性。QLDB 使用乐观并发控制（OCC），事务以完全序列化性运行，即最高级别的隔离。这意味着不存在出现幻像读取、脏读、写入偏差或者其他类似并发问题的风险。有关更多信息，请参阅 [Amazon QLDB 并发模型](concurrency.md)。

# 从关系至分类账
<a name="what-is.relational-ledger"></a>

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

如果您是应用程序开发人员，则可能在使用关系数据库管理系统（RDBMS）和结构化查询语言（SQL）方面有一些经验。在您开始使用 Amazon QLDB，您既会遇到许多相似之处，也会遇到许多相似之处。随着您进入更高级的话题，您还将遇到 QLDB 在 RDBMS 基础上构建的强大新功能。本节介绍常见数据库组件和操作，并与其 QLDB 中的等效操作进行比较和对比。

下图介绍传统 RDBMS 和 Amazon QLDB 之间核心组件的映射结构。

![\[传统 RDBMS 的核心组件（数据库、表、索引、行、列等）映射到相应的 QLDB 组件（分类账、表、索引、Ion 文档、文档属性等）的示意图。\]](http://docs.aws.amazon.com/zh_cn/qldb/latest/developerguide/images/rdbms-mapping.png)


下表介绍了传统 RDBMS 和 QLDB 之间内置操作功能的主要高级相似之处和不同之处。


****  

| 操作 | RDBMS | QLDB | 
| --- | --- | --- | 
| 创建表 | 定义所有列名和数据类型的CREATE TABLE 语句 | 未定义任何表属性或数据类型以允许无架构和开放内容的CREATE TABLE 语句 | 
| 创建索引 | CREATE INDEX statement | 表中任何顶级字段的CREATE INDEX 语句 | 
| 插入数据 | INSERT 语句，它指定新行或元组中的值，该行或元组符合表所定义的架构 | INSERT 语句，以任何有效的 Amazon Ion 格式指定新文档中的值，无论表格中是否存在现有文档 | 
| 查询数据 | SELECT-FROM-WHERE statement | 查询平面文档时语法与 SQL 相同语法的SELECT-FROM-WHERE语句 | 
| 更新数据 | UPDATE-SET-WHERE statement | UPDATE-SET-WHERE 更新平面文档时语法与 SQL 相同语法的语句 | 
| 删除数据 | DELETE-FROM-WHERE statement | DELETE-FROM-WHERE 删除平面文档时语法与 SQL 相同语法的语句 | 
| 嵌套与半结构化数据 | 仅限扁平行或者元组 | 可以纳入 Amazon Ion 数据格式和 PartiQL 查询语言支持的任何结构化、半结构化或嵌套数据的文档 | 
| 查询元数据 | 无内置元数据 | 从表的内置已提交视图中查询的SELECT语句 | 
| 查询修订历史记录 | 无内置数据历史记录 | 从内置历史函数进行查询的SELECT语句 | 
| 加密验证 | 没有内置密码学或不可变性 | APIs 返回期刊摘要和证据，以验证与该摘要相关的任何文档修订版的完整性 | 

有关 QLDB 中的核心概念和术语的概述，请参阅 [核心概念](ledger-structure.md)。

有关在分类账中创建、查询和管理数据的过程的详细信息，请参阅 [处理数据与历史记录](working-with-data.md)。

# Amazon QLDB 中的核心概念和术语
<a name="ledger-structure"></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 与其他面向文档的数据库的不同之处在于以下关键概念。

**Topics**
+ [

## QLDB 数据对象模型
](#ledger-structure.concepts)
+ [

## 日记账账优先事务
](#ledger-structure.transactions)
+ [

## 查询数据
](#ledger-structure.querying)
+ [

## 数据存储
](#ledger-structure.storage)
+ [

## QLDB API 模型
](#ledger-structure.api)
+ [

## 后续步骤
](#ledger-structure.next-steps)

## QLDB 数据对象模型
<a name="ledger-structure.concepts"></a>

Amazon QLDB 中的基础数据对象模型说明如下：

1. **分类账**

   您的第一步是创建*账本*，这是 QLDB 中的主要 AWS 资源类型。要了解如何创建分类账，请参阅*控制台入门*中的[第 1 步：创建新分类账](getting-started-step-1.md)或[Amazon QLDB 分类账的基本操作](ledger-management.basics.md)。

   对于账本的`ALLOW_ALL`和`STANDARD`权限模式，您可以创建 AWS Identity and Access Management (IAM) 策略，以授予在此账本资源上运行 API 操作的权限。

   分类账 ARN 格式：

   ```
   arn:aws:qldb:${region}:${account-id}:ledger/${ledger-name}
   ```

1. **日记账账和表格**

   要开始在 QLDB 分类账中写入数据，首先要创建一个包含基本[CREATE TABLE](ql-reference.create-table.md)语句的*表格*。分类账数据由提交至分类账*日记账*文档的修订版组成。您可以在用户定义表格的上下文中将文档修订提交至分类账。在 QLDB 中，表格表示日记账中文档修订集合的实体化视图。

   在分类账的 `STANDARD` 权限模式下，您必须创建 IAM policy 来授予在此表资源上运行 PartiQL 语句的权限。凭借对表资源的权限，您可以运行访问表当前状态的语句。您也可以使用内置 `history()` 函数查询表的修订历史记录。

   表格 ARN 格式：

   ```
   arn:aws:qldb:${region}:${account-id}:ledger/${ledger-name}/table/${table-id}
   ```

   有关向分类账及其关联资源授予权限的更多信息，请参阅 [Amazon MQ 如何与 IAM 协同工作](security_iam_service-with-iam.md)。

1. **Documents**

   表由的修订版[QLDB 文档](ql-reference.docs.md)组成，这些版本是 [Amazon Ion](ion.md) `struct` 格式的数据集。*文档修订版*表示由唯一文档 ID 标识的一系列文档的单一版本。

   QLDB 存储您所提交文档的完整更改历史记录。表格允许您查询其文档的当前状态，而该 `history()` 函数允许您查询表格文档的整个修订历史记录。有关查询和编写修订版的详细信息，请参阅 [处理数据与历史记录](working-with-data.md)。

1. **系统目录**

   每个分类账还提供系统定义的*目录*资源，您可通过查询该资源列出分类账中的所有表和索引。在分类账的 `STANDARD` 权限模式下，您需要拥有该目录资源的 `qldb:PartiQLSelect` 权限才能执行以下操作：
   + 在系统目录表 [information\$1schema.user\$1tables](working.catalog.md)上运行`SELECT`语句。
   + 在 [QLDB 控制台](console_QLDB.md)的分类账详情页面上查看表格和索引信息。
   + 在 QLDB 控制台的 *PartiQL 编辑器*中查看表和索引列表。

   目录 ARN 格式：

   ```
   arn:aws:qldb:${region}:${account-id}:ledger/${ledger-name}/information_schema/user_tables
   ```

## 日记账账优先事务
<a name="ledger-structure.transactions"></a>

当应用程序在 QLDB 分类账中读取或写入数据时，它是在数据库事务中读取或写入数据的。所有事务均受[Amazon QLDB 资源中的限额和限制](limits.md#limits.fixed)中定义的限制。在事务中，QLDB 执行以下步骤：

1. 分类账读取数据的当前状态。

1. 执行事务中提供的语句，然后使用[乐观并发控制（OCC）](concurrency.md)检查其是否存在任何冲突，以确保完全可序列化的隔离。

1. 如果未发现 OCC 冲突，则按如下方式返回事务结果：
   + 对于读取，返回结果集并以仅附加 `SELECT` 的方式将语句提交至日记账中。
   + 对于写入，请以仅限追加的方式将任何更新、删除或新插入的数据提交到日记账中。

该*日记账*代表了关于所有日记账更改的、完整且不可变的历史记录。QLDB 在事务中向日记账中写入一个链式*数据块*。每个块都包含代表您插入、更新和删除的文档修订版本的*条目*对象，以及提交这些修订的 [PartiQL](ql-reference.md) 语句。

下面的示意图阐明了此日记账结构。

![\[Amazon QLDB 日记账结构图显示了一组构成一条链的数据块，以及每个数据块的序列号和数据块哈希。\]](http://docs.aws.amazon.com/zh_cn/qldb/latest/developerguide/images/verification/journal-structure.png)


该图显示事务作为包含文档修订条目的数据块提交到日记账账中。[每个数据块都经过哈希处理，并链接到后续数据块进行验证。](verification.md)每个数据块都有一个序列号，用于指定其在链中的地址。

**注意**  
在 Amazon QLDB 中，分支是分类账日记账账的分区。QLDB 目前仅支持单链日记账。

有关数据块的内容的更多信息，请参阅 [Amazon QLDB 中的日记账内容](journal-contents.md)。

## 查询数据
<a name="ledger-structure.querying"></a>

QLDB 旨在满足高性能联机事务处理（OLTP）的工作负载需求。分类账根据提交至日记账账的事务信息，提供数据的可查询表格视图。QLDB 中的表格*视图*是表中数据的子集。视图采用实时维护，因此它们始终可供应用程序查询。

您可以使用 PartiQL `SELECT` 语句查询以下系统定义的视图：
+ *用户* - 仅包含您在表中写入的数据的最新有效版本（即用户数据的当前状态）。这是 QLDB 中的默认视图。
+ *已提交* – T您的用户数据和系统生成的元数据的最新有效版本。这是与您用户表直接对应的完整系统定义表。

除了这些可查询视图外，您还可以使用内置[历史记录函数](working.history.md#working.history.function)查询数据的修订历史记录。历史函数在与已*提交视图*相同的架构中返回您的用户数据和关联的元数据。

## 数据存储
<a name="ledger-structure.storage"></a>

QLDB 包含两种类型的数据存储：
+ *日记账存储* - 分类账日记账账使用的磁盘空间。该日记账仅限附录，包含所有数据更改的完整、不可变且可验证历史记录。
+ *索引存储* - 分类账表、索引和索引历史记录使用的磁盘空间。索引存储包含的分类账数据针对高性能查询进行了优化。

将数据提交至日记账账后，它会具体化至您定义的表中。这些表经过优化，可实现更快、更高效查询。当应用程序使用事务数据 API 读取数据时，它会访问存储在索引存储中的表格和索引。

## QLDB API 模型
<a name="ledger-structure.api"></a>

QLDB 提供了两种类型的应用程序代码可以 APIs 与之交互：
+ *Amazon QLDB* — QLDB 资源管理 API（也称为*控制面板*）。此 API 仅用于管理分类账资源和非事务数据操作。您可以使用这些操作创建、删除、描述、列出和更新分类账。您还可以通过加密方式验证日记账数据，并导出或流式传输日记账块。
+ *Amazon QLDB 会话 *— QLDB 事务数据 API。您可以使用此 API 在带有[ PartiQL ](ql-reference.md)语句的分类账上运行数据事务。
**重要**  
我们建议使用 QLDB 驱动程序或 QLDB Shell 在分类账上运行数据交易，而不是直接与* QLDB 会话* API 交互。  
如果您使用的是 AWS 软件开发工具包，请使用 QLDB 驱动程序。该驱动程序在 *QLDB 会话*数据 API 之上提供了一个高级抽象层，并为您管理`SendCommand`操作。有关信息和支持的编程语言列表，请参阅 [驱动程序入门](getting-started-driver.md)。
如果您正在使用 AWS CLI，请使用 QLDB 外壳。Shell 是一个命令行接口，它使用 QLDB 驱动程序与分类账进行交互。有关信息，请参阅[使用 Amazon QLDB Shell（仅限数据 API）](data-shell.md)。

有关这些 API 操作的更多信息，请参阅 [Amazon QLDB API 参考](api-reference.md)。

## 后续步骤
<a name="ledger-structure.next-steps"></a>

要了解如何使用分类账处理数据，请参阅 [在 Amazon QLDB 中处理数据与历史记录](working-with-data.md) 并遵循描述创建表、插入数据和运行基本查询过程的示例。本指南使用示例数据和查询示例作为上下文，详细说明这些概念的运行方式。

要使用 QLDB 控制台快速开始使用示例应用程序教程，请参阅[Amazon QLDB 控制台入门](getting-started.md)。

有关本节中描述的关键术语和定义的列表，请参阅 [Amazon QLDB 词汇表](qldb-glossary.md)。

# Amazon QLDB 中的日记账内容
<a name="journal-contents"></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 在事务中向日记账中写入一个链式数据块。

本节介绍了包含样本数据的日记账数据块的示例，并描述了数据块的内容。

**Topics**
+ [

## 数据块示例
](#journal.block-example)
+ [

## 数据块内容
](#journal.block-contents)
+ [

## 已编校的修订版
](#journal.redacted-revisions)
+ [

## 示例应用程序
](#journal.sample)
+ [

## 另请参阅
](#journal.see-also)

## 数据块示例
<a name="journal.block-example"></a>

日记账数据块包含事务元数据、以及代表事务中提交的文档修订版本条目、和提交这些修订的 [PartiQL](ql-reference.md) 语句。

以下是包含示例数据的数据块示例。

**注意**  
数据块示例仅用于参考。显示的哈希值并非实际计算的哈希值。

```
{
  blockAddress:{
    strandId:"4o5UuzWSW5PIoOGm5jPA6J",
    sequenceNo:25
  },
  transactionId:"3gtB8Q8dfIMA8lQ5pzHAMo",
  blockTimestamp:2022-06-08T18:46:46.512Z,
  blockHash:{{QS5lJt8vRxT30L9OGL5oU1pxFTe+UlEwakYBCrvGQ4A=}},
  entriesHash:{{buYYc5kV4rrRtJAsrIQnfnhgkzfQ8BKjI0C2vFnYQEw=}},
  previousBlockHash:{{I1UKRIWUgkM1X6042kcoZ/eN1rn0uxhDTc08zw9kZ5I=}},
  entriesHashList:[
    {{BUCXP6oYgmug2AfPZcAZup2lKolJNTbTuV5RA1VaFpo=}},
    {{cTIRkjuULzp/4KaUEsb/S7+TG8FvpFiZHT4tEJGcANc=}},
    {{3aktJSMyJ3C5StZv4WIJLu/w3D8mGtduZvP0ldKUaUM=}},
    {{GPKIJ1+o8mMZmPj/35ZQXoca2z64MVYMCwqs/g080IM=}}
  ],
  transactionInfo:{
    statements:[
      {
        statement:"INSERT INTO VehicleRegistration VALUE ?",
        startTime:2022-06-08T18:46:46.063Z,
        statementDigest:{{KY2nL6UGUPs5lXCLVXcUaBxcEIop0Jvk4MEjcFVBfwI=}}
      },
      {
        statement:"SELECT p_id FROM Person p BY p_id WHERE p.FirstName = ? and p.LastName = ?",
        startTime:2022-06-08T18:46:46.173Z,
        statementDigest:{{QS2nfB8XBf2ozlDx0nvtsliOYDSmNHMYC3IRH4Uh690=}}
      },
      {
        statement:"UPDATE VehicleRegistration r SET r.Owners.PrimaryOwner.PersonId = ? WHERE r.VIN = ?",
        startTime:2022-06-08T18:46:46.278Z,
        statementDigest:{{nGtIA9Qh0/dwIplOR8J5CTeqyUVtNUQgXfltDUo2Aq4=}}
      },
      {
        statement:"DELETE FROM DriversLicense l WHERE l.LicenseNumber = ?",
        startTime:2022-06-08T18:46:46.385Z,
        statementDigest:{{ka783dcEP58Q9AVQ1m9NOJd3JAmEvXLjzl0OjN1BojQ=}}
      }
    ],
    documents:{
      HwVFkn8IMRa0xjze5xcgga:{
        tableName:"VehicleRegistration",
        tableId:"HQZ6cgIMUi204Lq1tT4oaJ",
        statements:[0,2]
      },
      IiPTRxLGJZa342zHFCFT15:{
        tableName:"DriversLicense",
        tableId:"BvtXEB1JxZg0lJlBAtbtSV",
        statements:[3]
      }
    }
  },
  revisions:[
    {
      hash:{{FR1IWcWew0yw1TnRklo2YMF/qtwb7ohsu5FD8A4DSVg=}}
    },
    {
      blockAddress:{
        strandId:"4o5UuzWSW5PIoOGm5jPA6J",
        sequenceNo:25
      },
      hash:{{6TTHbcfIVdWoFC/j90BOZi0JdHzhjSXo1tW+uHd6Dj4=}},
      data:{
        VIN:"1N4AL11D75C109151",
        LicensePlateNumber:"LEWISR261LL",
        State:"WA",
        City:"Seattle",
        PendingPenaltyTicketAmount:90.25,
        ValidFromDate:2017-08-21,
        ValidToDate:2020-05-11,
        Owners:{
          PrimaryOwner:{
            PersonId:"3Ax20JIix5J2ulu2rCMvo2"
          },
          SecondaryOwners:[]
        }
      },
      metadata:{
        id:"HwVFkn8IMRa0xjze5xcgga",
        version:0,
        txTime:2022-06-08T18:46:46.492Z,
        txId:"3gtB8Q8dfIMA8lQ5pzHAMo"
      }
    },
    {
      blockAddress:{
        strandId:"4o5UuzWSW5PIoOGm5jPA6J",
        sequenceNo:25
      },
      hash:{{ZVF/f1uSqd5DIMqzI04CCHaCGFK/J0Jf5AFzSEk0l90=}},
      metadata:{
        id:"IiPTRxLGJZa342zHFCFT15",
        version:1,
        txTime:2022-06-08T18:46:46.492Z,
        txId:"3gtB8Q8dfIMA8lQ5pzHAMo"
      }
    }
  ]
}
```

在`revisions`字段中，某些修订版本对象可能只包含一个 `hash` 值而不包含其他属性。这是仅供内部使用的系统修订版，不包含用户数据。修订版的哈希值是该日记账完整哈希链的一部分，这是加密验证的必要条件。

## 数据块内容
<a name="journal.block-contents"></a>

日记账数据块包含以下字段：

**`blockAddress`**  
日记账中的数据库位置。地址是一种包含两个字段的 [Amazon Ion](ion.md) 结构：即`strandId`和`sequenceNo`。  
例如：`{strandId:"BlFTjlSXze9BIh1KOszcE3",sequenceNo:14}`

**`transactionId`**  
提交数据块的事务唯一 ID。

**`blockTimestamp`**  
数据块提交到日记账的时间戳。

**`blockHash`**  
唯一代表数据块的 256 位哈希值。这是`entriesHash`和 `previousBlockHash`的串联的哈希值。

**`entriesHash`**  
代表数据块内所有条目的哈希值，包括仅限内部的系统条目。这是 [Merkle tree](verification.md#verification.how-it-works.merkle-tree)的根哈希，其中叶节点由`entriesHashList`中的所有哈希组成。

**`previousBlockHash`**  
日记账中前一个链式数据块的哈希值。

**`entriesHashList`**  
代表数据块中每个条目的哈希列表。此列表可以包含以下条目哈希：  
+ 表示`transactionInfo`的 Ion 哈希。该值是通过取整个 `transactionInfo` 结构的 Ion 哈希值计算得出的。
+ Merkle tree 的根哈希，其中叶节点由`revisions`中的所有哈希组成。
+ 表示`redactionInfo`的 Ion 哈希。此哈希值仅存在于由编校事务提交的数据块中。它的值是通过取整个 `redactionInfo` 结构的 Ion 哈希值计算得出的。
+ 代表仅限内部使用的系统元数据哈希。这些哈希值可能并不存在于所有数据块。

**`transactionInfo`**  
一种 Amazon Ion 结构，其中包含有关提交数据块的事务中的语句的信息。此结构具有以下字段：  
+ `statements` — PartiQL 语句列表以及它们何时开始运行的`startTime`。每个语句都有一个 `statementDigest` 哈希，这是计算 `transactionInfo` 结构哈希值所必需的。
+ `documents`— 由声明更新的文档 IDs 。每个文档都包括它所属的`tableName` 和 `tableId`，以及更新该文档的每条语句的索引。

**`revisions`**  
数据块中提交的文档修订列表。每个修订版本结构都包含所有此版本的所有[提交视图](working.metadata.md)字段。  
这也可以包括代表仅限内部的系统修订版哈希，这些版本是日记账账完整哈希链的一部分。

## 已编校的修订版
<a name="journal.redacted-revisions"></a>

在 Amazon QLDB，`DELETE` 语句只能通过创建将文档标记为已删除的新修订版，从逻辑上删除文档。QLDB 还支持*数据编校*操作，允许您永久删除表历史记录中的非活动文档修订版本。

编校操作仅删除指定修订版中的用户数据，而日记账序列和文档元数据则保持不变。这样可保持分类账的整体数据完整性。有关编校操作示例的更多信息，请参阅 [对文档修订版执行编校](working.redaction.md)。

### 已编校的修订示例
<a name="journal.redacted-revisions.example"></a>

考虑前面的 [数据块示例](#journal.block-example)。在此数据块，假设您编辑了文档 ID 为`HwVFkn8IMRa0xjze5xcgga`、版本号为`0`的修订版。

编校完成后，修订版中的用户数据（由`data`结构表示）将替换为一个新 `dataHash` 字段。该字段的值是已移除 `data` 结构的 Ion 哈希。因此，分类账保持了其整体数据的完整性，并通过现有验证 API 操作保持加密可验证性。

以下修订示例显示了此次密文的结果，其中突出显示了新`dataHash`字段。*red italics*

**注意**  
本文档仅用于参考。显示的哈希值并非实际计算的哈希值。

```
...
{
  blockAddress:{
    strandId:"4o5UuzWSW5PIoOGm5jPA6J",
    sequenceNo:25
  },
  hash:{{6TTHbcfIVdWoFC/j90BOZi0JdHzhjSXo1tW+uHd6Dj4=}},
  dataHash:{{s83jd7sfhsdfhksj7hskjdfjfpIPP/DP2hvionas2d4=}},
  metadata:{
    id:"HwVFkn8IMRa0xjze5xcgga",
    version:0,
    txTime:2022-06-08T18:46:46.492Z,
    txId:"3gtB8Q8dfIMA8lQ5pzHAMo"
  }
}
...
```

QLDB 还会在日记账中为已完成编辑请求添加新数据块。此数据块还包含其他 `redactionInfo` 条目，其中包含在事务中已编辑的修订的列表，如以下示例所示。

```
...
redactionInfo:{
  revisions:[
    {
      blockAddress:{
        strandId:"4o5UuzWSW5PIoOGm5jPA6J",
        sequenceNo:25
      },
      tableId:"HQZ6cgIMUi204Lq1tT4oaJ",
      documentId:"HwVFkn8IMRa0xjze5xcgga",
      version:0
    }
  ]
}
...
```

## 示例应用程序
<a name="journal.sample"></a>

有关使用导出数据验证期刊哈希链的 Java 代码示例，请参阅 GitHub 存储库 a [ws-samples/-amazon-qldb-dmv-sample](https://github.com/aws-samples/amazon-qldb-dmv-sample-java) java。此示例应用程序包含以下类别文件：
+ [ValidateQldbHashChain.java](https://github.com/aws-samples/amazon-qldb-dmv-sample-java/blob/master/src/main/java/software/amazon/qldb/tutorial/ValidateQldbHashChain.java)-包含从账本导出日记账区块并使用导出的数据验证区块之间的哈希链的教程代码。
+ [JournalBlock.java](https://github.com/aws-samples/amazon-qldb-dmv-sample-java/blob/master/src/main/java/software/amazon/qldb/tutorial/qldb/JournalBlock.java)-包含一个名为的方法`verifyBlockHash()`，该方法演示如何计算区块中的每个哈希分量。此方法由`ValidateQldbHashChain.java`中的教程代码调用。

有关如何下载和安装此完整示例应用程序的说明，请参阅 [安装 Amazon QLDB Java 示例应用程序](sample-app.java.md)。在运行教程代码之前，请确保按照[Java 教程](getting-started.java.tutorial.md)中的步骤 1—3 设置示例分类账并向其中加载示例数据。

## 另请参阅
<a name="journal.see-also"></a>

有关 QLDB 中的日记账的更多信息，请参阅以下主题：
+ [从Amazon QLDB 导出日记账数据](export-journal.md) — 了解如何将日记账数据导出至 Amazon Simple Storage Service（Amazon S3）。
+ [Amazon QLDB 流式传输日记账数据](streams.md)— 了解如何将日记账数据流式传输至 Amazon Kinesis Data Streams。
+ [Amazon QLDB 中的数据验证](verification.md) — 了解日记账数据的加密验证。

# Amazon QLDB 词汇表
<a name="qldb-glossary"></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 时可能遇到的关键术语的定义。

 [数据块](#block) \$1 [摘要](#digest) \$1 [文档](#document) \$1 [文档 ID](#document_id) \$1 [文档修订](#document_revision) \$1 [条目](#entry) \$1 [字段](#field) \$1 [索引](#index) \$1 [索引存储](#indexed_storage) \$1 [日记账](#journal) \$1 [日记账块](#journal_block) \$1 [日记账存储](#journal_storage) \$1 [日记账链](#journal_strand) \$1 [日记账小贴士](#journal_tip) \$1 [分类账](#ledger) \$1 [证明](#proof) \$1 [revision](#revision) \$1 [会话](#session) \$1 [链](#strand) \$1 [表](#table) \$1 [表视图](#table_view) \$1 [查看](#view) 

**数据块**  <a name="block"></a>
在事务中提交到日记账的对象。单个事务在日记账中写入一个块，因此一个块只能与一个事务相关联。数据块包含代表事务中提交的文档修订版本条目和提交这些修订的 [PartiQL](ql-reference.md) 语句。  
每个块也有一个用于验证的哈希值。块哈希值是根据该块内的条目哈希值与前一个链块的哈希值相结合计算出的。

**摘要**  <a name="digest"></a>
一个 256 位的哈希值，它唯一地表示分类账截至某个时间点的整个文档修订历史记录。摘要哈希值是根据您的日记账中截至当时最新提交的块的完整哈希链计算得出的。  
QLDB 允许您将摘要生成作为安全输出文件的形式。然后，您可以使用该输出文件来验证文档修订版本相对于该哈希值的完整性。

**文档**  <a name="document"></a>
一组 [Amazon Ion](ion.md) `struct`格式的数据，可以在表中插入、更新和删除。QLDB 文档可以包含结构化、半结构化、嵌套和无架构数据。

**文档 ID**  <a name="document_id"></a>
QLDB 分配给插入到表中的每个文档的通用唯一标识符（UUID）。此 ID 是一个 128 位的数字，它以 Base62 编码的字母数字字符串表示，固定长度为 22 个字符。

**文档修订**  <a name="document_revision"></a>
一种表示由唯一文档 ID 标识的文档序列的单个版本的 Ion 结构。修订版既包括您的用户数据（即您在表中写入的数据），也包括系统生成的元数据。每个修订版都与表相关联，并由文档 ID 和从零开始的版本号组合作为唯一标识。

**条目**  <a name="entry"></a>
块中包含的对象。条目表示在事务中插入、更新和删除的文档修订以及提交这些修订的 PartiQL 语句。  
每个条目还有一个用于验证的哈希值。条目哈希值是根据该条目中的修订哈希值或语句哈希值计算得出的。

**字段**  <a name="field"></a>
构成 QLDB 文档每个属性的名称-值对。名称为符号令牌，其值不受限制。

**索引**  <a name="index"></a>
可以在表上创建的一种数据结构，用于优化数据检索操作的性能。有关 QLDB 中索引的信息，请参阅* Amazon QLDB PartiQL 参考*中的 [CREATE INDEX](ql-reference.create-index.md)。

**索引存储**  <a name="indexed_storage"></a>
分类账的表、索引和索引历史记录使用的磁盘空间。索引存储包含的分类账数据针对高性能查询进行了优化。

**日记账**  <a name="journal"></a>
在分类账中提交的所有块的哈希链集。日记账仅用于追加，它代表了对分类账数据的所有更改的、完整且不可变的历史记录。

**日记账块**  <a name="journal_block"></a>
请参阅 [数据块](#block)。

**日记账存储**  <a name="journal_storage"></a>
分类账的日记账账使用的磁盘空间。

**日记账链**  <a name="journal_strand"></a>
请参阅 [链](#strand)。

**日记账小贴士**  <a name="journal_tip"></a>
日记账在某一时间点上最近提交的块。

**分类账**  <a name="ledger"></a>
Amazon QLDB 分类账数据库资源的实例。这是 QLDB 中的主要 AWS 资源类型。分类账由*日记账存储*和*索引存储*组成。分类账数据提交到日记账后，即可在 Amazon Ion 文档修订版表格中进行查询。

**证明**  <a name="proof"></a>
QLDB 为给定摘要和文档修订版返回的 256 位哈希值的有序列表。它由 Merkle 树模型将给定的修订散列链接到摘要散列所需的散列组成。您可以使用证明来验证您的修订版本相对于摘要的完整性。有关更多信息，请参阅 [Amazon QLDB 中的数据验证](verification.md)。

**revision**  <a name="revision"></a>
请参阅 [文档修订](#document_revision)。

**会话**  <a name="session"></a>
一个对象，用于管理有关您的数据事务请求以及对分类账的响应的信息。*活动的会话*（正在积极运行事务的会话）表示与分类账的单个连接。QLDB 支持每个会话正在运行的事务。

**链**  <a name="strand"></a>
日记账的分区。QLDB 目前仅支持单链日记账。

**表**  <a name="table"></a>
在分类账的日记账中提交的文件修订的无序集合的实体化视图。

**表视图**  <a name="table_view"></a>
表中数据的可查询子集，基于提交到日记账的事务。在 PartiQL 语句中，视图由表名的前缀限定符（以 `_ql_` 开头）表示。  
您可以使用 `SELECT` 语句查询以下系统定义的视图：  
+ *用户* - 仅包含您在表中写入的数据的最新有效版本（即用户数据的当前状态）。这是 QLDB 中的默认视图。
+ *已提交* – T您的用户数据和系统生成的元数据的最新有效版本。这是与您用户表直接对应的完整系统定义表。例如：`_ql_committed_TableName`。

**查看**  <a name="view"></a>
请参阅 [表视图](#table_view)。