【Dataverse】リレーションシップ

一般的なリレーションシップは知ってるという方は飛ばして、[Dataverseのリレーションシップとは](https://qiita.com/skuramoto/items/03bf837efed710fdbfee#dataverse%E3%81%AE%E3%83%AA%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%B7%E3%83%83%E3%83%97%E3%81%A8%E3%81%AF)から
# まずそもそもリレーションシップとは？
### リレーションシップ =「テーブル同士の関係性」
省略して「リレーション」とも言います。
リレーションがないテーブル、１つで完結してしまうテーブルだったら、Excel、Sharepointでこと足ります。
しかし、世の中のテーブル形式のデータは、複数のテーブルに分けて管理されています。そのため、そのテーブル同士の関係というのが生まれてきます。
リレーショナルデータベース(RDB)はリレーションをテーブルに持たせることができるデータベースです。大量データを扱う場合、基本的にはリレーショナルデータベースを使うことになるはずです。

### なぜわざわざテーブルを分けなければいけないのか

結論からいうと、データの管理に都合がいいからです。
人間にとっては1つのテーブルで全部の情報を見れた方がわかりやすいかもしれないですが、
システム的には分けた方がデータの管理が楽になります。

例えば、販売注文のデータを保存するテーブルを作成するとします。この中には販売する製品の情報（原価、売価、在庫...）や顧客情報（名前、住所、連絡先...）、請求書情報（日付、請求番号、営業担当者...）などの情報が必要です。
このような場合には以下のようにテーブルを分けます。
そして、必要な時に発注注文テーブルから顧客テーブル、製品テーブル、請求書テーブルに情報を取りに行くことができます。
- 販売注文テーブル
- 顧客テーブル
- 製品テーブル
- 請求書テーブル

この時の販売注文テーブルを子テーブル、
顧客テーブル、製品テーブル、請求書テーブルを親テーブルと呼びます。

::: note
情報を教えてくれるテーブルは親テーブル、情報を聞くテーブルは子テーブル

:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/ad6d272d-b673-c030-5d36-8be66866947e.png)




もしテキスト型などでLookUpかけて情報取りに行くという構成だとデータの整合性が取れないです。
例えば、親テーブルでデータが変わったときに、関係するテーブルの設定を変えなきゃいけない等、、。


### リレーションの種類
データベースのリレーションには以下の3つの種類があります。
どういう関係性なのかの種類ですね。
#### 一対一 (1:1)
「顧客」と「個人情報」というテーブルが存在するとき、1人の顧客は1つの個人情報を持っています。
よってこの両者の関係は1：1になっていると言えます。
ただ、このリレーションは、分割しなくてもよいテーブルが分割されている状態です。
既存のテーブル構成を変えずに項目を追加したい場合等を除き、積極的に使用する機会はあまり無いです。

#### 多対一(n:1）
「販売注文」と「製品」というテーブルが存在するとき、複数の注文に１つの製品を割り当てることができるので、この両者の関係は多対一になっていると言えます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/460bf570-b36b-f2cb-de41-7589665c82ff.png" width=70%>

#### 多対多（n:n）
「顧客」と「製品」というテーブルが存在するとき、1人の顧客は複数の製品を購入することができます。そして、1種類の製品を注文する顧客は複数存在します。
よってこの両者の関係はn:nになっていると言えます。
※多対多の場合、中間テーブルを用いてデータベースを構成します。

**中間テーブル**
ｎ：ｎのリレーション設計する場合に中間に置くテーブルです。
リレーションの橋渡し役となります。



# Dataverseのリレーションシップとは
Dataverseはリレーショナルデータベース(RDB)の形式なので、上記のリレーションを持ったテーブルを扱うことができます。

Dataverseで設定できるリレーションシップの種類
- 多対一
- 一対多
- 多対多

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/20f70cfa-c881-b8d9-61ad-b285967ee3d2.png" width="200" text= "実際の設定画面" height=456px >

「多」というのは「1以上」でいいので、
もちろん「多対一」「一対多」で「一対一」を作ることも可能です。
つまり一般的なリレーションはもちろん作ることができます。

### なぜ「多対一」「一対多」がそれぞれあるのか
この「多対一」「一対多」は順番が決まっています。
例えば一般的な一対多の例として販売注文と製品テーブルを上げましたが、
販売注文：製品 ＝ n:1 ＝ 多対一　（複数の注文に１つの製品を割り当てる）
ですよね。
つまり販売注文のテーブルからすると多対一の関係ですが、製品テーブルから見ると一対多の関係なんです。

Dataverseでは、リレーションはテーブルごとに作るのですが
どちらからでも作ることができるように「多対一」「一対多」をそれぞれ用意しているんですね！便利！

# Dataverseのリレーション作成方法
では実際にDataverseでのリレーションの作成方法を説明します。


　
1. PowerAppsを開いて左のメニューの[Dataverse] > [テーブル]をクリックし、対象のテーブル（今回は「販売注文」テーブル）を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/d72630f6-30a5-35a8-147d-9902499288fc.png)

2. テーブルの詳細画面に遷移するので、左上の[新規]ボタンをクリックする
そうするとドロップダウンメニューが表示され[リレーション]をクリックするとさらに左に「多対一」「一対多」「多対多」を選択できるようになる
:::note info
この詳細画面ではテーブルに対して様々な設定ができます。
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/637d1908-bf8a-38c0-baca-38f5a4e8517b.png)




３. 製品テーブルとリレーション(販売注文から見ると「多対一」)を作る
[多対一]を選択
４. 右に出てくる設定画面で必要項目を設定（各項目の詳細はテーブル参照）
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/2677c5bf-2303-6f8b-22c1-df65d4bfeb8a.png" width=50%>

|     列	        | 　　説明 　　　| 
|:-----------------|------------------|
|ルックアップ列の表示名| 関連テーブル先に作成されるルックアップ列の外部名。後で編集可能。 | 
| 検索列の名前     | 関連テーブル先に作成されるルックアップ列の内部名（英語である必要がある） | 
|リレーションシップ名| 作成されるリレーションシップ自体の名前 | 
|検索列の説明 | ルックアップ列の説明。列の上にマウス ポインターを置いたときにこれがヒントとして表示される。後で編集可能。 |

::: note 
**詳細オプションを開くと表示される項目について**
(あまりこだわりがない方はデフォルト値でOKです。)
こちらは伝播（カスケード）動作と呼ばれるもので、一方のデータが「削除」、「所有権の割り当て」、「共有」をされたとき関連するテーブル側でどのようにデータを扱うのかを設定できるものです。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/89f8a111-d5ea-2af5-39bd-308d371eb876.png" width=40%>

細かいカスタマイズについては以下のブログが参考になります。
https://jpdynamicscrm.github.io/blog/powerplatform/table-relationship-behavior/

:::

５. ブラウザのリフレッシュボタンを押して最新の状態にすると「製品」列ができていることが確認できる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/97017964-05d4-250e-3894-498005709ae2.png)

:::note info
今回のように情報を他から取ってきたい側のテーブルからつなげる場合が多いのでとりあえず「多対一」と覚えておこう！
:::

# Dataverseのリレーション作成方法②
実は多対一のリレーションはもう一つ作る方法があります。（ほかの一対多、多対多は①のやり方のみ）
それが**列から作る方法**。
こちらから作る方がややこしくないかもです。

1. テーブルの詳細画面の左上の[新規]から[列]をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/615334f4-0d31-fe4b-5c07-b828f8c137db.png)

２. 右に出てくる[新しい列]ウィジットで表示名を付ける
データの種類で[検索] > [検索]を選択
**これが多対一のリレーションと同じ。**

:::note info 
チナミになる話
・検索かけに行ってデータを参照するので「検索」
・旧・「参照型」（前までは「参照」という名前でした）
:::


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/72364fcf-78eb-45e0-a2b2-ee6d53df9fe7.png" width=50%>

３. 検索型を選ぶと[関連テーブル]の欄ができるのでここで参照したいテーブルを選択する
（今回は製品テーブル）
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/a4bc2e1e-b920-9ec6-fee6-aea564ed2511.png" width=50%>

４. 高度なオプションを選択して[スキーマ名]（内部名）に英語の名前を入れたら[保存]ボタンを押して完了
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/60995055-294a-e011-d2eb-8421551112aa.png" width=50%>


# まとめ
- Dataverseはリレーショナルデータベース(RDB)
- 列の検索型とリレーションの「多対一」は同じ意味