🔗 STEP 33: リレーションシップの設定
テーブルを正しく結ぶ!リレーションシップの実践マスター
📋 このステップで学ぶこと
- 自動検出されるリレーションシップの仕組み
- 手動でのリレーションシップ作成方法
- アクティブと非アクティブの使い分け
- クロスフィルター方向の設定
- リレーションシップの編集と削除
- よくあるトラブルと解決策
ゴール:複数のテーブルを正しく結び、フィルターが意図通りに機能するモデルを作れるようになる
🤖 1. 自動検出されるリレーションシップ
Power BIの自動検出機能
Power BIは、複数のテーブルを読み込むと、列名とデータ型を見て自動的にリレーションシップを作成しようとします。便利な機能ですが、必ず確認が必要です。
| 条件 | 説明 |
|---|---|
| 列名が完全一致 | 大文字小文字も区別される(「商品ID」と「商品id」は別扱い) |
| データ型が一致 | 両方とも整数、または両方ともテキストなど |
| 一方の列が一意 | 主キー側に重複がない(ディメンション側) |
| 値が存在する | 外部キーの値が主キー側に存在する |
【商品マスタテーブル】 【売上テーブル】
商品ID | 商品名 売上ID | 商品ID | 金額
───────┼────────── ───────┼────────┼──────
1 | りんご 101 | 1 | 500
2 | みかん 102 | 2 | 300
3 | ぶどう 103 | 1 | 500
104 | 3 | 800
列名「商品ID」が一致 → 自動的にリレーションシップが作成される!
商品マスタ(1) ─────→ 売上(*)
一意 重複あり
| 設定項目 | 操作方法 |
|---|---|
| 設定画面を開く | ファイル→オプションと設定→オプション→データの読み込み |
| 自動検出のオン/オフ | 「データの読み込み後に新しいリレーションシップを検出する」のチェック |
| 推奨設定 | オンにして、作成後に必ず確認する |
| 注意点 | 対策 |
|---|---|
| 意図しないリレーションシップ | モデルビューで確認し、不要なものは削除 |
| 検出されないケース | 列名やデータ型を揃えるか、手動で作成 |
| 誤った方向 | 編集画面でカーディナリティを確認・修正 |
🖱️ 2. 手動でのリレーションシップ作成
ドラッグ&ドロップで作成(最も簡単)
モデルビューで、一方のテーブルのフィールドをドラッグし、もう一方のテーブルの対応フィールドにドロップするだけで作成できます。
| 手順 | 操作内容 |
|---|---|
| 1 | モデルビューに切り替え(左サイドバーの🔗アイコン) |
| 2 | 一方のテーブルのフィールドをドラッグ(例:商品マスタの[商品ID]) |
| 3 | もう一方のテーブルの対応フィールドにドロップ(例:売上の[商品ID]) |
| 4 | リレーションシップ作成ダイアログが表示される |
| 5 | 設定を確認(カーディナリティ、クロスフィルター方向、アクティブ) |
| 6 | OK をクリック→2つのテーブル間に線が表示される |
| 手順 | 操作内容 |
|---|---|
| 1 | ホームタブ→「リレーションシップの管理」 |
| 2 | 「新規」ボタンをクリック |
| 3 | 1つ目のテーブルをドロップダウンから選択 |
| 4 | 列を選択(主キー側=一意の値を持つ列) |
| 5 | 2つ目のテーブルを選択→列を選択(外部キー側) |
| 6 | カーディナリティが自動判定される→確認してOK |
【スタースキーマ構成】
┌─────────────┐
│ 日付マスタ │
│ (1) │
└──────┬──────┘
│
┌─────────────┐ ┌────┴────┐ ┌─────────────┐
│ 商品マスタ │───│ 売上 │───│ 顧客マスタ │
│ (1) │ │ (*) │ │ (1) │
└─────────────┘ └─────────┘ └─────────────┘
作成するリレーションシップ:
① 商品マスタ.商品ID (1) → 売上.商品ID (*)
② 顧客マスタ.顧客ID (1) → 売上.顧客ID (*)
③ 日付マスタ.日付 (1) → 売上.注文日 (*)
| 方法 | メリット | 適した場面 |
|---|---|---|
| ドラッグ&ドロップ | 直感的、視覚的にわかりやすい | テーブルが少ない時、初心者向け |
| リボンメニュー | 詳細設定が可能、一覧で確認できる | テーブルが多い時、複雑なモデル |
⚡ 3. アクティブと非アクティブ
なぜ2種類あるのか?
同じテーブル間に複数のリレーションシップが必要な場合があります(例:売上テーブルに「注文日」と「出荷日」の2つの日付列がある場合)。Power BIでは、同じテーブル間に複数のアクティブなリレーションシップは作れないため、1つをアクティブ、他を非アクティブにします。
| 項目 | アクティブ | 非アクティブ |
|---|---|---|
| 表示 | 実線 | 点線 |
| フィルター伝播 | 自動的に伝播する | 自動的には伝播しない |
| ビジュアルでの使用 | 自動的に使用される | DAXで明示的に指定が必要 |
| 同テーブル間の数 | 1つのみ | 複数可 |
【売上テーブル】に2つの日付列がある場合 売上テーブル 日付マスタ ───────────── ───────── 売上ID 日付 注文日 ←─────────────────────── (アクティブ:実線) 出荷日 ←- - - - - - - - - - - (非アクティブ:点線) 金額 通常は「注文日」でフィルター → アクティブなリレーションシップを使用 出荷日でフィルターしたい時 → DAXでUSERELATIONSHIPを使用
// 出荷日ベースの売上合計を計算するメジャー
売上(出荷日ベース) =
CALCULATE(
SUM(売上[金額]),
USERELATIONSHIP(売上[出荷日], 日付マスタ[日付])
)
// USERELATIONSHIP関数で非アクティブなリレーションシップを一時的に有効化
| 手順 | 操作内容 |
|---|---|
| 1 | モデルビューでリレーションシップの線をダブルクリック |
| 2 | 「このリレーションシップをアクティブにする」のチェックを変更 |
| 3 | OK をクリック(注:他のアクティブなものが自動的に非アクティブに) |
↔️ 4. クロスフィルター方向
フィルターの伝わる方向を決める
クロスフィルター方向は、フィルターがどちら向きに伝播するかを決定します。基本は「単一方向」で、特殊なケースのみ「双方向」を使います。
| 項目 | 単一方向(推奨) | 双方向(慎重に) |
|---|---|---|
| 記号 | →(片方向) | ↔(両方向) |
| フィルターの流れ | ディメンション → ファクトのみ | 両方向に伝播 |
| パフォーマンス | 良い | 低下する可能性 |
| 予測可能性 | 高い | 予期しない結果のリスク |
| 使用場面 | ほとんどのケース | 多対多、ブリッジテーブル |
【単一方向の場合】 商品マスタ(1) ────→ 売上(*) ・商品マスタで「スマホ」を選択 → 売上はスマホのみ表示される ✓ ・売上で「東京店」をフィルター → 商品マスタには影響なし(全商品表示) 【双方向の場合】 商品マスタ(1) ←────→ 売上(*) ・商品マスタで「スマホ」を選択 → 売上はスマホのみ表示される ✓ ・売上で「東京店」をフィルター → 商品マスタも東京店で売れた商品のみ表示 ✓
| ケース | 説明 |
|---|---|
| 多対多のブリッジテーブル | 中間テーブルを経由してフィルターを伝播させる必要がある |
| セキュリティフィルター | 行レベルセキュリティでファクトからディメンションをフィルター |
| 特殊な分析要件 | 売上があった商品だけを商品リストに表示したい等 |
| リスク | 対策 |
|---|---|
| パフォーマンス低下 | 大規模データでは特に影響大、必要最小限に |
| 循環参照のリスク | 複数テーブル間で輪になる構造を避ける |
| 予期しない結果 | 設定後にビジュアルの動作を必ず検証 |
| あいまいな関係の警告 | 警告が出たらモデル構造を見直す |
✏️ 5. リレーションシップの編集と削除
作成後の変更方法
リレーションシップは作成後でも編集・削除ができます。間違いに気づいたら、すぐに修正しましょう。
| 方法 | 手順 |
|---|---|
| 線をダブルクリック | モデルビューでリレーションシップの線をダブルクリック→編集ダイアログ |
| リボンから | ホームタブ→リレーションシップの管理→選択→「編集」ボタン |
| 項目 | 説明 |
|---|---|
| カーディナリティ | 1対多、多対1、1対1、多対多(通常は自動判定が正しい) |
| クロスフィルター方向 | 単一または双方向 |
| アクティブ/非アクティブ | チェックボックスで切り替え |
| 列の変更 | 結ぶ列を変更(実質作り直しと同じ) |
| 方法 | 手順 |
|---|---|
| 線を右クリック | モデルビューで線を右クリック→「削除」→確認→「削除」 |
| リボンから | リレーションシップの管理→選択→「削除」ボタン→確認 |
| ケース | 理由 |
|---|---|
| 不要なもの | 使わないリレーションシップは削除してシンプルに |
| 誤って作られたもの | 自動検出で意図しないリレーションシップが作成された |
| 循環参照の原因 | エラーを解消するために削除が必要 |
| パフォーマンス悪化の原因 | 不要な双方向フィルターなど |
🔧 6. トラブルシューティング
よくあるエラーと解決策
リレーションシップの設定でつまずきやすいポイントと、その解決策を紹介します。
| 原因 | 解決策 |
|---|---|
| データ型の不一致 | Power Queryで両方の列のデータ型を揃える(整数⇔整数、テキスト⇔テキスト) |
| 多対多の関係 | ブリッジテーブルを作成するか、「多対多」カーディナリティを選択 |
| 循環参照が発生 | 不要なリレーションシップを削除してループを断つ |
| 原因 | 解決策 |
|---|---|
| リレーションシップが非アクティブ | アクティブに変更、またはUSERELATIONSHIPを使用 |
| クロスフィルター方向が逆 | 方向を確認し、必要なら双方向に変更 |
| リレーションシップが存在しない | モデルビューで確認し、必要なら作成 |
【循環参照の例】
テーブルA ──→ テーブルB ──→ テーブルC
↑ │
└──────────────────────────────┘
フィルターがぐるぐる回ってしまう!
【解決策】
1. 不要なリレーションシップを削除
2. 1つを非アクティブにする
3. 双方向を単一方向に変更
4. データモデルを再設計(スタースキーマに近づける)
| 確認項目 | チェックポイント |
|---|---|
| カーディナリティ | ディメンション(1) → ファクト(*) になっているか |
| 主キー側の一意性 | 「1」側の列に重複値がないか |
| 外部キーの参照整合性 | 「*」側の値が「1」側に存在するか |
| データ型 | 両方の列のデータ型が一致しているか |
| クロスフィルター方向 | 通常は単一方向になっているか |
| 循環参照 | テーブル間でループが発生していないか |
| 推奨 | 理由 |
|---|---|
| 不要なリレーションシップは削除 | シンプルなモデルはパフォーマンスが良い |
| 双方向フィルターは最小限 | 計算量が増えるため、本当に必要な場合のみ |
| 整数型のキーを使う | テキストよりも高速に処理される |
| スタースキーマを維持 | 中心にファクト、周りにディメンションの構造が最適 |
📝 STEP 33 のまとめ
- 自動検出:列名とデータ型で自動作成(必ず確認が必要)
- 手動作成:ドラッグ&ドロップまたはリボンメニューから
- アクティブ:実線、デフォルトで使用される
- 非アクティブ:点線、DAXで明示的に使用
- クロスフィルター:単一方向が基本、双方向は慎重に
- 編集・削除:線をダブルクリックまたは右クリック
- トラブル対応:データ型確認、循環参照の解消
リレーションシップの基本は「1対多」「単一方向」「アクティブ」です。
ディメンション(1)からファクト(*)へ、一方向のフィルターが流れる。
これさえ守れば、ほとんどの分析で困りません。
双方向や非アクティブは特殊なケースのみ。
シンプルに保つことが成功の鍵です!
📝 実践演習
2つのテーブル(売上と商品マスタ)を用意し、手動でリレーションシップを作成してください。アクティブで単一方向に設定してください。
| 手順 | 操作内容 |
|---|---|
| 1 | 2つのテーブルを読み込む(または作成) |
| 2 | モデルビュー(🔗)に切り替え |
| 3 | 商品マスタの[商品ID]を売上の[商品ID]にドラッグ&ドロップ |
| 4 | ダイアログでカーディナリティ:多対1、方向:単一、アクティブ:チェックを確認 |
| 5 | OK→実線で表示されることを確認 |
売上テーブルに「注文日」と「出荷日」の2つの日付列があります。日付マスタと2つのリレーションシップを作成し、一方をアクティブ、もう一方を非アクティブにしてください。
| 作業 | 操作内容 |
|---|---|
| 1つ目(アクティブ) | 日付マスタ[日付]→売上[注文日]をドラッグ&ドロップ、アクティブにチェック |
| 2つ目(非アクティブ) | 日付マスタ[日付]→売上[出荷日]をドラッグ&ドロップ、アクティブのチェックを外す |
| 確認 | 注文日への線:実線、出荷日への線:点線になっていることを確認 |
💡 DAXで非アクティブを使う:CALCULATE(SUM(売上[金額]), USERELATIONSHIP(売上[出荷日], 日付マスタ[日付]))
「循環参照が検出されました」というエラーを解決してください。モデルビューでリレーションシップを確認し、適切に修正してください。
| ステップ | 操作内容 |
|---|---|
| ①循環を特定 | モデルビューで線をたどり、輪になっている部分を探す(A→B→C→A) |
| ②原因を分析 | 本当に必要か?双方向が原因か?設計ミスか?を確認 |
| ③解決策を選択 | 不要なものを削除 / 非アクティブに / 双方向→単一方向に / モデル再設計 |
| ④検証 | ビジュアルが正しく動作するか、フィルターが期待通りかを確認 |
💡 予防策:スタースキーマを維持、ディメンション同士は直接結ばない、双方向は慎重に
❓ よくある質問
列名が一致していれば自動作成されますが、意図しないリレーションシップが作られることもあります。モデルビューで確認し、不要なものは削除しましょう。
通常の1対多のリレーションシップでは単一方向で十分です。双方向にするとパフォーマンスが低下し、予期しない動作を引き起こす可能性があります。
非アクティブなリレーションシップは、USERELATIONSHIP関数で明示的に使用できます。例えば、注文日と出荷日の両方で分析したい場合、片方を非アクティブにして残しておくと便利です。
①データ型が一致しているか
②主キー側に重複がないか
③外部キーの値が主キーに存在するか
④アクティブになっているか
⑤クロスフィルター方向が正しいか
特に、データ型の不一致が原因のことが多いです。
1対1の関係になるケースは稀で、多くの場合は同じテーブルに統合した方がシンプルになります。パフォーマンス上の理由で分ける場合などに限定的に使用します。
Power BIでは多対多のカーディナリティも選択できますが、パフォーマンスや予測可能性の観点から、ブリッジテーブルを経由した1対多の関係に分解することをおすすめします。
テーブルをドラッグして移動できます。スタースキーマの形(中心にファクト、周りにディメンション)に配置すると見やすくなります。また、Ctrl+マウスホイールでズームイン/アウトも可能です。
学習メモ
BIツール入門 - Step 33