

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

# GraphQL 架构
<a name="schema-components"></a>

GraphQL 架构是 GraphQL API 的基础。它充当定义数据形状的蓝图。它也是您的客户端和服务器之间的合同，它定义了如何检索和 and/or 修改您的数据。

GraphQL 架构是使用*架构定义语言* (SDL) 编写的。SDL 由具有既定结构的类型和字段组成：
+ **类型**：类型是 GraphQL 定义数据形状和行为的方式。GraphQL 支持多种类型，本节后面将介绍这些类型。架构中定义的每种类型将包含自己的范围。在该范围内具有一个或多个字段，这些字段可以包含在 GraphQL 服务中使用的值或逻辑。类型扮演很多不同的角色，最常见的角色是对象或标量（基元值类型）。
+ **字段**：字段位于类型范围内，并保存从 GraphQL 服务中请求的值。它们与其他编程语言中的变量非常相似。您在字段中定义的数据形状将决定 request/response 操作中数据的结构方式。这样，开发人员就可以在不知道服务后端实施方式的情况下预测返回的内容。

为了直观地了解架构的外观，让我们看一个简单 GraphQL 架构的内容。在生产代码中，您的架构通常位于名为 `schema.graphql` 或 `schema.json` 的文件中。假设我们正在研究一个实施 GraphQL 服务的项目。该项目存储公司人员数据，并使用 `schema.graphql` 文件检索人员数据以及在数据库中添加新人员。代码可能如下所示：

------
#### [ schema.graphql ]

```
type Person {                                  
   id: ID!
   name: String                                  
   age: Int
}
type Query {                                   
  people: [Person]
}
type Mutation {
  addPerson(id: ID!, name: String, age: Int): Person
}
```

------

我们可以看到在架构中定义了三种类型：`Person`、`Query` 和 `Mutation`。看一下 `Person`，我们可以猜到这是公司员工实例的蓝图，这会使该类型成为一个对象。在其范围内，我们看到 `id`、`name` 和 `age`。这些是定义 `Person` 属性的字段。这意味着我们的数据来源将每个 `Person` 的 `name` 存储为 `String` 标量（基元）类型，并将 `age` 存储为 `Int` 标量（基元）类型。`id` 充当每个 `Person` 的特殊唯一标识符。它也是一个必需的值，由 `!` 符号表示。

接下来的两个对象类型的行为有所不同。GraphQL 为特殊对象类型保留一些关键字，这些关键字定义如何在架构中填充数据。`Query` 类型从源中检索数据。在我们的示例中，我们的查询可能从数据库中检索 `Person` 对象。这可能会让你想起 RESTful 术语中的`GET`操作。`Mutation` 修改数据。在我们的示例中，我们的变更可能会在数据库中添加更多 `Person` 对象。这可能会让您想起 `PUT` 或 `POST` 等状态更改操作。本节稍后将介绍所有特殊对象类型的行为。

让我们假设示例中的 `Query` 从数据库中检索一些内容。如果我们查看 `Query` 的字段，就会看到一个名为 `people` 的字段。其字段值为 `[Person]`。这意味着我们要检索数据库中的某个 `Person` 实例。不过，添加方括号意味着，我们希望返回所有 `Person` 实例的列表，而不仅仅是一个特定的实例。

`Mutation` 类型负责执行状态更改操作，例如数据修改。变更负责对数据来源执行一些状态更改操作。在我们的示例中，变更包含一个名为 `addPerson` 的操作，它将新的 `Person` 对象添加到数据库中。该变更使用 `Person` 并需要使用 `id`、`name` 和 `age` 字段的输入。

此时，您可能想知道 `addPerson` 等操作在没有代码实施的情况下如何工作，因为它应该实施某种行为，并且看起来很像具有函数名称和参数的函数。目前，它不起作用，因为架构仅充当声明。要实施 `addPerson` 行为，我们必须为其添加一个解析器。解析器是一个代码单元，只要调用其关联字段（此处的 `addPerson` 操作），就会执行该代码单元。如果要使用某个操作，您必须在某个时候添加解析器实施。从某种意义上说，您可以将架构操作视为函数声明，并将解析器视为定义。将在另一个小节中介绍解析器。

该示例仅显示架构处理数据的最简单方法。您可以使用 GraphQL 和 AWS AppSync功能构建复杂、稳健且可扩展的应用程序。在下一节中，我们将定义您可以在架构中使用的所有不同类型和字段行为。

正如您看到的一样，在 GraphQL 中具有很多不断变化的组件。在本节中，我们说明了一个简单架构的结构以及架构支持的各种类型和字段。在下一节中，您将了解 GraphQL API 的其他组件以及它们如何与架构一起使用。