1:N Relationship
At the core of many backends, you will find the ability to store data. Using Parse, you can store data objects establishing relations between them. Data relations standardize how each data object is related or associated with other ones. That can give you extra power when building and running complex queries. There are three main relation types:
- one-to-many, where one object can be related to many other objects;
- one-to-one, establishing direct relations between two objects and only them;
- many-to-many, which can create many complex relations between many objects.
In this guide, we will focus on the most common relation, the one-to-many. Data storage backends usually will demand explicit declarations of these associations and even require that you create, on your own, relational tables for managing their joining. Parse makes it automatically for you, removing any possibility of errors while building your data relations and speeding up your application modeling process.
There are two ways to create a one-to-many relation in Parse. The first is using the Parse.Object Pointers, which is the fastest in creation and query time. The second is using arrays which can lead to slow query times depending on their size. Because of this performance issue, we will use only pointers examples from now on.
In this guide, you will implement a React Native book registration application that contains the three main kinds of data associations. You will learn how to create and query one-to-many data relations using your Back4App and React Native.
At any time, you can access this project via our GitHub repositories to checkout the styles and complete code.
Use the Parse one-to-many relation to model a Book Store React Native App
Since we will be using a book registration application example in this guide, you need first to understand how the object relations are laid out in this database. The main object class you’ll be using is the Book class, storing each book entry in the registration. Also, these are the other four object classes:
- Publisher: book publisher name, one-to-many relation withBook
- Genre: book genre, one-to-many relation withBook. Note that for this example we will consider that a book can only have one genre;
- Author: book author, many-to-many relation withBook, since a book can have more than one author and an author can have more than one book as well;
- ISDB: book ISDB identifying number, one-to-one relation withBook, since this number is unique for each book.
Here is a visual representation of these database tables:
For simplicity, we will assume that each object class has only a string type name attribute (title for the Book), apart from any additional relational attribute.
Before going into this step we recommend you to clone and run the React Native Library app exmaple (JavaScript Example Repository, TypeScript Example Repository). This application has two main screens: one responsible for listing the registered books and the other for creating new books. In the book registration form, there are direct links to the other related objects, so when a user picks a publisher or genre option, the form fields will hold the complete Parse.Object instance.
Let’s take a look at the book creation method that is called when submitting this form:
Look how the bookPublisherObject and bookGenreObject are set to the new book Parse.Object instance. See how simple it is in Parse to create a one-to-many relation: you could either assign the target object instance or a pointer to it using the Parse.Object.set method, which takes two arguments: the field name and the value to be set. Parse will create a pointer data type column and a direct link on your dashboard for quick access under the hood.
Clicking on the object pointer value in your dashboard will take you to the referenced object entry. It may seem like a harmless feature, but this makes debugging and error tracing much quicker than searching for it manually.
Querying one-to-many related objects is pretty straightforward as much of it is handled by Parse. Take a look at the query function in the book registers list screen:
In this case, to query any books related to a specific publisher or genre, you need only to perform a Parse.Query.equalTo method passing the Parse.Object instance as the parameter. After querying, Parse will store inside the resulting objects the complete instances of any one-to-many relational fields. To retrieve and show data from these object instances, you can chain the Parse.Object.get method like this: bookParseObject.get(('publisher').get('name'). Here is how the list screen looks like by using these getters to retrieve the publisher and genre names from the list items:
At the end of this guide, you learned how to create and query one-to-many relations in Parse on React Native. In the next guide, we will show you how to do many-to-many and one-to-one queries and relations.