# 编写schema

GraphQL schema是任何GraphQL的核心，描述了客户端连接到这里的可用字段。

核心代码块里有个叫’type‘ 的，他包含以下功能：

* 创建types之间的关系(e.g. between a `Book` and an `Author`)。
* 定义客户端可能执行的操作，类似获取了什么数据 (query) 和 更新了什么数据 (mutating)。
* 如果需要，自己来解释客户端需要的功能 (via introspection).

到最后，我们希望我们解释清楚里面的规则。

## Schema 定义

为了更好地理解GraphQL的功能, GraphQL 用了一个比较容易理解的语法“SDL”. SDL 用来表示模式里可用的类型以及这些如何关联的。

看起来SDL和JavaScript比较相似，所以说GraphQL-specific 可以存为string。现在我们专注于解释SDL的用法。后面我们再来进入JavaScript的使用案例。

这个案例用SDL来定义 books 和authors：

```
type Book {
  title: String
  author: Author
}

type Author {
  name: String
  books: [Book]
}
```

这里重要的是定义数据的关系和样式。不是数据来源于哪或者说哪里存储的-只是将来外面输出的样式。

通过在schema的里面来定义这些逻辑，我进可以让client看到我们提供了什么数据。

GraphQL客户端受益于GraphQL服务操作的精确性，特别是当和传统的rest方法比，这样可以减少服务器的请求。

\
Scalar 类型
---------

Scalar 类型最终会返回具体的数据。默认的GraphQL类型提供以下信息：

* `Int`: 32位
* `Float`: 浮点型
* `String`: 字符串
* `Boolean`: 布尔值
* `ID` (serialized as `String`): 唯一标志符，当表示为string的时候，人类不可读（原文是not intended to be human‐readable）

这些类型包含了大多数使用场景，如果有特殊场景可以使用[自定义](https://www.apollographql.com/docs/apollo-server/features/scalars-enums.html)的类型。

## 对象类型

The object type is the most common type used in a schema and represents a group of fields. Each field inside of an object type maps to another type, allowing nested types and circular references.

。。。。。
