Apollo Federation concepts in GraphQL - Time & Space Complexity
Start learning this pattern below
Jump into concepts and practice - no test required
When using Apollo Federation, we want to know how the time to get data changes as the number of services or data grows.
We ask: How does combining multiple GraphQL services affect the work done to answer a query?
Analyze the time complexity of this federated query resolving process.
query GetUsersAndReviews {
users {
name
reviews {
body
product {
name
}
}
}
}
This query fetches users, their reviews, and product names from multiple services combined by Apollo Federation.
Look for repeated data fetching steps across services.
- Primary operation: Fetching reviews for each user and fetching product details for each review.
- How many times: Once per user for reviews, and once per review for product info.
As the number of users or reviews grows, the number of fetches grows too.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 users, 5 reviews each | ~1 user fetch + 10 review fetches + 50 product fetches |
| 100 users, 5 reviews each | ~1 user fetch + 100 review fetches + 500 product fetches |
| 1000 users, 5 reviews each | ~1 user fetch + 1000 review fetches + 5000 product fetches |
Pattern observation: The total work grows roughly in proportion to the number of users times their reviews.
Time Complexity: O(n * m)
This means the time grows with the number of users (n) times the number of reviews per user (m).
[X] Wrong: "Fetching data from multiple services happens all at once and takes the same time no matter how many items."
[OK] Correct: Each nested fetch adds more work, so more users or reviews mean more calls and longer total time.
Understanding how federated queries scale helps you design efficient APIs and shows you can think about real-world data fetching costs.
"What if we batch product requests instead of fetching one by one? How would that change the time complexity?"
Practice
Solution
Step 1: Understand Apollo Federation's role
Apollo Federation is designed to combine multiple GraphQL services into one unified API.Step 2: Compare options
Options B, C, and D describe unrelated tasks. Only To combine multiple GraphQL services into a single API correctly describes Apollo Federation's purpose.Final Answer:
To combine multiple GraphQL services into a single API -> Option CQuick Check:
Apollo Federation = combine services [OK]
- Confusing Federation with database schema design
- Thinking Federation replaces REST APIs directly
- Assuming Federation optimizes SQL queries
Solution
Step 1: Recall the directive for unique identifiers
In Apollo Federation, the@keydirective marks the unique identifier fields for an entity.Step 2: Check syntax correctness
type User @key(fields: "id") { id: ID! name: String } uses@key(fields: "id"), which is the correct syntax. Other options use incorrect directives.Final Answer:
type User @key(fields: "id") { id: ID! name: String } -> Option BQuick Check:
@key directive = unique ID marker [OK]
- Using @unique or @id instead of @key
- Missing quotes around field names
- Confusing @key with database primary key syntax
extend type Product @key(fields: "upc") { upc: String @external price: Int }What does the
extend type keyword do here?Solution
Step 1: Understand 'extend type' in Apollo Federation
Theextend typekeyword adds fields to a type defined in another service.Step 2: Analyze the example
The Product type is extended to add thepricefield, whileupcis marked as external, meaning it comes from the original service.Final Answer:
Adds the price field to an existing Product type from another service -> Option AQuick Check:
extend type = add fields to existing type [OK]
- Thinking extend type creates a new type
- Confusing @external with local fields
- Assuming extend type removes fields
type Review @key(fields: "id") { id: ID! body: String author: User }Assuming User is defined in another service, what is missing?
Solution
Step 1: Understand referencing external entities
In Apollo Federation, to reference an entity type like User from another service, the schema must explicitly extend that type with its @key directive:extend type User @key(fields: "id") { id: ID! }.Step 2: Analyze the snippet
The Review type references User via author: User but lacks the required extend declaration for User, which is necessary for the gateway to know this service can resolve User.Final Answer:
The User type should be imported explicitly -> Option AQuick Check:
Reference entities -> extend type @key [OK]
- Marking author field with @provides or @requires
- Marking author field as @external
- Using extend keyword for Review type
Accounts defining type User @key(fields: "id") { id: ID! name: String } and Reviews extending User with extend type User @key(fields: "id") { id: ID! reviews: [Review] }. How does Apollo Federation resolve the User entity across these services?Solution
Step 1: Understand @key usage in federation
The@keydirective identifies the unique field used to match entities across services.Step 2: Analyze entity resolution
Apollo Federation merges types with the same @key field by matching their unique identifiers, combining fields from both services.Final Answer:
It merges User types by matching the @key field 'id' across services -> Option DQuick Check:
@key fields unify entities across services [OK]
- Thinking types are duplicated instead of merged
- Assuming extend type is ignored
- Believing manual merging is required
