こんにちは!開発チームのナレッジ管理やプロジェクトの進捗に、日々Notionを活用していることと思います。
「Notionのデータベースを使いこなし始めたぞ!リレーションで関連付け、ロールアップで親のデータを引っ張ってくる……って、あれ?『循環参照(無限ループ)』エラーが出て値が消えた……?」
そんな恐怖の赤文字エラーに直面して、冷や汗をかいた経験はありませんか?
または、「複数の階層をまたいでKPIを集計したいのに、計算がバグる……」と頭を抱えていないでしょうか。
今回は、Notionの奥深い「リレーション」と「ロールアップ」、そして「数式(Formula)」を組み合わせて、チームのベロシティを爆上げする高度なKPI集計ダッシュボードの作り方を、知的な先輩エンジニアとして優しく、かつ徹底的に論理的にお伝えします。
これをマスターすれば、情報のサイロ化を防ぎ、プロジェクトの状態が一目でわかる美しいダッシュボードが手に入りますよ。さあ、一緒にNotionのマスターへの階段を登りましょう!
—
1. そもそもNotionの「リレーション」と「ロールアップ」とは?(基礎の確認)
まずは、これからNotionを本格的に触る方にもわかりやすく、ツールの本質を整理しておきましょう。
- リレーション(Relation):
データベースとデータベースを「線で結ぶ」機能です。例えば、「プロジェクトDB」と「タスクDB」を繋ぎ、どのタスクがどのプロジェクトに属しているかを定義します。
- ロールアップ(Rollup):
リレーションで繋がった先のデータベースから、「データを引っ張ってきて集計する」機能です。「タスクDB」にある「見積もり工数」を、「プロジェクトDB」側で合計するといったことが可能になります。
この2つを組み合わせることで、バラバラだった情報が有機的に繋がり、単なるメモ帳だったNotionが「強力なリレーショナル・プロジェクト管理ツール」へと生まれ変わるのです。
—
2. 【最重要】みんながハマる「無限ループ(循環参照)」の正体と回避法
さて、本題です。複雑なデータベース構造を作っていくと、必ずと言っていいほど遭遇するのが「無限ループエラー(循環参照)」です。
なぜ無限ループが起きるのか?
原因はシンプルで、「AがBを参照し、BがさらにAを参照する(あるいはAに戻ってくる)ようなデータの輪(リング)を作ってしまうこと」です。
例えば、以下のような構造を作ったとします。
1. 「親タスクDB」から「子タスクDB」へリレーションを張る。
2. 子タスク側で「親のステータス」をロールアップで表示する。
3. ここまではセーフです。
しかし、もしあなたが以下のように欲張ってしまったら……?
- 「子タスクの進捗状況を親タスクでロールアップしたい」だけでなく、「親タスクの総数や進捗を、なぜか子タスク側からもリレーションし返して参照しようとした」
Notionはこれ検知した瞬間、パニックを起こします。「親のデータを見るために子を見て、子を見るために親を見て……終わらない!」と判断し、エラーを吐き出すのです。
無限ループを回避する3つの鉄則
これを防ぐための設計思想は、オブジェクト指向プログラミングにおける「単方向依存(Unidirectional Dependency)」の原則と全く同じです。
1. 階層構造(Hierarchy)を厳格に守る
データには必ず「上(親)」と「下(子)」の向きを決めましょう。矢印(リレーション)の向きが常に一方向(例:子から親へ)に向くように設計します。
2. 双方向リレーションの罠に気をつけておく
Notionでリレーションを作るとき、「双方向で表示」にチェックを入れると便利ですが、これが無秩序な参照を生む原因になります。集計用の中間データベースを作る際は、あえて片方向(単方向)に絞る勇気を持ちましょう。
3. 「孫」から「祖父」への直接参照を避ける
「プロジェクト」>「エピック」>「タスク」という3階層がある場合、「タスク」から直接「プロジェクト」の情報を複雑にロールアップし返そうとせず、一段ずつ(タスク→エピック、エピック→プロジェクト)経由させます。
—
3. 実践!パフォーマンスを落とさない高度なKPI集計ダッシュボードの構築
ここからは、実際の開発現場で即戦力となる「プロジェクトの進捗率(KPI)を自動計算するダッシュボード」の作り方をステップ・バイ・ステップで解説します。
今回は以下の2つのデータベースを用意します。
- データベースA:「プロジェクトDB」(親)
- データベースB:「タスクDB」(子)
ステップ1:リレーションの結線
まず、「タスクDB」側に「プロジェクト」という名前のリレーションプロパティを作成し、「プロジェクトDB」と結びつけます(もちろん双方向でOKです)。
ステップ2:ロールアップで「完了タスク数」と「総タスク数」を集計する
「プロジェクトDB」側に、タスクの進捗を測るためのロールアップを2つ用意します。
- プロパティ名:`総タスク`
- リレーション: `タスク`
- プロパティ: `名前`(またはステータス)
- 計算: `データの個数 (Count all)`
- プロパティ名:`完了タスク`
- リレーション: `タスク`
- プロパティ: `ステータス`
- 計算: `条件に一致する個数をカウント (Count values where…)` > ステータスが「完了」のもの
ステップ3:【奥義】数式(Formula)を組み合わせて美しいKPIを作る
ここで、ロールアップした値をそのまま表示するだけでは素人っぽくなってしまいます。最新のNotion Formula 2.0を使って、視覚的なプログレスバー付きの進捗率を計算しましょう!
「プロジェクトDB」に「数式(Formula)」プロパティを作成し、以下のスクリプトを貼り付けてください。
let(
/ 1. ロールアップから値を取得(未入力の場合は0とする) /
total, prop(“総タスク”),
done, prop(“完了タスク”),
/ 2. ゼロ除算エラーを防ぐガード節 /
rate, if(total == 0, 0, done / total),
/ 3. プログレスバーの見た目(10個のブロックで表現) /
filled, round(rate 10),
bar, slice(“██████████”, 0, filled) + slice(“░░░░░░░░░░”, 0, 10 – filled),
/ 4. 最終的な出力のフォーマット /
if(total == 0, “⚠️ タスク未登録”, bar + ” ” + (rate 100).round() + “% (” + done + “/” + total + “)”)
)
【このコードの素晴らしいポイント】
- ゼロ除算エラーの回避: タスクがまだ1つも登録されていないプロジェクトでエラー(NaN)が出ないよう、安全に `0` を返すガードを入れています。
- 直感的なUI: 視覚的なプログレスバー(`████░░░░░░ 40% (2/5)`)を自動生成するため、マネージャー層が一目で状況を把握できます。
—
4. チームのベロシティを落とさない!Notion設計の極意
最後に、データベースが巨大化してもNotionが重くならない(パフォーマンスを落とさない)ための、ナレッジマネージャーからの極意を授けます。
- 不要なロールアップの連鎖を断ち切る
ロールアップの先がさらにロールアップを読んでいるような構造(A→B→C→D)は、データの更新時にNotionの描画負荷を爆発させます。集計は「最大でも2階層まで」を目安に設計しましょう。
- アーカイブを活用したデータ量の制限
完了したプロジェクトや古いタスクは、定期的に別の「アーカイブ用データベース」に移動させるか、フィルタ機能を使ってビューから非表示にしましょう。DOMの数が増えすぎない工夫が、サクサク動くワークスペースを作ります。
—
まとめ:さあ、美しいダッシュボードを作ろう!
今回は、Notionのロールアップとリレーションで陥りがちな無限ループの回避法と、数式を組み合わせた高度なKPI集計ダッシュボードの構築法を解説しました。
- 循環参照は「単方向の依存関係」を意識して防ぐ!
- ロールアップとFormula 2.0を組み合わせれば、美しいプログレスバーも作れる!
- 階層を深くしすぎず、パフォーマンスに配慮した設計を心がける!
これをマスターすれば、あなたのチームの情報共有とプロジェクト管理は劇的にスムーズになり、毎日の作業が驚くほど楽になりますよ。
ぜひ今日の業務から、あなたのNotionワークスペースにこの知見を取り入れてみてください。あなたの開発ライフがよりクリエイティブで快適なものになることを、心から応援しています!