advanced
GraphQL schema and operations
Осознанно моделируйте types, fields, queries, mutations, subscriptions, nullability, input types и operation contracts.
GraphQL предоставляет типизированную schema, которую клиенты запрашивают через один endpoint. Operations: **Query** (чтение), **Mutation** (запись), **Subscription** (push).
type Order {
id: ID!
status: OrderStatus!
total: Money!
customer: Customer!
}
enum OrderStatus { PENDING SHIPPED CANCELLED }
input CreateOrderInput {
customerId: ID!
lineItems: [LineItemInput!]!
}
type Mutation {
createOrder(input: CreateOrderInput!): CreateOrderPayload!
}
type Query {
order(id: ID!): Order
orders(first: Int!, after: String): OrderConnection!
}
Решения проектирования:
- **Nullability**: `!` только когда сервер всегда резолвит; nullable для частичных сбоев в списках.
- **Input types** отдельно от output; не раскрывайте внутреннюю форму хранения.
- **Connections** (Relay-style) для pagination: `edges { node cursor }`, `pageInfo`.
- **Payload types** для mutations: `{ order, errors }` или union results для domain failures.
На интервью: когда GraphQL лучше REST (гибкие чтения, mobile), цена неограниченных запросов, эволюция schema (deprecated fields, @oneOf).
Типовые ошибки: зеркало таблиц БД в графе, всё non-null, mutations как RPC без validation input, breaking clients удалением полей без deprecation.
Компромисс: гибкость клиента против предсказуемости сервера — complexity limits и persisted operations в production.
Чеклист:
- Моделируйте domain types, не tables.
- Осознанная nullability и pagination.
- Deprecate перед удалением; additive changes.
- Валидация inputs на границе API.