Notionのリレーションとロールアップ:2つのデータベースをつなぐ

公開 書いた人 大林 諒

Notion(ノーション)のデータベースを2つ3つ作ると、すぐに「この体験申込はどのレッスンの話か」「このレッスンに何人申し込んでいるか」を行き来したくなります。そのとき使うのがリレーションとロールアップです。リレーションは2つのデータベースのページ同士をつなぐプロパティで、ロールアップはつないだ先のページの値を数えたり合計したりするプロパティです。この記事では、レッスン予定と体験申込をつなぐところから始めて、講師のシフトとタスクまでつなぎ、レッスンごとの申込数と講師ごとの担当数をロールアップで出すところまで、2026年10月時点のNotion ヘルプセンターの表記で書きます。前提として、データベースを1つ以上作ったことがあり、プロパティの追加ができるものとします。例は全記事で共通の、スタッフ6名ほどの予約制の小さな料理教室「サンプル料理教室」のワークスペースです。

この記事の内容
  1. リレーションとロールアップは何をするものか
  2. 先に決めること
  3. サンプル料理教室のつながりと、作るプロパティの一覧
  4. リレーションを作る手順
  5. ロールアップで集計する手順
  6. 応用
  7. リレーションを増やしすぎたときの問題と、つなぐ・つながないの判断
  8. できないことと、その代わり
  9. よく詰まるところ
  10. 次にやること

リレーションとロールアップは何をするものか

サンプル料理教室には、レッスン予定(日時・講師・メニュー・定員・申込数)と体験申込(名前・申込日・申込経路・体験日・入会したか)の2つのデータベースがあります。リレーションが無いと、体験申込の「体験日」に日付を入れるだけで、その日のどのレッスンに入るのかは受付の頭の中にしかありません。土曜に昼と夜の2回レッスンがある日は、日付だけでは区別がつきません。

体験申込に「体験するレッスン」というリレーションのプロパティを足し、レッスン予定のページを選べるようにすると、体験申込の1行から「11月7日(土)昼・季節の和食」のページへ飛べます。両方向に表示する設定にしておけば、レッスン予定の側にも「体験の申込」というプロパティが自動ででき、そのレッスンに入る体験申込が並びます。片方を直せば、もう片方にも反映されます。

ロールアップは、そのつながりの上で計算します。レッスン予定に「体験の人数」というロールアップを足し、「体験の申込」のリレーションを「すべてカウント」で数えれば、レッスンごとの体験の人数が数字で出ます。手で数えて「申込数」に打ち込む作業が要らなくなります。

Excelで言えば、リレーションは別のシートの行を指す番号、ロールアップはその番号で引いてきた値をCOUNTIFやSUMIFで集計する列にあたります。違うのは、番号を手で合わせなくても、ページを選ぶだけでつながる点です。

体験申込のデータベースで、「体験するレッスン」のリレーションのセルにレッスン予定のページ名が出ている表ビュー
体験申込のデータベースで、「体験するレッスン」のリレーションのセルにレッスン予定のページ名が出ている表ビュー

先に決めること

リレーションは後から足せますが、つなぐ向きと単位を決めずに作ると、同じ意味のリレーションが2本できたり、ロールアップで数えたい数が出せなかったりして作り直しになります。始める前に次の4つを決めます。

1つ目は、どちらを「1」、どちらを「たくさん」にするかです。1つのレッスンには体験申込が何件も入りますが、1件の体験申込が入るレッスンは1つです。この「1対たくさん」の関係を先に紙に書きます。たくさん側(体験申込)にリレーションを作り、1件しか選べないように制限すると、入力の間違いが減ります。

2つ目は、両方向に表示するかです。ヘルプによると、異なるデータベースの間のリレーションは、初期状態では一方向です。一方向のままだと、体験申込の側からしかレッスンが見えません。ロールアップで「レッスンごとの人数」を出すなら、レッスン予定の側にもリレーションのプロパティが要るので、両方向にします。

3つ目は、何を1ページにするかです。講師ごとの担当数を出したいとき、レッスン予定の「講師」が人物のプロパティのままだと、講師1人を1ページとして持つデータベースがありません。ロールアップは「つないだ先のページ」を数える仕組みなので、数えたい単位が1ページになっているデータベースが必要です。サンプル料理教室では、講師のシフトのデータベースを「講師A 2026年11月」のように講師ごと・月ごとに1ページにし、そこから担当するレッスンへつなぎます。

4つ目は、つなぐ相手のデータベースを誰が見られるかです。リレーションのセルに出るのは相手のデータベースのページです。開発者向けのドキュメントには、相手にアクセスできないとリレーションが空になったり、ロールアップが不完全になったりすることがある、と書かれています。相手のページを開けない人にとっては、つないでいても役に立たないものと考えて置き場所を決めます。体験申込は受付のチームスペース、レッスン予定は教室全体のチームスペースに置き、講師も受付もレッスン予定を見られる形にします。代表だけの経営メモのデータベースには、ほかのデータベースからリレーションを張りません。

サンプル料理教室のつながりと、作るプロパティの一覧

この記事で作るつながりを図にします。矢印の向きは「どちらのデータベースでリレーションを作ったか」で、どれも両方向に表示します。

             講師のシフト
       (講師A 2026年11月 など)
                 |
          担当するレッスン
           (1対たくさん)
                 |
  タスク ---- レッスン予定 ---- 体験申込
 関連する     (日時・講師・    体験するレッスン
 レッスン      メニュー・定員)  (1件だけ選べる)
(たくさん                      (たくさん対1)
  対1)
  |
 先にやるタスク
(同じデータベースの中で自分につなぐ)
レッスン予定のページを開いたところ。「体験の申込」「関連するタスク」「担当する講師のシフト」の3つのリレーションと、ロールアップの「体験の人数」が並んでいるプロパティ欄
レッスン予定のページを開いたところ。「体験の申込」「関連するタスク」「担当する講師のシフト」の3つのリレーションと、ロールアップの「体験の人数」が並んでいるプロパティ欄

作るプロパティを、どのデータベースに作るかの一覧にします。両方向にすると相手側にも自動でプロパティができるので、相手側の欄にはその名前を書きます。

作る場所プロパティ名種類つなぐ先相手側にできる名前選べるページの数
体験申込体験するレッスンリレーションレッスン予定体験の申込1ページ
タスク関連するレッスンリレーションレッスン予定関連するタスク無制限
講師のシフト担当するレッスンリレーションレッスン予定担当する講師のシフト無制限
タスク先にやるタスクリレーションこのデータベースなし(1つのプロパティで両方向)無制限
レッスン予定体験の人数ロールアップ体験の申込なしなし
レッスン予定残りの席数式定員と体験の人数なしなし
講師のシフト担当数ロールアップ担当するレッスンなしなし
講師のシフト担当レッスンの申込数の合計ロールアップ担当するレッスンなしなし

リレーションを作る手順

体験申込からレッスン予定へつなぐ

  1. 体験申込のデータベースを開く
  2. 表ビューのいちばん右の列見出しの「+」を押す
  3. プロパティの名前に「体験するレッスン」と入れる
  4. プロパティの種類から「リレーション」を選ぶ
  5. 接続先のデータベースを検索して「レッスン予定」を選ぶ
  6. 「レッスン予定に表示」のトグルをオンにする
  7. 相手側に作られるプロパティの名前に「体験の申込」と入れる
  8. 選べるページの数を「1ページ」と「無制限」のうち「1ページ」にする
  9. 両方向のプレビューを見て、つなぐ向きが合っているか確かめる
  10. 青い「リレーションを追加」を押す
リレーションの設定パネルで、接続先が「レッスン予定」、「レッスン予定に表示」のトグルがオン、選べるページの数が「1ページ」になっているところ
リレーションの設定パネルで、接続先が「レッスン予定」、「レッスン予定に表示」のトグルがオン、選べるページの数が「1ページ」になっているところ

手順6のトグルが、両方向に表示するかの選択です。ヘルプでは「[関連データベース名]に表示」と書かれ、オンにすると相手のデータベースにも対応するプロパティができ、片方で編集した内容がもう片方にも同期されます。オフのままでも体験申込の側からレッスンは選べますが、レッスン予定の側には何も出ません。

手順8は、ヘルプでは選べるページの数を「1ページ」と「無制限」から選ぶ設定として書かれています(設定欄の名前はヘルプに書かれていないので、この記事では「選べるページの数」と呼びます)。「1ページ」にすると1件しか選べなくなるので、1件の体験申込に2つのレッスンを入れてしまう間違いが起きません。ヘルプでも、注文番号を1つに限定する場合の例として書かれています。

セルでページを選ぶ

  1. 体験申込の1行の「体験するレッスン」のセルを押す
  2. 出てきた検索欄に「11/7」や「和食」のようにレッスン予定のページ名の一部を入れる
  3. リストに出たページ名を押す
  4. 間違えたときは、選んだページにカーソルを合わせて右側の「–」を押して外す
「体験するレッスン」のセルを押したときの検索メニュー。レッスン予定のページ名が候補として並んでいるところ
「体験するレッスン」のセルを押したときの検索メニュー。レッスン予定のページ名が候補として並んでいるところ

候補に出るのは相手のデータベースのページの名前(タイトルのプロパティ)です。レッスン予定のページ名が「季節の和食」だけだと、毎週同じ名前が並んで選べません。サンプル料理教室では、レッスン予定のタイトルを「11/7(土)昼 季節の和食」のように日付・時間帯・メニューの順で入れる決まりにしています。リレーションを使い始める前に、相手側のタイトルの付け方を揃えておくと、選び間違いがほぼ無くなります。

リレーションの欄に相手のプロパティも出す

体験申込の側から見ると、レッスンのページ名だけでなく講師も一緒に見えると便利です。

  1. 体験申込のページを1つ開く
  2. 「体験するレッスン」の欄を押し、「•••」を押す
  3. 開いたメニューで、レッスン予定の「講師」を「リレーションで表示」の欄へドラッグする

ヘルプによると、この設定はそのデータベースの全ページに適用されます。1ページで設定すれば、ほかの体験申込にも同じ形で出ます。

リレーションの欄そのものを出すかどうかは、プロパティの「プロパティの表示/非表示」で「常に表示」「未入力時は非表示」「常に非表示」から選べます。タスクのように関連するレッスンが空のことが多いデータベースは「未入力時は非表示」にすると、ページを開いたときの欄がすっきりします。

同じデータベースの中で自分につなぐ

リレーションの接続先には、自分自身のデータベースも選べます。タスクで「この作業の前に終わっていないといけない作業」を表すときに使います。

  1. タスクのデータベースで新しいプロパティを足し、名前を「先にやるタスク」にする
  2. 種類で「リレーション」を選ぶ
  3. 接続先で「このデータベース」を選ぶ
  4. 両方向のトグル(ヘルプの表記では「Two-way relation」)はオフのままにする
  5. 「リレーションを追加」を押す

ヘルプによると、両方向をオフのままにすると1つのプロパティで両方向に働き、タスクAにBを入れるとBにもAが出ます。「チラシの原稿を作る」の「先にやるタスク」に「冬の新メニューを決める」を入れると、「冬の新メニューを決める」の側にも「チラシの原稿を作る」が出ます。どちらが先かは、プロパティ名の意味でしか表せません。

前後をはっきり分けたいときは、両方向をオンにします。すると方向ごとに別のプロパティを作れ、「前のタスク」と「次のタスク」のように分かれます。一方に入れると、もう一方が自動で更新されます。サンプル料理教室では前後を分ける作業が少ないので、オフのまま1つにしています。

同じデータベースの中のつなぎ方は、マニュアルの「関連するマニュアル」(受付対応のページから衛生のページへ)にも使えます。

タスクのデータベースで、接続先に「このデータベース」を選び、両方向のトグルがオフになっているリレーションの設定
タスクのデータベースで、接続先に「このデータベース」を選び、両方向のトグルがオフになっているリレーションの設定

接続先を間違えたとき

接続先のデータベースを間違えたときは、そのプロパティの種類からもう一度「リレーション」を選び、新しいデータベースを選び直します。それまでに選んでいたのは前のデータベースのページなので、新しい接続先のページを選び直すことになります。何十行も入れたあとに気づくと入れ直しになるので、手順9のプレビューで向きを確かめるのが一番の予防です。

ロールアップで集計する手順

ロールアップは、先にリレーションがあるデータベースにしか作れません。

レッスンごとの体験の人数を出す

  1. レッスン予定のデータベースで新しいプロパティを足し、名前を「体験の人数」にする
  2. 種類で「ロールアップ」を選ぶ
  3. セルを押して設定を開く
  4. リレーションで「体験の申込」を選ぶ
  5. プロパティで「名前」を選ぶ
  6. 計算で「すべてカウント」を選ぶ
ロールアップの設定で、リレーションが「体験の申込」、プロパティが「名前」、計算が「すべてカウント」になっているところ
ロールアップの設定で、リレーションが「体験の申込」、プロパティが「名前」、計算が「すべてカウント」になっているところ

これで、レッスンごとに体験申込が何件つながっているかが数字で出ます。体験申込で「体験するレッスン」を選んだ瞬間に、レッスン予定の「体験の人数」が1つ増えます。

レッスン予定の「申込数」は、外部の予約システム(reserve.example)で受けた通常の予約の人数を受付が打ち込んでいる数字です。体験の人数はNotionの中で数え、通常の予約は打ち込み、という分け方にして、定員との差は数式で出します。

prop("定員") - prop("申込数") - prop("体験の人数")

この式を「残りの席」という数式のプロパティに入れると、受付は残りの席が0より大きいレッスンにだけ体験を入れればよくなります。

入会した人だけを数えたいときは、ロールアップでは条件を付けられないので、数式でリレーションを直接たどります。体験申込の「入会したか」がチェックボックスなら次のようになります。

prop("体験の申込").filter(current.prop("入会したか")).length()

数式の書き方は、Notionの数式(関数):期限・進み具合・金額をよく使う式で計算する、の記事で詳しく書きます。

講師ごとの担当数と申込数の合計を出す

講師のシフトの「担当するレッスン」に、その月に担当するレッスン予定のページを選んでおきます。

  1. 講師のシフトのデータベースで新しいプロパティを足し、名前を「担当数」にする
  2. 種類で「ロールアップ」を選ぶ
  3. リレーションで「担当するレッスン」、プロパティで「名前」、計算で「すべてカウント」を選ぶ
  4. もう1つプロパティを足し、名前を「担当レッスンの申込数の合計」にする
  5. 種類で「ロールアップ」を選ぶ
  6. リレーションで「担当するレッスン」、プロパティで「申込数」、計算で「合計」を選ぶ
  7. 数値の書式と小数点の表示桁数を選ぶ(人数なので「数値」・小数点なし)
講師のシフトの表ビュー。「講師A 2026年11月」「講師B 2026年11月」の行に「担当数」と「担当レッスンの申込数の合計」が数字で並んでいるところ
講師のシフトの表ビュー。「講師A 2026年11月」「講師B 2026年11月」の行に「担当数」と「担当レッスンの申込数の合計」が数字で並んでいるところ

表ビューやボードでは、ロールアップの列全体の集計も出せます。ヘルプの手順では、ロールアップのプロパティ名を押して「計算」→「その他のオプション」から「合計」などを選びます。「担当数」で「合計」を選べば、11月の担当数の合計が出ます。

計算の種類

ヘルプにあるロールアップの計算の種類と、サンプル料理教室で使う場面の一覧です。

計算使えるプロパティ出る値サンプル料理教室での使い道
オリジナルを表示するすべてつないだ先の値をそのまま並べるレッスン予定に体験者の申込経路を並べて見る
一意の値を表示するすべて重複を除いて並べる講師のシフトに担当メニューの種類を並べる
すべてカウントすべてつないだページの数レッスンごとの体験の人数、講師ごとの担当数
値の数をカウントすべて値の数複数選択のタグの数を数える
一意の値の数をカウントすべて重複を除いた値の数講師が月に何種類のメニューを持ったか
未入力をカウントすべて空の数体験日が空の申込が何件あるか
未入力以外をカウントすべて空でない数担当が入っているタスクの数
未入力の割合すべて空の割合関連タスクの期限の入れ漏れの割合
未入力以外の割合すべて空でない割合入力の進み具合を見る
合計数値足した値担当レッスンの申込数の合計
平均数値平均1レッスンあたりの申込数
中央値数値中央値申込数の偏りを見る
最小数値いちばん小さい値いちばん空いているレッスンの申込数
最大数値いちばん大きい値いちばん埋まっているレッスンの申込数
範囲数値最大から最小を引いた値担当レッスンの申込数のばらつき
最も古い日付日付いちばん前の日付その月の最初の担当日
最も新しい日付日付いちばん後の日付その月の最後の担当日
期間日付最も古い日付から最も新しい日付までの長さタスクの関連レッスンが何日にわたるか

並べ替えに使えるのは、ロールアップの結果が数値になるときだけです。担当数で講師のシフトを多い順に並べるのはできますが、「オリジナルを表示する」で並べた講師名で並べ替えることはできません。

応用

タスクを関連するレッスンから見る

タスクの「関連するレッスン」を両方向にしておくと、レッスン予定のページを開いたときに「関連するタスク」の欄に、そのレッスンのための買い出しや器具の準備のタスクが並びます。レッスン予定のページの本文にリンクドビューでタスクを置き、「関連するレッスン」がこのページのものだけに絞り込むと、状態と担当まで一覧で見えます。講師は自分のレッスンのページを開くだけで、準備が終わっているかを確かめられます。

レッスン予定のページ本文に置いたタスクのリンクドビュー。関連するレッスンがこのページのものだけに絞られ、担当・期限・状態が見えているところ
レッスン予定のページ本文に置いたタスクのリンクドビュー。関連するレッスンがこのページのものだけに絞られ、担当・期限・状態が見えているところ

ロールアップの結果をさらに数式で使う

ロールアップの結果は数式から prop("体験の人数") のように読めます。ただし、ヘルプによると、ロールアップを別のロールアップの対象にすることは、循環参照のおそれがあるためできません。講師のシフトから「担当するレッスン」の「体験の人数」を合計したいときは、ロールアップではなく数式で、つないだ先の値を直接読む方法を試します。数式2.0では、リレーションでつないだ先のプロパティを数式から読めます。

prop("担当するレッスン").map(current.prop("体験の人数")).sum()

ヘルプによると、数式がほかの数式やロールアップを参照するたびに「数式の深さ」が1つ増え、データベースをまたいでも数えられます。ロールアップを数式で読む形は、この深さを使います。うまく計算されるかは、本番のデータベースで作る前に、複製したデータベースで試してから入れます。

リレーションを増やしすぎたときの問題と、つなぐ・つながないの判断

本番のワークスペースで起きやすいのは、思いつくたびにリレーションを足して、1つのデータベースにリレーションが10本近く並ぶ状態です。こうなると次のことが起きます。

  • ページを開いたときの欄が多くなり、どれに入れればいいか分からなくなる
  • 似た意味のリレーションが2本でき(「関連するレッスン」と「対象のレッスン」)、半分ずつしか入っていない
  • 両方向にしたために、相手側のデータベースにもプロパティが増え、相手側の持ち主が知らないうちに欄が増えている
  • ヘルプによると、数式やロールアップが複雑なほどデータベースの動作は重くなる可能性があり、数式やロールアップにフィルターや並べ替えをかけたデータベースは読み込みに時間がかかることがある
  • データベースを複製したとき、ヘルプによるとリレーションは双方向から一方向の同期に変わるので、本数が多いほど直す手間が増える

サンプル料理教室では、次の基準でつなぐかどうかを決めています。

こういうときはつなぐ・つながない代わりの手
つないだ先の数や合計を出したいつなぐなし
相手のページへ毎回飛びたいつなぐなし
一覧で絞り込みたいだけで、値の種類が数個つながないセレクトや人物のプロパティ
人を選びたいだけ(担当者)つながない人物のプロパティ
相手のデータベースを見られない人が多いつながないページの本文にリンクを書く
一度だけ参照すれば済むつながないページへのメンション
ほぼ同じ意味のリレーションがもうあるつながない既存のリレーションを使う

迷ったら「そのリレーションでロールアップを作る予定があるか」で決めます。数える予定が無く、見に行くことも少ないなら、メンションで足ります。

できないことと、その代わり

できないこと理由・ヘルプの記載代わりの手
ロールアップのロールアップ循環参照のおそれがあるため作れない数式でつないだ先の値を直接読む(複製で試してから使う)
ロールアップに条件を付けて数える計算の種類に条件の指定が無い数式で filter() を使ってリレーションをたどる
数値以外のロールアップで並べ替え並べ替えは出力が数値の場合のみ数で並べたいなら「すべてカウント」などに変える
CSVでリレーションを持ち出して戻すCSVではURLの文字として書き出され、再インポートで再構築できない移すときはデータベースごと移すか、APIで取る
複製したデータベースで双方向のまま使う複製すると一方向の同期に変わる複製後に両方向の設定をし直す
細かい権限で列ごとに見せ分ける(ビジネス未満)プロパティアクセスはビジネスプランとエンタープライズプランの機能見せたくない情報は別のデータベースに分ける
大量の行(数万件の明細)をつないで集計する動作が重くなる明細の集計はスプレッドシートやkintoneに任せる

最後の行は、Notionに向かない仕事です。予約の明細や月謝の入金のように、毎日何十行も増え、件数や金額を正確に締める台帳は、外部の予約システムや会計ソフト、kintoneのような業務アプリのほうが向いています。サンプル料理教室でも、通常レッスンの予約はreserve.exampleに置いたまま、Notionには人が見て判断する情報だけを持たせています。

レッスン予定のデータベースのプロパティ一覧。リレーション3本・ロールアップ1本・数式1本に絞った状態
レッスン予定のデータベースのプロパティ一覧。リレーション3本・ロールアップ1本・数式1本に絞った状態

よく詰まるところ

症状原因直し方
受付にはレッスン名が見えるのに、外部のデザイナーには見えない相手のデータベースのページを開く権限が無い見せたい人を相手のデータベース(またはそのチームスペース)に入れる。見せたくないならつながない
片方のデータベースにしかリレーションの欄が出ない作るときに「[関連データベース名]に表示」のトグルをオフにしたリレーションの設定を開いてトグルをオンにし、相手側のプロパティ名を付ける
ロールアップが全部0や空になるリレーションにページが入っていない、または対象のプロパティを選び間違えたまずリレーションの欄に値が入っているか見る。次にロールアップの設定のリレーションとプロパティを確かめる
ロールアップのプロパティ選びで、別のロールアップが選べないロールアップのロールアップは作れない数式でつないだ先の値を直接読む。複製したデータベースで試してから本番に入れる
ロールアップで並べ替えができない出力が数値ではない計算を「すべてカウント」や「合計」にするか、数式で数に変える
データベースを複製したら、相手側に新しい行が出なくなった複製で双方向から一方向に変わった複製した側のリレーションの設定で両方向をオンにし直す
CSVで書き出したらリレーションがURLだらけになり、取り込み直しても戻らないCSVではリレーションはURLの文字になり、再インポートで再構築できないCSVは閲覧用と割り切り、移行はデータベースごと移すかAPIを使う
候補に同じ名前のページがいくつも出て選べない相手側のタイトルに日付が入っていない相手側のタイトルを「11/7(土)昼 季節の和食」の形に揃える
レッスン予定のビューが開くたびに遅いロールアップや数式にフィルター・並べ替えを重ねているフィルターは日付やセレクトなど単純なプロパティでかけ、使わないロールアップを消す
ビジネスプランで列を「アクセス不可」にしたら、ロールアップや数式が動かなくなった操作した人がその列へのアクセス権を持っていない同じ列を見られる人で同じ操作をして確かめ、プロパティアクセスを見直す
APIでリレーションを読むと25件しか返ってこないページの取得ではリレーションは25件までで、それ以上は has_more が true になるプロパティの値を個別にページ送りで取る

次にやること

リレーションとロールアップの土台は、それぞれのデータベースのプロパティ設計です。プロパティの種類と、何を1ページにするかの決め方は、Notionのデータベースの作り方:プロパティの種類と設計の決め方、で書いています。ロールアップで出した数を使って残りの席や入会率を計算するなら、Notionの数式(関数):期限・進み具合・金額をよく使う式で計算する、に進みます。

同じつなぎ方で、顧客と商談、商談と見積もりのような関係も作れます。体験申込を顧客として育てる形は、Notionで顧客管理・案件管理:小さな会社の簡単なCRMを作る、で書きます。タスクとレッスン(またはプロジェクト)をつないで日程を横に並べて見るなら、Notionでプロジェクト管理とガントチャート:タイムラインで進み具合を見る、が続きです。

あわせて読む