適用対象:
SQL Server Analysis Services
Azure Analysis Services
Fabric/Power BI Premium
テーブル モデルでは、リレーションシップは 2 つのデータ テーブル間の接続です。 リレーションシップにより、2 つのテーブル内のデータを関連付ける方法が確立されます。 たとえば、Customers テーブルと Orders テーブルは、各注文に関連付けられている顧客名を表示するために関連付けることができます。
同じデータ ソースからインポートする場合、インポートするテーブル (データ ソース) に既に存在するリレーションシップがモデルに再作成されます。 検出されて再作成されたリレーションシップは、ダイアグラム ビューのモデル デザイナーを使用するか、[リレーションシップの管理] ダイアログ ボックスを使用して自動的に表示できます。 ダイアグラム ビューのモデル デザイナーを使用するか、[リレーションシップの作成] または [リレーションシップの管理] ダイアログ ボックスを使用して、テーブル間に新しいリレーションシップを手動で作成することもできます。
インポート中に自動的に、または手動で作成されたテーブル間のリレーションシップが定義されると、関連する列を使用してデータをフィルター処理し、関連テーブルの値を検索できるようになります。
ヒント
モデルに多くのリレーションシップが含まれている場合、ダイアグラム ビューは、テーブル間の新しいリレーションシップをより適切に視覚化して作成するのに役立ちます。
メリット
リレーションシップは、各テーブルの 1 つ以上の列に基づく 2 つのデータ テーブル間の接続です。 リレーションシップが役に立つ理由を確認するには、ビジネスの顧客注文のデータを追跡するとします。 次のような構造を持つ 1 つのテーブル内のすべてのデータを追跡できます。
| 顧客ID | 名前 | 電子メール | DiscountRate | 注文ID | 注文日 | プロダクト | 数量 |
|---|---|---|---|---|---|---|---|
| 1 | アシュトン | chris.ashton@contoso.com | .05 | 256 | 2010-01-07 | コンパクトデジタル | 11 |
| 1 | アシュトン | chris.ashton@contoso.com | .05 | 255 | 2010-01-03 | 一眼レフカメラ | 15 |
| 2 | Jaworski | michal.jaworski@contoso.com | .10 | 254 | 2010-01-03 | 低予算ムービーメーカー | 二十七 |
この方法は機能しますが、すべての注文の顧客の電子メール アドレスなど、大量の冗長データを格納する必要があります。 ストレージは安価ですが、電子メール アドレスが変更された場合は、その顧客のすべての行を必ず更新する必要があります。 この問題の解決策の 1 つは、データを複数のテーブルに分割し、それらのテーブル間のリレーションシップを定義することです。 これは、SQL Server などの リレーショナル データベース で使用されるアプローチです。 たとえば、モデルにインポートするデータベースは、次の 3 つの関連テーブルを使用して注文データを表します。
顧客
| [顧客ID] | 名前 | |
|---|---|---|
| 1 | アシュトン | chris.ashton@contoso.com |
| 2 | Jaworski | michal.jaworski@contoso.com |
顧客割引
| [CustomerID] | DiscountRate |
|---|---|
| 1 | .05 |
| 2 | .10 |
Orders
| [CustomerID] | 注文ID | 注文日 | プロダクト | 数量 |
|---|---|---|---|---|
| 1 | 256 | 2010-01-07 | コンパクトデジタル | 11 |
| 1 | 255 | 2010-01-03 | 一眼レフカメラ | 15 |
| 2 | 254 | 2010-01-03 | 低予算映画製作ソフト | 二十七 |
これらのテーブルを同じデータベースからインポートすると、[角かっこ] 内の列に基づいてテーブル間のリレーションシップを検出し、モデル デザイナーでこれらのリレーションシップを再現できます。 詳細については、この記事の「リレーションシップの自動検出と推論」セクションを参照してください。 複数のソースからテーブルをインポートする場合は、「 2 つのテーブル間のリレーションシップを作成する」の説明に従って、リレーションシップを手動で作成できます。
列とキー
リレーションシップは、同じデータを含む各テーブルの列に基づいています。 たとえば、Customers テーブルと Orders テーブルは、顧客 ID を格納する列が両方とも含まれているため、相互に関連付けることができます。 この例では、列名は同じですが、これは必須ではありません。 すべての Orders テーブルの行に、Customers テーブルにも格納されている ID が含まれている限り、1 つは CustomerID に、もう 1 つは CustomerNumber になる可能性があります。
リレーショナル データベースには、いくつかの種類の キーがあり、通常は特殊なプロパティを持つ列にすぎません。 リレーショナル データベースでは、次の 4 種類のキーを使用できます。
主キー: Customers テーブルの CustomerID など、テーブル内の行を一意に識別します。
代替キー (または 候補キー): 一意の主キー以外の列。 たとえば、Employees テーブルには従業員 ID と社会保障番号が格納され、どちらも一意である場合があります。
外部キー: Orders テーブルの CustomerID など、別のテーブルの一意の列を参照する列。Customers テーブルの CustomerID を参照します。
複合キー: 複数の列で構成されるキー。 複合キーは、表形式モデルではサポートされていません。 詳細については、この記事の「複合キーと参照列」セクションを参照してください。
表形式モデルでは、主キーまたは代替キーは 、関連する参照列または参照 列と呼ばれます。 テーブルに主キーと代替キーの両方がある場合は、参照列として使用できます。 外部キーは、 ソース列 または単なる 列と呼ばれます。 この例では、Orders テーブルの CustomerID (列) と Customers テーブルの CustomerID (ルックアップ列) の間にリレーションシップを定義します。 リレーショナル データベースからデータをインポートする場合、既定では、モデル デザイナーは 1 つのテーブルから外部キーを選択し、対応する主キーをもう一方のテーブルから選択します。 ただし、ルックアップ列に一意の値を持つ任意の列を使用できます。
リレーションシップの種類
顧客と注文の間のリレーションシップは、 一対多のリレーションシップです。 すべての顧客は複数の注文を持つことができますが、1 つの注文に複数の顧客を持つことはできません。 他の種類のリレーションシップは 、一対一 と 多対多です。 顧客ごとに 1 つの割引率を定義する CustomerDiscounts テーブルは、Customers テーブルとの 1 対 1 のリレーションシップにあります。 多対多の関係の例として、製品と顧客の直接的な関係があり、顧客は多くの製品を購入でき、同じ製品は多くの顧客が購入できます。 モデル デザイナーは、ユーザー インターフェイスで多対多リレーションシップをサポートしていません。 詳細については、この記事の「多対多リレーションシップ」セクションを参照してください。
次の表は、3 つのテーブル間のリレーションシップを示しています。
| Relationship | タイプ | ルックアップ列 | コラム |
|---|---|---|---|
| カスタマーズ-カスタマーディスカウント | 一対一 | Customers.CustomerID | CustomerDiscounts.CustomerID |
| 顧客-注文 | one-to-many | Customers.CustomerID | Orders.CustomerID |
リレーションシップとパフォーマンス
リレーションシップが作成されたら、通常、モデル デザイナーは、新しく作成されたリレーションシップのテーブルの列を使用する数式を再計算する必要があります。 データの量とリレーションシップの複雑さによっては、処理に時間がかかる場合があります。
リレーションシップの要件
モデル デザイナーには、リレーションシップを作成するときに従う必要があるいくつかの要件があります。
テーブル間の単一のアクティブなリレーションシップ
複数のリレーションシップがあると、テーブル間の依存関係があいまいになる可能性があります。 正確な計算を作成するには、1 つのテーブルから次のテーブルへの 1 つのパスが必要です。 したがって、テーブルの各ペアの間にアクティブなリレーションシップは 1 つだけ存在できます。 たとえば、AdventureWorks DW 2012 では、テーブル DimDate に、テーブル内の 3 つの異なる列 FactInternetSales に関連する DateKey 列 (OrderDate、DueDate、ShipDate) が含まれています。 これらのテーブルをインポートしようとすると、最初のリレーションシップは正常に作成されますが、同じ列を含む連続するリレーションシップに対して次のエラーが表示されます。
* リレーションシップ: table[column 1]-> table[column 2] - ステータス: エラー - 理由: テーブル<table 1>と<table 2>の間にリレーションシップを作成することはできません。 2 つのテーブル間に存在できる直接リレーションシップまたは間接リレーションシップは 1 つだけです。
2 つのテーブルとそれらの間に複数のリレーションシップがある場合は、参照列を含むテーブルの複数のコピーをインポートし、テーブルの各ペア間に 1 つのリレーションシップを作成する必要があります。
テーブル間には多くの非アクティブなリレーションシップが存在する可能性があります。 テーブル間で使用するパスは、クエリ時にレポート クライアントによって指定されます。
ソース列ごとに 1 つのリレーションシップ
ソース列は複数のリレーションシップに参加できません。 あるリレーションシップで列をソース列として既に使用しているが、その列を使用して別のテーブルの別の関連する参照列に接続する場合は、列のコピーを作成し、その列を新しいリレーションシップに使用できます。
計算列で DAX 式を使用すると、まったく同じ値を持つ列のコピーを簡単に作成できます。 詳細については、「 計算列の作成」を参照してください。
各テーブルの一意識別子
各テーブルには、そのテーブル内の各行を一意に識別する 1 つの列が必要です。 この列は、多くの場合、主キーと呼ばれます。
一意の参照列
ルックアップ列のデータ値は一意である必要があります。 つまり、列に重複を含めることはできません。 表形式モデルでは、null と空の文字列は空白と同等であり、これは個別のデータ値です。 つまり、ルックアップ列に複数の null を含めることはできません。
互換性のあるデータ型
ソース列と参照列のデータ型は互換性がある必要があります。 データ型の詳細については、「 サポートされるデータ型」を参照してください。
複合キーと参照列
表形式モデルでは複合キーを使用できません。テーブル内の各行を一意に識別する列は常に 1 つ必要です。 複合キーに基づいて既存のリレーションシップを持つテーブルをインポートしようとすると、テーブル モデルで作成できないため、そのリレーションシップは無視されます。
モデル デザイナーで 2 つのテーブル間にリレーションシップを作成し、主キーと外部キーを定義する列が複数ある場合は、リレーションシップを作成する前に、値を組み合わせて 1 つのキー列を作成する必要があります。 データをインポートする前にこれを行うか、計算列を作成してモデル デザイナーで行うことができます。
多対多のリレーションシップ
Azure Analysis Services、SQL Server 2019 以降の Analysis Services、および Power BI Premium にデプロイされた 1500 以上の互換性レベルの表形式モデルでは、多対多リレーションシップがサポートされます。
多対多リレーションシップは、両方の列が一意でないテーブル間のリレーションシップです。 ディメンションとファクト テーブルの間には、ディメンションのキー列よりも高い粒度でリレーションシップを定義できます。 これにより、ディメンション テーブルを正規化する必要がなくなり、結果として得られるモデルのテーブルの数が論理的にグループ化された列が少なくなるため、ユーザー エクスペリエンスを向上させることができます。
Visual Studio 2019 と Analysis Services プロジェクト、表形式オブジェクト モデル (TOM) API、表形式モデル スクリプト言語 (TMSL)、およびオープンソースの表形式エディター ツールを使用して、多対多リレーションシップを作成します。
1400 以下の互換性レベルの表形式モデルでは、多対多リレーションシップはサポートされず、モデル デザイナーで ジャンクション テーブル を追加することはできません。 ただし、DAX 関数を使用して多対多リレーションシップをモデル化できます。 また、双方向のクロス フィルターを設定して、同じ目的を達成しているかどうかを確認することもできます。 複数のテーブル リレーションシップ間でフィルター コンテキストを保持するクロス フィルターを使用して、多対多リレーションシップの要件を満たすことができる場合があります。 詳細については、 表形式モデルの双方向クロス フィルター に関するページを参照してください。
自己結合とループ
表形式モデル テーブルでは、自己結合は許可されません。 自己結合は、テーブルとそれ自体の間の再帰的なリレーションシップです。 自己結合は、多くの場合、親子階層を定義するために使用されます。 たとえば、Employees テーブルをそれ自体に結合して、企業の管理チェーンを示す階層を作成できます。
モデル デザイナーでは、モデル内のリレーションシップ間でループを作成することはできません。 つまり、次のリレーションシップのセットは禁止されています。
表 1、列 a から表 2、列 f
表 2、列 f から表 3、列 n
表 3、列 n から表 1、列 a
ループが作成されるリレーションシップを作成しようとすると、エラーが生成されます。
リレーションシップの推論
場合によっては、テーブル間のリレーションシップが自動的にチェーンされます。 たとえば、以下の最初の 2 つのテーブル セット間にリレーションシップを作成すると、リレーションシップは他の 2 つのテーブル間に存在すると推定され、リレーションシップが自動的に確立されます。
製品とカテゴリ -- 手動で作成
Category と SubCategory -- 手動で作成
製品とサブカテゴリ -- リレーションシップが推論される
リレーションシップを自動的に連結するには、上に示すようにリレーションシップを一方向に移動する必要があります。 たとえば、最初の関係が Sales と Products の間、そして Sales と Customers の間にある場合、リレーションシップは推論されるものではありません。 これは、製品と顧客の関係が多対多の関係であるためです。
データをインポートするときのリレーションシップの検出
リレーショナル データ ソース テーブルからインポートすると、ソース スキーマ データに基づいてテーブル間の既存のリレーションシップが検出されます。 関連テーブルがインポートされると、それらのリレーションシップがモデルにレプリケートされます。
リレーションシップを手動で作成する
1 つのリレーショナル データ ソース内のテーブル間のリレーションシップのほとんどは自動的に検出され、テーブル モデルで作成されますが、モデル テーブル間のリレーションシップを手動で作成する必要がある場合も多数あります。
モデルに複数のソースからのデータが含まれている場合は、リレーションシップを手動で作成する必要があります。 たとえば、リレーショナル データ ソースから Customers、CustomerDiscounts、Orders テーブルをインポートできます。 ソースにあるこれらのテーブル間に存在するリレーションシップは、モデル内に自動的に作成されます。 その後、別のソースから別のテーブルを追加できます。たとえば、Microsoft Excel ブックの Geography テーブルから地域データをインポートします。 その後、Customers テーブルの列と Geography テーブルの列の間にリレーションシップを手動で作成できます。
テーブル モデルでリレーションシップを手動で作成するには、ダイアグラム ビューのモデル デザイナーを使用するか、[リレーションシップの管理] ダイアログ ボックスを使用します。 ダイアグラム ビューには、テーブル間のリレーションシップがグラフィカルな形式で表示されます。 あるテーブル内の列をクリックし、カーソルを別のテーブルにドラッグすると、テーブル間の適切な順序でリレーションシップを簡単に作成できます。 [リレーションシップの管理] ダイアログ ボックスには、テーブル間のリレーションシップが単純なテーブル形式で表示されます。 リレーションシップを手動で作成する方法については、「 2 つのテーブル間のリレーションシップを作成する」を参照してください。
重複した値やその他のエラー
リレーションシップで使用できない列を選択すると、その列の横に赤い X が表示されます。 エラー アイコンの上にカーソルを置くと、問題に関する詳細情報を示すメッセージを表示できます。 選択した列間にリレーションシップを作成できなくなる可能性がある問題には、次のようなものがあります。
| 問題またはメッセージ | 解決策 |
|---|---|
| 選択された両方の列に重複する値が含まれているため、リレーションシップを作成できません。 | 有効なリレーションシップを作成するには、選択するペアの少なくとも 1 つの列に一意の値のみを含める必要があります。 列を編集して重複を削除するか、列の順序を逆にして、一意の値を含む列が 関連ルックアップ列として使用されるようにすることができます。 |
| 列に null または空の値が含まれています。 | null 値でデータ列を相互に結合することはできません。 リレーションシップで使用されるすべての列には、すべての行に対して値が含まれている必要があります。 |
こちらも参照ください
| [アーティクル] | Description |
|---|---|
| 2 つのテーブル間にリレーションシップを作成する | 2 つのテーブル間にリレーションシップを手動で作成する方法について説明します。 |
| リレーションシップの削除 | リレーションシップを削除する方法と、リレーションシップを削除する影響について説明します。 |
| 双方向クロス フィルター | 関連テーブルの双方向クロス フィルター処理について説明します。 1 つのテーブル リレーションシップのフィルター コンテキストは、テーブルが関連し、双方向のクロス フィルターが定義されている場合に、2 つ目のテーブル リレーションシップ間でクエリを実行するときに使用できます。 |