Dataverse：複数のマスタテーブル（ダブルマスタ）を参照する列の作成

## 序
この記事をご覧の方は、おそらく現在 Dataverse でのデータテーブル設計に取り組んでおり、同一の役割を持つはずのマスタテーブルが複数に分離してしまう状況に直面しているのではないでしょうか。または、システム移行や追加実装に伴い、やむを得ず特定のマスタテーブルを分離せざるを得ない状況にあるかもしれません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952933/bacb8962-33f6-4d06-916c-3733ea151e3c.png)

このような状況に適した呼称は見当たりませんが、本記事では便宜的に、ミック（2024）を参考に「ダブルマスタ」と呼ぶことにします（参考文献：『達人に学ぶDB設計徹底指南書 第2版』翔泳社）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952933/316c1270-2e99-43e2-9e15-717f28ee7e02.png)

通常、Dataverse のリレーションシップは、あるテーブル A がテーブル B と親子関係を結ぶ形で設計されます。しかし、業務要件によっては、テーブル A とテーブル B だけでなく、テーブル C との関係も必要になる場合があります。例えば、「出演情報」が「人類マスタ」と「魔族マスタ」の両方に関連付けられるケースです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952933/63d7ba19-9097-4fb8-bf82-a28c10506131.png)

標準のリレーションシップ設定では、1 つの参照フィールドで複数の異なるテーブルを指定することはできません。そのため、「出演情報」テーブルに「人類用の検索列」と「魔族用の検索列」の 2 つを作成し、それぞれを別々に関連付ける必要があります。しかし、この設計ではデータ管理が煩雑になり、拡張性や保守性が低下するほか、データの整合性が取れなくなるリスクが生じます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952933/e98b2b17-0926-4853-b986-d6a129c79a9d.png)


上のように、ある時は「人類マスタ」を、またある時は「魔族マスタ」を参照できるようにしたい。このような課題を解決する手段の一つが、多態（polymorphic）リレーションシップです。本記事では、XrmToolBox を活用して、Dataverse における多態リレーションシップを作成・管理する方法を解説します。

### XrmToolBox について
XrmToolBox は、Microsoft Dataverse や Dynamics 365 Customer Engagement の管理を支援する無料の外部ツールです。さまざまなプラグインが提供されており、データモデルの管理や設定変更が可能になります。

詳細： https://learn.microsoft.com/ja-jp/power-apps/developer/model-driven-apps/developer-tools

#### Polymorphic Lookup Creator / Manager
Polymorphic Lookup Creator / Manager は、XrmToolBox 内のプラグインの一つで、Dataverse における多態リレーションシップを構築・管理するために使用します。これを利用することで、1 つのリレーションシップで複数のテーブルを参照できるようになります。

例えば、「出演情報」が「人類マスタ」と「魔族マスタ」の双方に紐づく必要がある場合、通常は個別のリレーションシップを作成しなければなりません。しかし、Polymorphic Lookup Creator / Manager を活用すれば、「名前」という検索列 1 つで複数のテーブルを参照できるようになります。

当記事では２枚のテーブルを参照していますが、３枚でも４枚でも参照可能です。

#### 多態リレーションシップの注意点
多態リレーションシップには有用な側面がある一方で、筆者は可能な限り使用を避けるべきだと考えています。

ダブルマスタは、パフォーマンス低下の原因になり得るためです。例えば、すべての登場人物のデータを取得する際、Power Automate や Power Query でこれらのマスタを結合するアクションを噛ませる必要が生じ、処理コストが増大します。

通常、マスタが分離する事態はあまり発生しません。しかし、異なるシステムで運用されていたマスタが、企業や部署の合併などにより統合される場合、この問題が発生する可能性は大いにあります。

したがって、このような形式でのテーブル運用は「一時的なもの」とするべきです。業務遂行のための暫定的な運用として利用し、最終的には多態リレーションシップを用いずに統合されたテーブル設計を進めることが望ましいでしょう。
 
### 準備
まず、次の公式サイトから XrmToolBox をダウンロードします： https://www.xrmtoolbox.com/

ダウンロード後、XrmToolBox を起動しておきましょう。

#### ソリューションを作成する
多態リレーションシップを構築する際、ツール内で、ソリューションを入力（選択）する項目があるため、ソリューションを作成しておきます。その作成方法については、ここでは割愛いたします。

#### まずは検索列以外の列を作る
Polymorphic Lookup Creator / Manager を利用する前に、あらかじめ構築しておいたソリューション内に、検索列以外のテーブルを作成しておきます。本記事では「人類マスタ」「魔族マスタ」「出演情報」の 3 つのテーブルを作成します。そのうち「出演情報」テーブルでは、検索列以外の列を作成しておきましょう（すべての列を作成する必要はなく、後から追加可能です）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952933/521ec7b2-40ed-4528-81b5-b6528038a81e.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952933/2a9c302c-de2b-464c-bdf8-37e6e0ef0446.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952933/77ddec16-ae47-4813-a4d1-ab308ba1f072.png)

#### 接続方法
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952933/1bf79327-647e-4fdb-8413-980288b39eb7.png)

XrmToolBox を開き、Polymorphic Lookup Creator / Manager を選択します。接続画面が表示されたら、[New] ボタンをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952933/3c4a2897-7690-4e4b-a2d3-825e3808c8fa.png)

次に表示されるウィンドウで、[Connection Wizard] をクリックし、指示に従って設定を進めます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952933/c45a6352-ca9a-47d7-abe5-d95201af9fab.png)

Power Platform 管理センターで、作成したソリューションが存在する環境を選択し、環境 URL をコピーしておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952933/164df66e-f547-438a-b6dc-8d38c978361d.png)

青字になっている organization には、.crm の前までをペーストします。忘れがちなのは、.crm の後ろにある数字です。4 の人がいたり、8 の人がいたり、ここは様々ですが、注意しましょう。

https:// 以下に環境URLを貼り付けてしまえば間違いは起きないと思います。入力後、[次へ] をクリックし、接続を完了させます。

~~~
https://[organization].crm[Num].dynamics.com
~~~

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952933/2a69c83f-08ef-4bfd-9860-034778d4b12c.png)

今度は、Microsoft アカウントを要求されるので、メールアドレスとパスワードを入力していきます。入力後、Next をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952933/7e5ea8e9-48eb-4ccf-8a70-c658bc3d97c5.png)

後は、名前を入力して Finish をクリックしたら初期設定完了です。この名前の部分は「案件名」にしておくと煩雑にならなくて良さそうです（まあ、そんなに使うツールではないのですが）

![新規キャンバス1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952933/57742b84-0832-46f3-8c9b-bd826984b302.jpeg)

ここまで上手く行っていたら、作成した環境をクリックして開きます。
開いたら、以下の画像のようなページになるはずです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952933/702fbe63-d7cd-4b39-9d1f-5d7c983439ac.png)


### 作成方法
ここからは作成方法です。用語を整理しながら進めていきましょう。

#### Solution
まずは、多態リレーションシップを結びたいテーブルが存在するソリューションを指定します。非常に分かりにくいのですが、入力ボックスの右隅に三点リーダーがありますので、ここをクリックして選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952933/674408ad-8c3a-464f-8005-133e1d6b79ea.png)

#### Referencing Table
あとは道なりに選択するだけです。参照列を作成するテーブルを指定します。今回の場合、出演情報テーブルを選択します。内部名（スキーマ名のこと。半角英数字のテーブル名）で探さなければならないのでその点だけ大変です。

#### Attribute
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952933/0e4abeb5-4d91-42c8-b2fc-f1c61cec4df7.png)

Attribute は、検索列の名前を意味しています。今回、出演情報テーブルには検索列を作成していない状態なので、Create new polymorphic lookup を選択します。ここ、意外と見つけにくくて困りました。

#### Lookup Display name
検索列の列名（表示名）を入力します。新しく作成するので「名前」と入力しておきます。

#### Lookup Schema name
「名前」列の内部列名を半角英数字で入力します。最初は Id で自動入力されますが、ここでは name と入力しました。分かりやすい列名に設定しておきましょう（自戒）
#### Referenced Table
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952933/7faf3c6d-9e5a-4d77-a0c5-327094f0bc5a.png)

最後に、参照先のテーブルを探します。ここでは「人類マスタ」と「魔族マスタ」のチェックボックスを true にしておきます。もちろん、内部列名で表示されるので kuro_demon と kuro_mankind を探します。余計なお世話ですが、隣に置いてある "Search" は、検索ボックスなので、ここで探すと便利です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952933/c895bc17-4086-497b-b98f-c29d97c795bf.png)

この画面が出てきたら成功です。Power Apps を開いて確認してみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952933/f0362837-794f-4f4d-a348-c90931a3dd7c.png)

最初、作成した検索列は非表示になっているので「その他のｎ件」から表示してあげます。試しに値を入力してみると、上の画像のように、値がどのマスタを参照しているのかが示されていることが分かります。以上で作業は完了です。

### 運用環境等、ソリューションインポート時の注意点
作成したソリューションを運用環境などにインポートする際、The polymorphic lookup style cannot be updated と、エラーが発生する場合があります。

このエラーは、インポート先の環境に同一の内部名かつ参照先の異なる検索列が存在していることが原因です。インポート先の環境に存在する該当の検索列を事前に削除してからインポートすることで解消が見込まれます。

他にも、先にインポート先のソリューションを削除するというのも手ですが（特にマネージド環境の場合）既にテーブル内に値が入力されているのであれば、データが損失するため、非推奨です。

改めて書くことではないかもしれませんが、いずれにしても必ず（Excelエクスポートなど）データのバックアップをした上で作業に当たってください。

## 結
以上、日本語の情報がなかったので自分なりにまとめました。
備忘録ですが何かしらお役に立てたのであれば幸いです。