π Lesson 3.5: Relations & Rollups: Connecting Databases Together
This is the lesson where Notion stops being a nicer notes app and becomes a connected system. Relations link two databases so a Task can point to its Project. Rollups then reach across that link and pull information back β so a Project can count its own open tasks and show a percent-complete without you ever tallying anything by hand. Once this clicks, you'll see it everywhere.
π What You'll Learn
By the end of this lesson, you will be able to:
- Explain what a relation is and create one between two databases
- Tell the difference between a one-way and a two-way (synced) relation, and use a self-relation
- Explain what a rollup is and add one that aggregates related rows
- Choose the right rollup calculation (count, sum, average, show original, percent, earliest/latest date)
- Build a real Projects + Tasks system that shows "open tasks per project" and "% complete" automatically
β±οΈ Estimated Time: 70 minutes
π― Project: Create a Projects database, relate your Tasks database to it, and add rollups that count tasks per project and show each project's percent complete.
In This Lesson
Why Connect Databases at All?
You've built databases that each do one job well: a Tasks list, a Reading tracker, maybe a Contacts page. But the real world isn't made of separate lists β things belong to other things. A task belongs to a project. A book belongs to an author. A note belongs to a meeting. When your tools can't express "belongs to," you end up copying the same information into two places and keeping them in sync by hand. That always breaks.
Here's the mental model for this lesson. Think of two databases as two lists of index cards. A relation is a piece of string you tie between a card in one pile and a card in the other: "this Task is tied to that Project." A rollup is you following all the strings out of one Project card, reading what's written on the Task cards at the other end, and writing a summary back on the Project β "4 tasks, 2 done." You tie the strings once; Notion reads them for you forever.
π§ Mindset
This is the lesson people call "where Notion finally clicked." It's also the one that feels like the biggest jump β two new property types working together. Go slowly. You do not need to understand every rollup calculation today; you need to tie one string and read it back. We'll build the whole thing step by step, and by the end you'll have a Projects + Tasks system that most people pay for a template to get.
Relations: Links Between Databases
A relation is a property type β just like text, date, or select β but instead of holding a value you type, it holds a link to one or more pages in another database. On a Task, a "Project" relation property lets you pick which Project this task belongs to. That's it. The magic comes later; the relation itself is just a connection.
π Definition
Relation: A property that connects a row in one database to one or more rows in another database (or the same one). Because each row is a page, a relation is really a link between pages β you can click through it to open the related page directly.
Creating a relation, step by step
- Open the database that will point to the other (e.g. Tasks).
- Add a new property; choose type Relation.
- Notion asks which database to relate to β pick the target (e.g. Projects). You can even relate to a brand-new database it creates for you.
- Decide whether to show on the other side too (that's the two-way switch β more in the next section), then create the property.
- Now each Task row has a "Project" cell. Click it and a picker appears listing Project rows; choose one (or several).
π‘ One or many?
By default a relation lets you pick multiple related rows (a task could touch two projects). In the relation's settings you can limit it to a single related page when a task should belong to exactly one project. Choosing "limit to 1" keeps your data tidy and makes rollups behave predictably.
Here's the Tasks database with a new Project relation column. Notice the relation cells hold the name of a Project page, not typed text:
| Task | Status | Project Relation |
|---|---|---|
| Pick a template | Done | π Website Redesign |
| Write copy | In progress | π Website Redesign |
| Book movers | Not started | π Move Apartment |
| Change address | Not started | π Move Apartment |
One-Way, Two-Way & Self-Relations
When you create a relation you choose whether it's visible on one side or both.
Two-way (synced) relations
A two-way relation shows the link on both databases. Add a Project to a Task, and that Task automatically appears in a "Tasks" property on the Project β Notion keeps both ends in sync. This is what you almost always want, because it's what lets a Project "see" all its tasks (and roll them up).
| Project | Tasks Relation (synced) |
|---|---|
| Website Redesign | π Pick a template, π Write copy |
| Move Apartment | π Book movers, π Change address |
You never typed these Tasks into the Project β they appeared because the relation is two-way. Set a Task's Project and it shows up here instantly; clear it and it disappears from here.
One-way relations
A one-way relation shows the link on only the side you created it on. The Task knows its Project, but the Project has no "Tasks" property cluttering it. Use one-way when you only ever need to travel the link in one direction and don't want a return column β for example, tagging notes with a "Related area" you don't need the area to list back.
Self-relations
A relation can point a database at itself. This is a self-relation, and it's how you express hierarchy or dependency within one database:
- A Tasks database with a "Blocked by" self-relation β a task links to the tasks it depends on.
- A Projects database with a "Parent project" / "Sub-projects" self-relation for nesting.
- A Notes/wiki database with a "Related notes" self-relation to build a web of linked ideas.
β οΈ Two-way is (usually) the safe default
If you're not sure, make relations two-way. You can hide the return property in a view if you don't want to look at it, but you can't roll up across a link the target side can't see. Switching a relation from one-way to two-way later is possible but can be fiddly β starting two-way saves you a headache.
Rollups: Pulling Info Across the Link
A relation gives you the string between two databases. A rollup is what walks that string and brings information back. A rollup is a property you add to the database that has the relation, and it answers a question about the related rows on the other end.
π Definition
Rollup: A property that reaches through a relation, looks at a chosen property on the related rows, and aggregates it into a single value β a count, a sum, an average, the latest date, and so on. Rollups are read-only: they compute, they don't store.
Every rollup needs three answers
When you add a rollup property, Notion asks you three things. Get these three right and rollups are easy:
- Relation β which link do I follow? (e.g. the "Tasks" relation on a Project)
- Property β what do I read on the far end? (e.g. the Task's "Status" or "Done" checkbox)
- Calculate β how do I summarize it? (e.g. Count, Percent checked, Sum)
Rollup: "Open tasks"
Relation: Tasks
Property: Status
Calculate: Count where Status is not Done (Count β then filter)
Read it as a sentence: "Follow my Tasks relation, look at each task's Status, and count the ones that aren't Done." That single property now shows a live number on every Project, updating the instant a task's status changes.
π‘ Rollups can point at other rollups & formulas
The "property" a rollup reads can itself be a formula or even another rollup on the related rows. That's how people build multi-level summaries (tasks roll into projects, projects roll into a goal). You don't need this today β just know the door is open when your system grows.
Rollup Calculations
The Calculate option is where a rollup earns its keep. The choices you'll actually use most often:
| Calculation | What it gives you | Great for⦠|
|---|---|---|
| Count (all / values / unique) | How many related rows | "Number of tasks in this project" |
| Count per group | How many in each value of a property | Tasks broken down by Status |
| Percent per group | Share of related rows with a value | "% of tasks that are Done" |
| Percent checked / unchecked | Share of a checkbox that's ticked | Progress from a Done checkbox β percent complete |
| Sum | Adds a number across related rows | Total hours or budget of a project's tasks |
| Average / Median / Min / Max | Stats on a number property | Average task estimate |
| Earliest / Latest date Β· Date range | Oldest, newest, or span of dates | Project's next due date, or its timeline |
| Show original / unique values | Displays the values themselves, not a number | Listing each task's status inline |
β Two recipes you'll use constantly
1. Count open tasks β relation Tasks, property Status, calculate Count
(or use "Count per group" and read the "Not started / In progress" bucket).
2. Percent complete β give each Task a Done checkbox, then roll it up
with relation Tasks, property Done, calculate Percent checked. You now have a 0β100% progress
number per project, free.
β οΈ Percent checked needs a checkbox
"Percent checked" reads a checkbox property. If your tasks use a Status property (Not started / In progress / Done) instead, use Percent per group and read the "Done" slice β or add a simple Done checkbox alongside Status. In Lesson 4.2 you'll learn a formula that turns a percent into a little π©π©β¬β¬ progress bar.
Worked Example: Projects & Tasks
Let's assemble the whole picture. We have two databases, related two-way, with two rollups on the Projects side. First, the Tasks database (each task belongs to one project, and has a Done checkbox):
| Task | Done Checkbox | Project Relation |
|---|---|---|
| Pick a template | β | π Website Redesign |
| Write copy | β¬ | π Website Redesign |
| Ship homepage | β¬ | π Website Redesign |
| Book movers | β | π Move Apartment |
| Change address | β¬ | π Move Apartment |
Now the Projects database. It has the synced Tasks relation plus two rollups β Task count (Count) and % complete (Percent checked on Done):
| Project | Tasks Relation | Task count Rollup | % complete Rollup |
|---|---|---|---|
| Website Redesign | π 3 tasks | 3 | 33% |
| Move Apartment | π 2 tasks | 2 | 50% |
Nobody typed "3" or "33%". Check off "Write copy" and Website Redesign's % complete jumps to 67% by itself. Add a new task and point it at a project, and that project's count ticks up. This is the connected system β data entered once, summaries everywhere, always current.
π§ Mindset
Sit with that table for a second. A Project row is now a tiny live dashboard of its own tasks, and you built it with one relation and two rollups. Every impressive Notion "second brain" or "PARA system" you've seen is fundamentally this move repeated: relate two databases, roll up the useful bits. You now know the move.
π― Project: Build the Connected System
You'll create a Projects database, relate your existing Tasks database to it, and add rollups so each project shows its task count and percent complete. Everything here works on the Free plan β relations and rollups are core features, not paid add-ons.
ποΈ Relate Tasks to Projects, then roll them up
Objective: A Projects database whose rows automatically count their related tasks and show a live percent complete.
Instructions (about 35 minutes):
- (5 min) Create a new database called Projects. Give it a couple of rows (real projects you're working on). A "Status" select is nice but optional.
- (3 min) Make sure your Tasks database has a Done checkbox property. Add one if it only has a Status.
- (6 min) In Tasks, add a property of type Relation β target Projects. Turn on "Show on Projects" (two-way). Optionally limit it to a single related page.
- (5 min) Assign each task to a project by clicking its new Project cell and picking a project. Watch the tasks appear on the Projects side automatically.
- (6 min) In Projects, add a Rollup property named "Task count": relation = Tasks, property = Name (or any), calculate = Count.
- (6 min) Add a second Rollup named "% complete": relation = Tasks, property = Done, calculate = Percent checked.
- (4 min) Test it: check off a task and confirm the project's % complete rises on its own. Add a new task tied to a project and confirm the count updates.
π‘ Hint β the exact rollup settings
Projects βΈ new property βΈ Rollup βΈ "Task count"
Relation: Tasks
Property: Name
Calculate: Count all
Projects βΈ new property βΈ Rollup βΈ "% complete"
Relation: Tasks
Property: Done (a checkbox)
Calculate: Percent checked
No "Done" checkbox and only a Status property? Use calculate = Percent per group and read the "Done" group, or add a Done checkbox β either works.
β Project Completion Checklist
- You created a Projects database with at least two real projects
- Your Tasks database has a two-way Relation to Projects
- Each task is assigned to a project, and tasks appear on the Projects side automatically
- A "Task count" rollup shows the number of tasks per project
- A "% complete" rollup shows a live percentage per project
- Checking a task off updates its project's % complete without any manual edit
π― Quick Quiz
Question 1: What is the job of a relation property?
Question 2: You want each Project to show the percent of its tasks that are finished (tasks have a Done checkbox). Which rollup calculation do you pick?
Best Practices for Relations & Rollups
β Do's
- Default to two-way relations. The return side is what makes rollups possible.
- Name rollups for the answer, not the mechanism. "Open tasks" beats "Rollup 1".
- Limit a relation to one page when a row truly belongs to only one thing β it keeps rollups predictable.
- Add a Done checkbox if you want easy "percent checked" progress numbers.
β Don'ts
- Don't retype related data. If you're copying a project name into a task by hand, you want a relation.
- Don't over-relate. Not every database needs to touch every other. Connect what you'll actually roll up.
- Don't expect to edit a rollup. Rollups are read-only summaries; change the source rows instead.
π Learning Journal
Keep a learning journal β for this course, the best place is inside your own Notion. After each lesson, take a few minutes to write down:
- Key concepts you learned
- Techniques that clicked for you
- Questions or confusion points to revisit
- Ideas you want to try
- Your progress and feelings about learning this
βοΈ This lesson's prompt: Name two databases in your life that secretly "belong to" each other (tasksβprojects, booksβauthors, notesβmeetings, expensesβtrips). What one number would you love to see rolled up from one onto the other β and why would that number change how you work?
π Lesson Summary
π Key Takeaways
- A relation is a property that links a row to rows in another database (or the same one).
- Two-way (synced) relations show the link on both sides β the usual default; one-way shows it on one; self-relations link a database to itself.
- A rollup follows a relation, reads a property on the related rows, and aggregates it β read-only.
- Every rollup answers three questions: which relation, which property, which calculation.
- The two everyday recipes: Count for "how many," and Percent checked for "percent complete."
- Relations and rollups are Free-plan features and are the heart of Notion as a connected system.
π What You've Accomplished
You connected two databases and made one of them report on the other β automatically and forever. A Project now knows how many tasks it has and how far along it is, without you tallying anything. This is the single biggest leap in the whole course, and you just made it.
β Common Questions at This Stage
What's the difference between a relation and a rollup, in one line?
A relation is the link between rows; a rollup is a summary that travels that link and brings a number (or values) back. No relation, no rollup β the rollup needs a link to follow.
Can I relate more than two databases together?
Yes. A database can have many relations, and you can chain them β Tasks β Projects β Goals β with rollups that even summarize other rollups. Build it gradually; start with one relation you actually need before adding a web of them.
My rollup shows a blank or "0". What went wrong?
Usually one of three things: the relation has no related rows yet (assign some), you picked the wrong property to read, or the calculation doesn't fit the property (e.g. "Percent checked" on something that isn't a checkbox). Re-open the rollup settings and check all three answers.
π Looking Ahead
You've seen rollups hint at something bigger β turning data into new information. Next module opens with Formulas 2.0: Thinking in Formulas, a gentle introduction to Notion's formula property. You'll learn to compute your own values (like an "Overdue?" flag) one small, approachable step at a time.
β Before the Next Lesson
- Keep your related Projects + Tasks databases β formulas will build on them
- Make sure at least one task has a Due date (we'll compute against it next lesson)
- Write your Learning Journal entry for this lesson
π Additional Resources
π Encouragement for the Journey
If relations and rollups felt like a big step β good. It is the big step, and you took it. Everything from here is variations on the move you just learned: connect, then summarize. Your workspace is no longer a stack of separate lists. It's a system. π