Things to consider when creating/changing the schema
All of the following schema changes are potentially breaking changes:
- Removing a type or field
- Renaming a type or field
- Adding nullability to a field
- Removing a field’s arguments
- It’s easier and safer to add a new field to a schema than it is to remove an existing field that some of your clients are using.
Query driven design
Design your schema based on how data is used (aka Query-driven schema design), not based on how it’s stored.
If your client wants to query that:
query EventList {
upcomingEvents {
name
date
location {
name
weather {
temperature
description
}
}
}
}
Then your schema could look like that:
type Query {
upcomingEvents: [Event!]!
}
type Event {
name: String!
date: String!
location: Location
}
type Location {
name: String!
weather: WeatherInfo
}
type WeatherInfo {
temperature: Float
description: String
}
Naming conventions
- Field names should use
camelCase - Type names should use
PascalCase - Enum names should use
PascalCase - Enum values should use
ALL_CAPS
In GraphQL, it’s recommended for every mutation’s response to include the data that the mutation modified. This enables clients to obtain the latest persisted data without needing to send a followup query.
Error handling
Mutations are much more likely than queries to cause errors, because they modify data. A mutation might even result in a partial error, in which it successfully modifies one piece of data and fails to modify another. It is recommended to define a MutationResponse interface in your schema.
interface MutationResponse {
code: String!
success: Boolean!
message: String!
}
and implemented:
type UpdateUserEmailMutationResponse implements MutationResponse {
code: String!
success: Boolean!
message: String!
user: User
}
Descriptions (docstrings)
"Description for the type"
type MyObjectType {
"""
Description for field
Supports **multi-line** description for your [API](http://example.com)!
"""
myField: String!
otherField(
"Description for argument"
arg: Int
)
}