【Mendix Pro】Association（アソシエーション）についての簡単な解説

こんにちは！
今回の記事ではMendixの最大といってもいい特徴である「アソシエーション」について簡単な解説を行います。

アソシエーションとは、関連性という訳になるでしょうか。
Aというエンティティと、Bというエンティティの間にアソシエーションを設定する、張るといった感じで使用します。

Mendixのアソシエーションについて知る前に、まずは以下について復習してみましょう。

## ER図 多重度について
アソシエーションを理解する第一歩は、ER図の多重度について知ることから始まります。
研修や資格の試験勉強などでご存じの方も多い下記の図です。

https://www.ntt.com/business/services/rink/knowledge/archive_58.html
より引用
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125006/315047a2-84a8-4025-9d14-67477f36c1fe.png)

エンティティ間のリレーションシップを表す図であり、
例えば、この表からですと注文テーブルと注文明細テーブルは１：多で紐づいていることが分かります。
注文１件に、明細は複数件紐づくことが可能というわけです。

## 主キーと外部キー(FK)について
通常のデータベースですと、ER図で表したリレーションを再現するには、
主キーと外部キーを用いてテーブルを定義し、プログラムで使用することになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125006/e054110a-cc94-45e7-a559-289743f30d0f.png)

すごく簡易的な例となりますが
上の表でいくとA事業所に所属する従業員全員の情報を取得するときに、
SQL文としては
```sql:sampleA.sql
SELECT *
FROM 従業員テーブル
WHERE 事業所ID = '事業部テーブルに存在する事業部ID'
```
となり「両者を紐づけるカラム」の存在が必要です。

ここまでは、エンジニアやプログラムを書いている皆さんにとっては当たり前なことだと思います。
ではこれが、Mendixの場合だとどうなるのか

## Mendixでは外部キーの概念を無視してリレーションを定義可能！
実際のソースを用いて解説します。
これを知るとMendixの開発スピード、技術が飛躍的にアップしますのでぜひ以降をお読みになり、ご活用くださると幸いです。

先ほどの例の通り、まずは事業部エンティティと従業員エンティティの２テーブルを準備します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125006/0b9e407f-deb5-4059-bac7-fbdd95ae9d2d.png)


## アソシエーションの設定の方法とフローでの使用方法の解説
では、実際に２テーブル間にアソシエーションを定義し、ソースで使用してみましょう
上記の画像の通りDomainModelにテーブルを作成しました。

①子となるエンティティを選択し（今回は従業員→事業所に繋ぐイメージ）、Associationタブをクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125006/01a5a94a-58cf-4203-8f09-7bf4b75e85c6.png)

②New押下　アソシエーションを張りたいエンティティを選択します
今回は事業所テーブルです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125006/8b9d418a-eb71-4b45-9991-16d2f2c7b156.png)

③Associationタブに設定したアソシエーションが表示されます。
これでアソシエーションが設定されました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125006/8a1fd359-dd6f-4212-984a-82073b5b085a.png)

DomainModelでは以下のように見えます
アソシエーションを張ると両方のエンティティのプロパティで確認できるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125006/feac905c-c996-40c5-8ef5-c3447062166c.png)

④Associationの設定をします。
・DomainModelでAssociationをクリックする
・エンティティのAssociationタブでアソシエーションを選びクリックする
このどちらかでアソシエーションの設定画面を開いてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125006/c6154f4c-d54a-4281-9432-737a7c4c198f.png)

この画面で出来ること
・アソシエーションの名前を自由に変更（分かりやすいように決めてよい）
・Documentaionはコメント
・Multiplicity　多重度の設定　＊が多の意味になります
・on delete of…　アソシエーションで紐づけた一方のデータがDeleteされた場合
　紐づいているデータをどうするか選べます
　基本はkeppで消えないで良いかと

 これでアソシエーションの設定は完了です！
 簡単ですね(*‘ω‘ *)
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125006/81e4b31d-602d-4eac-bc22-c88c647c46dc.png)
事業所１件に対して、従業員複数が紐づくアソシエーションが定義できました！

## マイクロフローでの使用
設定したアソシエーションのマイクロフローでの使用方法です。
マイクロフローは実際の処理ロジックを書くところになります。
（今回はマイクロフローの詳細については割愛しますm(__)m）

`パターン：データを紐づける`
以下マイクロフローでCreate objectを用い、部署のオブジェクトを作成しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125006/d9670bec-5c7b-4cfc-acb9-91e4f4d7a79f.png)

部署A　インスタンスみたいなものです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125006/a4149a12-40f5-4938-9212-dc3edbbf7ef8.png)

このフローの後に、同じくCreate Objectで社員のオブジェクトをCreateしてみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125006/b17ae59a-faa0-40b8-9da7-697e598d0d95.png)
作りました。

もう一人作ってみましょう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125006/51965e43-abb0-4b1f-a3ba-a677cf9d390f.png)
↑これで部署１つに、２人の社員ができました。

では、次に部署Aに社員２人を紐づけます。

まずは、社員１を選択し、Newで変更する項目を選びます。
すると、この時Attributeとは別に、DomainModelで定義しているアソシエーションが選択できることが分かります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125006/f4d6acba-bda9-4ec8-ad9c-945d4a8d680c.png)

↓選択し、どのDepartmentオブジェクトを紐づけるか選びます。
（Mendixでは変数やオブジェクトは「＄」で指定します）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125006/8170dbc3-b5e0-4a62-93dc-9ce26e525a4d.png)

すると…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125006/e12f879d-8a5e-4d6c-851f-98bf99bf9ed4.png)
↑設定ができました。
鍵マークみたいなものがアソシエーションで、一番左のDepartmentオブジェクトが青く選択されている状態になると思います。使われていますよっという印です。
これでアソシエーションの張り方は終わります。
簡単でしょう？(^_^

ついでに、社員２人目も紐づけて、最後にコミットオブジェクトも置いちゃいましょう。

コミットオブジェクトは、アクティビティを置いて、Commit objectsを選びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125006/a0a8bdba-66d9-4d3e-9726-bdc9ee9421ec.png)

今回はそのまま３つをコミットオブジェクトしました。
かっこ悪いですが、今回は実権なのでよしとします。。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125006/7476175a-6e6d-4676-ae4d-c87833f66c15.png)


`パターン：データをRetreive（取得）する`

では、次はデータベースからデータ取るときにどうするかを解説します。
まず、Mendixでデータを取得するアクティビティはRetreiveになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125006/c6c1f2be-af0f-43d9-8986-d30f07372cdf.png)

・部署Aは、どことも紐づいていない原点のオブジェクトなのでFrom databaseからオブジェクトを選択します
（今は部署Aしかない確定１件なので、RangeはFirstを選んでおきます）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125006/897e8dcd-9252-4e42-a03d-21751bd11e56.png)

・これで部署Aの情報が取得できました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125006/347be88c-abd8-483c-92eb-3ead35aebfc8.png)

・では、「この部署に紐づいている」社員を取得します。
By associationから、部署と社員のアソシエーションを選択します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125006/ac1e78b5-62a9-4494-89a0-e00f11d20c82.png)

★ポイントとしては、今取得した部署オブジェクトから引っ張って取ってくるというイメージです
　ここで間違ったものを選ぶと意図していないデータを取ってしまうので注意です
　（なれるまで少しかかると思います（笑））
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125006/ec83b1df-4a50-433d-9254-ea89c61b9853.png)

・選ぶと、自然とList ofとなっており、複数リストとして取得したことが分かります。
　1-多でアソシエーションを繋いでいると、中身が１件でもリストになります。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125006/ead8e659-da48-4d9a-8154-9a275f88df52.png)

マイクロフローでのデータの取得方法についても以上となります。

:::note info
まとめ
・Associationを使うと、外部キーの概念を無くしてデータを紐づけられる
・Association先のデータを取得するときは、RetreiveアクティビティのBy associationから
:::

最初は慣れるまで少しとっつきにくい概念かと思います。
ですが、これを理解できるとMendixでの開発レベルが本当に上がるので、
Mendixでの開発が必要な方または、Mendixを試してみたいとお考えの方は
ぜひこのアソシエーションの概念理解について頑張っていただければと思います！

今回の記事は以上です。
ありがとうございます。