📖 Scenario: You are creating a simple GraphQL API for a library system. The system needs to manage authors and their books. Each author can write multiple books, and each book belongs to one author.
🎯 Goal: Build a GraphQL schema that models the one-to-many relationship between authors and books using relationship design patterns.
📋 What You'll Learn
Create a GraphQL type Author with fields id (ID), name (String), and books (list of Book)
Create a GraphQL type Book with fields id (ID), title (String), and author (Author)
Define the relationship so that querying an author returns their books and querying a book returns its author
Use proper GraphQL syntax for type definitions and relationships
💡 Why This Matters
🌍 Real World
GraphQL schemas are used to design APIs that allow clients to request exactly the data they need, making apps efficient and flexible.
💼 Career
Understanding relationship design patterns in GraphQL is essential for backend developers building APIs for modern web and mobile applications.
Progress0 / 4 steps
1
Define the Author type
Create a GraphQL type called Author with fields id of type ID! and name of type String!.
GraphQL
Hint
Use type Author { ... } and define the fields inside curly braces.
2
Define the Book type
Create a GraphQL type called Book with fields id of type ID! and title of type String!.
GraphQL
Hint
Define the Book type similarly to Author.
3
Add relationship fields
Add a field books to the Author type that returns a list of Book (use [Book!]!). Add a field author to the Book type that returns an Author (use Author!).
GraphQL
Hint
Use square brackets [] to indicate a list of books for the author.
4
Complete the schema with Query type
Add a Query type with two fields: authors returning a list of Author ([Author!]!) and books returning a list of Book ([Book!]!).
GraphQL
Hint
The Query type is the entry point for fetching data in GraphQL.
Practice
(1/5)
1. In GraphQL, which relationship pattern describes one item connected to many items, like one author having many books?
easy
A. One-to-many
B. Many-to-one
C. Many-to-many
D. One-to-one
Solution
Step 1: Understand relationship types
One-to-many means one record links to many records, like one author to many books.
Step 2: Match example to pattern
Since one author can have many books, this fits one-to-many.
Final Answer:
One-to-many -> Option A
Quick Check:
One author -> many books = One-to-many [OK]
Hint: One item linked to many items means one-to-many [OK]
Common Mistakes:
Confusing many-to-many with one-to-many
Thinking one-to-one fits multiple items
Mixing up direction of relationship
2. Which of the following is the correct GraphQL syntax to define a many-to-many relationship between Student and Course types?
easy
A. type Student { courses: Course }
type Course { students: Student }
B. type Student { course: Course }
type Course { student: Student }
C. type Student { courses: [Course!]! }
type Course { students: [Student!]! }
D. type Student { courses: Course! }
type Course { students: Student! }
Solution
Step 1: Identify many-to-many syntax
Many-to-many uses lists on both sides, so fields must be arrays like [Course!]! and [Student!]!.
Step 2: Check options for correct list syntax
type Student { courses: [Course!]! }
type Course { students: [Student!]! } uses lists with non-nullable items and non-nullable lists, which is correct GraphQL syntax.
Final Answer:
type Student { courses: [Course!]! } type Course { students: [Student!]! } -> Option C
Quick Check:
Lists on both sides = many-to-many syntax [OK]
Hint: Many-to-many uses lists on both types in GraphQL [OK]
Common Mistakes:
Using single objects instead of lists for many-to-many
Missing non-nullable markers (!)
Confusing one-to-one syntax with many-to-many
3. Given this GraphQL schema snippet:
type Author {
id: ID!
books: [Book!]!
}
type Book {
id: ID!
title: String!
author: Author!
}
What will the query { author(id: "1") { books { title } } } return if author 1 has two books titled "A" and "B"?
medium
A. {"data":{"author":{"books":{"title":"A"}}}}
B. {"data":{"author":{"books":[{"title":"A"},{"title":"B"}]}}}
C. {"data":{"author":{"books":null}}}
D. {"errors":[{"message":"Field 'books' not found"}]}
Solution
Step 1: Understand schema and query
Author has a list of books. Query asks for author with id "1" and their books' titles.
Step 2: Predict query result
Since author 1 has two books "A" and "B", the books field returns a list with both titles.
Final Answer:
{"data":{"author":{"books":[{"title":"A"},{"title":"B"}]}}} -> Option B
Quick Check:
List of books with titles A and B returned [OK]
Hint: List fields return arrays of objects in GraphQL query results [OK]
Common Mistakes:
Expecting a single book object instead of a list
Assuming null if multiple books exist
Confusing error with missing field
4. Consider this GraphQL type definition:
type User {
id: ID!
posts: Post
}
type Post {
id: ID!
content: String!
}
What is the main problem with this design if a user can have many posts?
medium
A. The 'posts' field should be a list, not a single Post object.
B. The 'id' field is missing in User type.
C. The 'content' field should be nullable.
D. The Post type should include a reference back to User.
Solution
Step 1: Analyze the 'posts' field type
The 'posts' field is declared as a single Post, but users can have many posts.
Step 2: Identify correct type for multiple posts
To represent many posts, 'posts' should be a list like [Post!]! instead of a single Post.
Final Answer:
The 'posts' field should be a list, not a single Post object. -> Option A
Quick Check:
Multiple posts need list type, not single object [OK]
Hint: Multiple related items need list type in GraphQL [OK]
Common Mistakes:
Thinking single object can hold many items
Ignoring list syntax for multiple relations
Assuming missing fields cause this error
5. You want to model a social network in GraphQL where users can follow many other users and be followed by many users. Which relationship design pattern and schema snippet correctly represents this many-to-many self-relationship?
hard
A. type User { follower: User following: User } // single user on each side
B. type User { followers: [User] following: User } // mixed list and single user
C. type User { followers: User! following: User! } // non-null single user
D. type User { followers: [User!]! following: [User!]! } // both lists represent many-to-many
Solution
Step 1: Understand many-to-many self-relationship
Users can follow many users and be followed by many users, so both sides need lists.
Step 2: Check schema for correct list usage
type User { followers: [User!]! following: [User!]! } // both lists represent many-to-many uses lists for both followers and following, correctly modeling many-to-many self-relationship.
Final Answer:
type User { followers: [User!]! following: [User!]! } -> Option D
Quick Check:
Lists on both sides model many-to-many self-relationship [OK]
Hint: Self many-to-many needs lists on both fields [OK]
Common Mistakes:
Using single User instead of list for followers/following
Mixing list and single object types
Forgetting non-nullable list syntax
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.