Bird
Raised Fist0
GraphQLquery~20 mins

Schema evolution strategies in GraphQL - Practice Problems & Coding Challenges

Choose your learning style10 modes available

Start learning this pattern below

Jump into concepts and practice - no test required

or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Challenge - 5 Problems
🎖️
Schema Evolution Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
🧠 Conceptual
intermediate
2:00remaining
Why use schema evolution in GraphQL?

Imagine you have a GraphQL API used by many apps. You want to add new features without breaking old apps. Why is schema evolution important here?

AIt allows adding new fields without removing or changing existing ones, so old apps keep working.
BIt deletes old fields automatically to keep the schema small.
CIt forces all clients to update immediately when the schema changes.
DIt disables queries that use deprecated fields.
Attempts:
2 left
💡 Hint

Think about how to keep old apps working while adding new features.

query_result
intermediate
2:00remaining
What is the result of querying a deprecated field?

Given this GraphQL schema snippet:

type User { id: ID! name: String! age: Int @deprecated(reason: "Use birthYear instead") birthYear: Int }

What happens if a client queries the age field?

GraphQL
query { user(id: "1") { id name age } }
AThe query returns birthYear instead of age automatically.
BThe query fails with an error because age is deprecated.
CThe query returns null for age without any warning.
DThe query returns the age value but shows a deprecation warning in the schema documentation.
Attempts:
2 left
💡 Hint

Deprecated fields still work but are marked as discouraged.

📝 Syntax
advanced
2:00remaining
Which schema change is NOT backward compatible?

Which of these GraphQL schema changes will break existing clients?

AAdding a new optional field to a type.
BChanging a field's type from String to Int.
CAdding a new enum value.
DMarking a field as deprecated.
Attempts:
2 left
💡 Hint

Think about what happens if a client expects a string but gets an integer.

optimization
advanced
2:00remaining
How to safely remove a deprecated field?

You want to remove a deprecated field from your GraphQL schema without breaking clients. What is the best approach?

AKeep the field deprecated for a while, notify clients, then remove it in a future version.
BReplace the field with a different type without warning.
CRemove the field immediately and update all clients at once.
DRename the field to a new name without deprecating it first.
Attempts:
2 left
💡 Hint

Think about giving clients time to adapt.

🧠 Conceptual
expert
2:00remaining
What is a non-breaking schema evolution strategy for changing a field's type?

You need to change a field's type in a GraphQL schema, but you want to avoid breaking existing clients. Which strategy achieves this?

ARemove the old field and add a new field with the same name but different type.
BChange the field's type directly and update all clients immediately.
CCreate a new field with the new type and keep the old field deprecated until removal.
DUse a union type to combine old and new types in the same field.
Attempts:
2 left
💡 Hint

Think about how to keep old clients working while introducing new types.

Practice

(1/5)
1. What is the main purpose of schema evolution in GraphQL APIs?
easy
A. To update the API without breaking existing client applications
B. To remove all old fields immediately from the schema
C. To prevent any changes to the API once deployed
D. To make all fields mandatory for clients

Solution

  1. Step 1: Understand schema evolution concept

    Schema evolution allows changes to the API while keeping existing clients working.
  2. Step 2: Identify the correct purpose

    Removing fields immediately or making all fields mandatory breaks clients, so those are incorrect.
  3. Final Answer:

    To update the API without breaking existing client applications -> Option A
  4. Quick Check:

    Schema evolution = safe API updates [OK]
Hint: Schema evolution means safe API changes without breaking clients [OK]
Common Mistakes:
  • Thinking schema evolution means removing fields immediately
  • Believing all fields must be mandatory
  • Assuming no changes are allowed after deployment
2. Which of the following is the correct way to mark a field as deprecated in a GraphQL schema?
easy
A. type User { name: String @remove(reason: "Use fullName instead") }
B. type User { name: String deprecated: true }
C. type User { name: String @deprecated(reason: "Use fullName instead") }
D. type User { name: String deprecated(reason: "Use fullName instead") }

Solution

  1. Step 1: Recall GraphQL deprecation syntax

    GraphQL uses the @deprecated directive with a reason argument to mark fields deprecated.
  2. 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.
  3. Final Answer:

    type User { name: String @deprecated(reason: "Use fullName instead") } -> Option C
  4. Quick Check:

    @deprecated directive syntax = type User { name: String @deprecated(reason: "Use fullName instead") } [OK]
Hint: Use @deprecated(reason: "...") to mark fields deprecated [OK]
Common Mistakes:
  • Using deprecated: true instead of @deprecated directive
  • Using @remove directive which does not exist
  • Omitting the @ symbol before deprecated
3. Given this GraphQL schema snippet:
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?
medium
A. The query succeeds but clients get a deprecation warning for email
B. The query fails because email is removed
C. The query returns null for email always
D. The query returns contactEmail value instead of email

Solution

  1. Step 1: Understand @deprecated behavior in GraphQL

    Deprecated fields still exist and return data but signal clients to avoid using them.
  2. Step 2: Analyze the query effect

    Querying email returns its value but clients should see a deprecation warning.
  3. Final Answer:

    The query succeeds but clients get a deprecation warning for email -> Option A
  4. Quick Check:

    Deprecated fields return data with warnings [OK]
Hint: Deprecated fields still return data but warn clients [OK]
Common Mistakes:
  • Assuming deprecated fields are removed immediately
  • Thinking deprecated fields return null
  • Believing deprecated fields auto-redirect to new fields
4. Consider this schema update attempt:
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?
medium
A. GraphQL does not allow adding new fields to existing types
B. Adding contactEmail without deprecating email causes syntax error
C. You must rename email to contactEmail in one step
D. Removing email field breaks existing clients still using it

Solution

  1. Step 1: Identify schema evolution best practice

    Removing fields immediately breaks clients that still query those fields.
  2. Step 2: Analyze the update

    The update removes email without deprecation, causing breaking changes.
  3. Final Answer:

    Removing email field breaks existing clients still using it -> Option D
  4. Quick Check:

    Immediate removal breaks clients [OK]
Hint: Never remove fields immediately; deprecate first [OK]
Common Mistakes:
  • Thinking adding fields causes syntax errors
  • Believing renaming must be one-step without deprecation
  • Assuming GraphQL forbids adding new fields
5. You want to evolve a GraphQL schema by replacing a field phone with mobilePhone without breaking clients. Which strategy is best?
hard
A. Remove phone immediately and add mobilePhone
B. Add mobilePhone as optional, deprecate phone with reason, keep both for now
C. Rename phone to mobilePhone directly without deprecation
D. Keep only phone and do not add mobilePhone

Solution

  1. Step 1: Apply schema evolution best practice

    Adding new fields as optional and deprecating old ones avoids breaking clients.
  2. Step 2: Evaluate options

    Add mobilePhone as optional, deprecate phone with reason, keep both for now follows best practice; others cause breaking changes or no evolution.
  3. Final Answer:

    Add mobilePhone as optional, deprecate phone with reason, keep both for now -> Option B
  4. Quick Check:

    Deprecate old, add new optional field [OK]
Hint: Add new optional field, deprecate old with reason [OK]
Common Mistakes:
  • Removing old field immediately
  • Renaming fields without deprecation
  • Not adding new field at all