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