Relationships
Using Parse, you can store data objects establishing relations between them. To model this behavior, any ParseObject can be used as a value in other ParseObject. Internally, the Parse framework will store the referred-to object in just one place, to maintain consistency. 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;
- many-to-many, which can create many complex relations between many objects.
- one-to-one, establishing direct relations between two objects and only them;
There are two ways to create a one-to-many relation in Parse:
- (Recomended) The first is using the Parse Pointers in Child Class, which is the fastest in creation and query time. We will use this in this guide.
- The second is using Arrays of Parse Pointers in Parent Class which can lead to slow query times depending on their size. Because of this performance issue, we will use only pointers examples.
There are three ways to create a many-to-many relation in Parse.
- (Recomended) The first is using Parse Relations, which is the fastest in creation and query time. We will use this in this guide.
- The second is using Arrays of Parse Pointers which can lead to slow query times depending on their size.
- The third is using JoinTable where the idea from classical database. When there is a many-to-nany relation, we combine every objectId or Pointer from both sides together to build a new separate table in which the relationship is tracked.
In this guide, you will implement a React book registration application that contains the three main kinds of data associations. You will learn how to create and query data relations using Back4App and React.
At any time, you can access this project via our GitHub repositories to checkout the styles and complete code.
To complete this tutorial, you will need:
To perform and demonstrate database relations in React using Parse in a realistic scenario.
Since in this guide we will be using a book registration application example, you need to first understand how the object relations are laid out in this database. The main object class that you’ll be using is the Book class, which will store each book entry in the registration. These are the other four object classes:
- Publisher: book publisher name, one-to-many relation with Book;
- Genre: book genre, one-to-many relation with Book. Note that for this example we will consider that a book can only have one genre;
- Author: book author, many-to-many relation with Book, 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 with Book, 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 app example (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 and a text input field assigned to the book’s ISBD value, which will be used to create the one-to-one relation.
Let’s take a look at the book creation method that is called when submitting this form:
Let’s now look separately at how the three types of associations are done when creating the Book object.
Note 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.
Look at how the bookAuthorsObjects are set to the new book Parse.Object instance. To create a many-to-many relation, you first need to create a new Parse.Object.relation and then add the related objects to it either one by one or by passing an array of Parse.Object using the Parse.Object.relation.add method. Parse will create a relation type column and also a relational table on your database. Parse will also create a link for easy access to this new table in the field column in the dashboard.
See how the bookISBDValue is set to the new book Parse.Object instance. Creating and saving one-to-one and one-to-many relations in Parse are similar processes, in which you pass as an argument the Parse.Object instance using the Parse.Object.set method, which takes two arguments: the field name and the value to be set.
The catch here is that, before saving, you need to enforce that there are no ISBD objects containing the informed ISBD ID string value in your database and that there are no Book objects already related to it as well. The second part will always be true in this case, since you are creating a new Book object every time. Enforcing the ISBD uniqueness can be achieved by using the following highlighted query:
After successfully saving your objects, Parse will create a pointer data type column and a direct link on your dashboard as well.
Querying 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 and after we will highlight how each relation type is queried:
To query any books related to a specific publisher or genre, you need 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').
To query any books related to a specific author, the query will also use only a Parse.Query.equalTo method. However, after querying, Parse will not store Parse.Object instances from many-to-many relational fields, only a reference to the related class name, such as {"__type": "Relation", "className": "Author"}. To retrieve and show data from these object instances, you need to create a relation and query it again, storing the results in an object array of your own.
Just as before, to query any books related to a specific ISBD, you need 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-one relational fields, the same way that it is done with one-to-many relational fields.
At the end of this guide, you learned how to create and query relations in Parse on React. In the next guide, we will show you how to register users.