STEP 33:リレーションシップの設定

🔗 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) → 売上.注文日  (*)
💡 2つの作成方法の比較
方法 メリット 適した場面
ドラッグ&ドロップ 直感的、視覚的にわかりやすい テーブルが少ない時、初心者向け
リボンメニュー 詳細設定が可能、一覧で確認できる テーブルが多い時、複雑なモデル

⚡ 3. アクティブと非アクティブ

なぜ2種類あるのか?

同じテーブル間に複数のリレーションシップが必要な場合があります(例:売上テーブルに「注文日」と「出荷日」の2つの日付列がある場合)。Power BIでは、同じテーブル間に複数のアクティブなリレーションシップは作れないため、1つをアクティブ、他を非アクティブにします。

📊 アクティブと非アクティブの違い
項目 アクティブ 非アクティブ
表示 実線 点線
フィルター伝播 自動的に伝播する 自動的には伝播しない
ビジュアルでの使用 自動的に使用される DAXで明示的に指定が必要
同テーブル間の数 1つのみ 複数可
📊 複数日付列の例
【売上テーブル】に2つの日付列がある場合

売上テーブル              日付マスタ
─────────────            ─────────
売上ID                   日付
注文日  ←───────────────────────  (アクティブ:実線)
出荷日  ←- - - - - - - - - - -   (非アクティブ:点線)
金額

通常は「注文日」でフィルター
→ アクティブなリレーションシップを使用

出荷日でフィルターしたい時
→ DAXでUSERELATIONSHIPを使用
✅ 非アクティブなリレーションシップをDAXで使う
// 出荷日ベースの売上合計を計算するメジャー

売上(出荷日ベース) = 
CALCULATE(
    SUM(売上[金額]),
    USERELATIONSHIP(売上[出荷日], 日付マスタ[日付])
)

// USERELATIONSHIP関数で非アクティブなリレーションシップを一時的に有効化
💡 アクティブ/非アクティブの切り替え手順
手順 操作内容
1 モデルビューでリレーションシップの線をダブルクリック
2 「このリレーションシップをアクティブにする」のチェックを変更
3 OK をクリック(注:他のアクティブなものが自動的に非アクティブに)

↔️ 4. クロスフィルター方向

フィルターの伝わる方向を決める

クロスフィルター方向は、フィルターがどちら向きに伝播するかを決定します。基本は「単一方向」で、特殊なケースのみ「双方向」を使います。

📊 クロスフィルター方向の比較
項目 単一方向(推奨) 双方向(慎重に)
記号 →(片方向) ↔(両方向)
フィルターの流れ ディメンション → ファクトのみ 両方向に伝播
パフォーマンス 良い 低下する可能性
予測可能性 高い 予期しない結果のリスク
使用場面 ほとんどのケース 多対多、ブリッジテーブル
📊 単一方向と双方向の動作の違い
【単一方向の場合】
商品マスタ(1) ────→ 売上(*)

・商品マスタで「スマホ」を選択
  → 売上はスマホのみ表示される ✓

・売上で「東京店」をフィルター
  → 商品マスタには影響なし(全商品表示)


【双方向の場合】
商品マスタ(1) ←────→ 売上(*)

・商品マスタで「スマホ」を選択
  → 売上はスマホのみ表示される ✓

・売上で「東京店」をフィルター
  → 商品マスタも東京店で売れた商品のみ表示 ✓
✅ 双方向を使うべきケース
ケース 説明
多対多のブリッジテーブル 中間テーブルを経由してフィルターを伝播させる必要がある
セキュリティフィルター 行レベルセキュリティでファクトからディメンションをフィルター
特殊な分析要件 売上があった商品だけを商品リストに表示したい等
⚠️ 双方向を使う際の注意点
リスク 対策
パフォーマンス低下 大規模データでは特に影響大、必要最小限に
循環参照のリスク 複数テーブル間で輪になる構造を避ける
予期しない結果 設定後にビジュアルの動作を必ず検証
あいまいな関係の警告 警告が出たらモデル構造を見直す

✏️ 5. リレーションシップの編集と削除

作成後の変更方法

リレーションシップは作成後でも編集・削除ができます。間違いに気づいたら、すぐに修正しましょう。

📊 編集方法
方法 手順
線をダブルクリック モデルビューでリレーションシップの線をダブルクリック→編集ダイアログ
リボンから ホームタブ→リレーションシップの管理→選択→「編集」ボタン
✅ 編集できる項目
項目 説明
カーディナリティ 1対多、多対1、1対1、多対多(通常は自動判定が正しい)
クロスフィルター方向 単一または双方向
アクティブ/非アクティブ チェックボックスで切り替え
列の変更 結ぶ列を変更(実質作り直しと同じ)
💡 削除方法
方法 手順
線を右クリック モデルビューで線を右クリック→「削除」→確認→「削除」
リボンから リレーションシップの管理→選択→「削除」ボタン→確認
🔧 削除すべきリレーションシップ
ケース 理由
不要なもの 使わないリレーションシップは削除してシンプルに
誤って作られたもの 自動検出で意図しないリレーションシップが作成された
循環参照の原因 エラーを解消するために削除が必要
パフォーマンス悪化の原因 不要な双方向フィルターなど

🔧 6. トラブルシューティング

よくあるエラーと解決策

リレーションシップの設定でつまずきやすいポイントと、その解決策を紹介します。

⚠️ エラー1: リレーションシップを作成できない
原因 解決策
データ型の不一致 Power Queryで両方の列のデータ型を揃える(整数⇔整数、テキスト⇔テキスト)
多対多の関係 ブリッジテーブルを作成するか、「多対多」カーディナリティを選択
循環参照が発生 不要なリレーションシップを削除してループを断つ
🔧 エラー2: フィルターが効かない
原因 解決策
リレーションシップが非アクティブ アクティブに変更、またはUSERELATIONSHIPを使用
クロスフィルター方向が逆 方向を確認し、必要なら双方向に変更
リレーションシップが存在しない モデルビューで確認し、必要なら作成
📊 エラー3: 循環参照が検出されました
【循環参照の例】
テーブルA ──→ テーブルB ──→ テーブルC
    ↑                              │
    └──────────────────────────────┘
    
フィルターがぐるぐる回ってしまう!

【解決策】
1. 不要なリレーションシップを削除
2. 1つを非アクティブにする
3. 双方向を単一方向に変更
4. データモデルを再設計(スタースキーマに近づける)
✅ リレーションシップの検証チェックリスト
確認項目 チェックポイント
カーディナリティ ディメンション(1) → ファクト(*) になっているか
主キー側の一意性 「1」側の列に重複値がないか
外部キーの参照整合性 「*」側の値が「1」側に存在するか
データ型 両方の列のデータ型が一致しているか
クロスフィルター方向 通常は単一方向になっているか
循環参照 テーブル間でループが発生していないか
💡 パフォーマンス最適化のポイント
推奨 理由
不要なリレーションシップは削除 シンプルなモデルはパフォーマンスが良い
双方向フィルターは最小限 計算量が増えるため、本当に必要な場合のみ
整数型のキーを使う テキストよりも高速に処理される
スタースキーマを維持 中心にファクト、周りにディメンションの構造が最適

📝 STEP 33 のまとめ

✅ このステップで学んだこと
  • 自動検出:列名とデータ型で自動作成(必ず確認が必要)
  • 手動作成:ドラッグ&ドロップまたはリボンメニューから
  • アクティブ:実線、デフォルトで使用される
  • 非アクティブ:点線、DAXで明示的に使用
  • クロスフィルター:単一方向が基本、双方向は慎重に
  • 編集・削除:線をダブルクリックまたは右クリック
  • トラブル対応:データ型確認、循環参照の解消
💡 最重要ポイント

リレーションシップの基本は「1対多」「単一方向」「アクティブ」です。

ディメンション(1)からファクト(*)へ、一方向のフィルターが流れる。

これさえ守れば、ほとんどの分析で困りません。

双方向や非アクティブは特殊なケースのみ

シンプルに保つことが成功の鍵です!

📝 実践演習

演習 1 基礎

2つのテーブル(売上と商品マスタ)を用意し、手動でリレーションシップを作成してください。アクティブで単一方向に設定してください。

【手順】
手順 操作内容
1 2つのテーブルを読み込む(または作成)
2 モデルビュー(🔗)に切り替え
3 商品マスタの[商品ID]を売上の[商品ID]にドラッグ&ドロップ
4 ダイアログでカーディナリティ:多対1、方向:単一、アクティブ:チェックを確認
5 OK→実線で表示されることを確認
演習 2 応用

売上テーブルに「注文日」と「出荷日」の2つの日付列があります。日付マスタと2つのリレーションシップを作成し、一方をアクティブ、もう一方を非アクティブにしてください。

【手順】
作業 操作内容
1つ目(アクティブ) 日付マスタ[日付]→売上[注文日]をドラッグ&ドロップ、アクティブにチェック
2つ目(非アクティブ) 日付マスタ[日付]→売上[出荷日]をドラッグ&ドロップ、アクティブのチェックを外す
確認 注文日への線:実線、出荷日への線:点線になっていることを確認

💡 DAXで非アクティブを使う:CALCULATE(SUM(売上[金額]), USERELATIONSHIP(売上[出荷日], 日付マスタ[日付]))

チャレンジ 発展

「循環参照が検出されました」というエラーを解決してください。モデルビューでリレーションシップを確認し、適切に修正してください。

【循環参照の解決手順】
ステップ 操作内容
①循環を特定 モデルビューで線をたどり、輪になっている部分を探す(A→B→C→A)
②原因を分析 本当に必要か?双方向が原因か?設計ミスか?を確認
③解決策を選択 不要なものを削除 / 非アクティブに / 双方向→単一方向に / モデル再設計
④検証 ビジュアルが正しく動作するか、フィルターが期待通りかを確認

💡 予防策:スタースキーマを維持、ディメンション同士は直接結ばない、双方向は慎重に

❓ よくある質問

Q1: 自動検出されたリレーションシップは信頼できますか?
基本的には信頼できますが、必ず確認してください。

列名が一致していれば自動作成されますが、意図しないリレーションシップが作られることもあります。モデルビューで確認し、不要なものは削除しましょう。
Q2: 双方向フィルターはいつ使うべきですか?
多対多のブリッジテーブルなど、特殊なケースのみです。

通常の1対多のリレーションシップでは単一方向で十分です。双方向にするとパフォーマンスが低下し、予期しない動作を引き起こす可能性があります。
Q3: 非アクティブなリレーションシップは削除すべきですか?
使う予定があるなら残してOKです。

非アクティブなリレーションシップは、USERELATIONSHIP関数で明示的に使用できます。例えば、注文日と出荷日の両方で分析したい場合、片方を非アクティブにして残しておくと便利です。
Q4: リレーションシップがうまく機能しません。
以下を確認してください:

①データ型が一致しているか
②主キー側に重複がないか
③外部キーの値が主キーに存在するか
④アクティブになっているか
⑤クロスフィルター方向が正しいか

特に、データ型の不一致が原因のことが多いです。
Q5: 1対1のリレーションシップは使えますか?
使えますが、そもそも2つのテーブルを1つに統合することを検討してください。

1対1の関係になるケースは稀で、多くの場合は同じテーブルに統合した方がシンプルになります。パフォーマンス上の理由で分ける場合などに限定的に使用します。
Q6: 多対多のリレーションシップを作るには?
ブリッジテーブル(中間テーブル)を使うのが推奨です。

Power BIでは多対多のカーディナリティも選択できますが、パフォーマンスや予測可能性の観点から、ブリッジテーブルを経由した1対多の関係に分解することをおすすめします。
Q7: リレーションシップの線が見づらいです。
モデルビューでテーブルの配置を調整してください。

テーブルをドラッグして移動できます。スタースキーマの形(中心にファクト、周りにディメンション)に配置すると見やすくなります。また、Ctrl+マウスホイールでズームイン/アウトも可能です。
📝

学習メモ

BIツール入門 - Step 33

📋 過去のメモ一覧
#artnasekai #学習メモ
LINE