Schema evolution strategies in GraphQL - Time & Space Complexity
Start learning this pattern below
Jump into concepts and practice - no test required
When we change a GraphQL schema over time, we want to know how these changes affect the work the server does.
We ask: How does the effort to handle queries grow as the schema evolves?
Analyze the time complexity of the following schema evolution approach.
type Query {
user(id: ID!): User
users: [User]
}
type User {
id: ID!
name: String
email: String
# New field added in evolution
phone: String
}
This snippet shows adding a new optional field phone to the User type without removing old fields.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Resolving each field requested in a query for each user.
- How many times: Once per user per requested field, including new and old fields.
As the number of users grows, the server resolves more fields for each user.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | 10 users x fields requested |
| 100 | 100 users x fields requested |
| 1000 | 1000 users x fields requested |
Pattern observation: The work grows linearly with the number of users and the number of fields requested.
Time Complexity: O(n × f)
This means the time grows with the number of items (users) and the number of fields requested in the query.
[X] Wrong: "Adding a new field to the schema does not affect query execution time at all."
[OK] Correct: Even if the field is optional, if clients request it, the server must resolve it for each item, increasing work.
Understanding how schema changes affect query execution helps you design APIs that stay fast and reliable as they grow.
What if we removed old fields instead of adding new ones? How would the time complexity change?
Practice
Solution
Step 1: Understand schema evolution concept
Schema evolution allows changes to the API while keeping existing clients working.Step 2: Identify the correct purpose
Removing fields immediately or making all fields mandatory breaks clients, so those are incorrect.Final Answer:
To update the API without breaking existing client applications -> Option AQuick Check:
Schema evolution = safe API updates [OK]
- Thinking schema evolution means removing fields immediately
- Believing all fields must be mandatory
- Assuming no changes are allowed after deployment
Solution
Step 1: Recall GraphQL deprecation syntax
GraphQL uses the @deprecated directive with a reason argument to mark fields deprecated.Step 2: Check each option's syntax
type User { name: String @deprecated(reason: "Use fullName instead") } uses correct @deprecated directive syntax; others are invalid or incorrect.Final Answer:
type User { name: String @deprecated(reason: "Use fullName instead") } -> Option CQuick Check:
@deprecated directive syntax = type User { name: String @deprecated(reason: "Use fullName instead") } [OK]
- Using deprecated: true instead of @deprecated directive
- Using @remove directive which does not exist
- Omitting the @ symbol before deprecated
type Query {
user(id: ID!): User
}
type User {
id: ID!
name: String
email: String @deprecated(reason: "Use contactEmail instead")
contactEmail: String
}What happens if a client queries for
email field?Solution
Step 1: Understand @deprecated behavior in GraphQL
Deprecated fields still exist and return data but signal clients to avoid using them.Step 2: Analyze the query effect
Queryingemailreturns its value but clients should see a deprecation warning.Final Answer:
The query succeeds but clients get a deprecation warning foremail-> Option AQuick Check:
Deprecated fields return data with warnings [OK]
- Assuming deprecated fields are removed immediately
- Thinking deprecated fields return null
- Believing deprecated fields auto-redirect to new fields
type User {
id: ID!
name: String
email: String
}
# Update:
type User {
id: ID!
name: String
contactEmail: String
}What is the main problem with this update?
Solution
Step 1: Identify schema evolution best practice
Removing fields immediately breaks clients that still query those fields.Step 2: Analyze the update
The update removesemailwithout deprecation, causing breaking changes.Final Answer:
Removingemailfield breaks existing clients still using it -> Option DQuick Check:
Immediate removal breaks clients [OK]
- Thinking adding fields causes syntax errors
- Believing renaming must be one-step without deprecation
- Assuming GraphQL forbids adding new fields
phone with mobilePhone without breaking clients. Which strategy is best?Solution
Step 1: Apply schema evolution best practice
Adding new fields as optional and deprecating old ones avoids breaking clients.Step 2: Evaluate options
AddmobilePhoneas optional, deprecatephonewith reason, keep both for now follows best practice; others cause breaking changes or no evolution.Final Answer:
AddmobilePhoneas optional, deprecatephonewith reason, keep both for now -> Option BQuick Check:
Deprecate old, add new optional field [OK]
- Removing old field immediately
- Renaming fields without deprecation
- Not adding new field at all
