【Bubble】データベースのリレーションシップの設定方法

# はじめに
この記事は[Bubble](https://bubble.io)のリレーションシップの設定方法について記載しています。

[BubbleのForumに記載されていたリレーションシップの設定方法](https://forum.bubble.io/t/sql-joins-vs-bubble/25806/2)に記載されていた内容を写経していましたが、詳細な説明が無かったり、写経する内に発生した疑問に対して自分なりの回答が出来たりと色々あったので、復習も兼ねてメモ代わりに記事にする事にしました。

実はこの記事は投稿するのを忘れていて、下書きのまま1年くらい眠っていました...
時が経てば変わる類の内容ではないので大丈夫だと思いますが、念のためにその旨を記載しておきます。

# データの準備
リレーションシップの為に、２つのType（データベーステーブルの様なもの）を作成して、その中にテストデータを登録していきます。

内容は次の通りです。

Relation Sample AというTypeを次の通りに作成し、
![DB-A-01.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128060/d201d433-576a-37aa-753b-770eb8030cc2.png)

次のデータを登録します。
このテーブルにしか存在しないデータ`Exists in A only...`と、この後作成するテーブルにも存在する`Exists in A and B...`の2種類です。
![DB-A-02.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128060/83571e06-370f-db7c-8759-a382363a1ae9.png)

もう１つのType、Relation Sample Bを次の通りに作成し、
![DB-B-03.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128060/01876aa5-8212-2278-042d-4e51be8ed504.png)

次のデータを登録します。
このテーブルにしか存在しないデータ`Exists in B only...`と、先ほど作成したテーブルにも存在する`Exists in A and B...`の2種類です。
![DB-B-04.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128060/cd6c41bb-9295-53e5-9f95-f4a68d47f2c2.png)

# 使用するelements

- Repeating Group
- Text(Relation Sample A表示用)
- Text(Relation Sample B表示用)

配置は次の通り。
![elements-04b.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128060/c4db3cba-ecca-8e69-e98b-a208a3d5e053.png)

# リレーションの設定

## LEFT OUTER JOIN

Sample Relation Aの全データ（LEFTに該当）と、Textが一致するSample Relation Bのデータを表示させます。

次のSQLと同様の処理です。

```SQL
SELECT
  Sample Relation A.Text,
  Sample Relation B.Text
FROM Sample Relation A
  LEFT OUTER JOIN Sample Relation B
    ON Sample Relation A.Text = Sample Relation B.Text
```

### 設定内容

Repeating Groupを次の通りに設定。
![LEFT-05.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128060/3a3b8b6a-cb52-4ef6-17c8-4587b7124d01.png)

Text（Relation Sample A表示用）を次の通りに設定。
![LEFT-06.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128060/52183641-25a1-b261-f4ce-143773e8d82b.png)


Text（Relation Sample B表示用）を次の通りに設定。
![LEFT-07b.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128060/25ff3f17-fb00-3524-5b52-fd9abb1d24ad.png)

### 出力結果
次の通りのデータが出力されます。
Relation Sample Aの全データが出力され、Sample Relation BはRelation Sample AのTextデータと同じデータだけが出力されてるのが分かります。
![LEFT-08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128060/b36877ce-0490-2230-5585-75c9870b66e8.png)

## INNER JOIN

Sample Relation AとSample Relation B、お互いのTextが一致するデータだけを表示させます。

次のSQLと同様の処理です。

```SQL
SELECT
  Sample Relation A.Text,
  Sample Relation B.Text
FROM Sample Relation A
  INNER JOIN Sample Relation B
    ON Sample Relation A.Text = Sample Relation B.Text
```

### 設定内容

Repeating Groupを次の通りに設定。
![INNER-09.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128060/b43a692f-c997-6518-2cab-b55984734fe5.png)

Text（Relation Sample A表示用）を次の通りに設定。
![INNER-11.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128060/c12240e7-31df-ca43-0228-dd0518b9c5f8.png)

Text（Relation Sample B表示用）を次の通りに設定。
![INNER-12.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128060/0ed03f0d-ac36-a68a-cda3-090a59468f07.png)

### 出力結果

次の通りのデータが出力されます。
Sample Relation AとSample Relation B、お互いのTextが一致するデータだけが出力されてるのが分かります。
![INNER-13.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128060/484bdc0a-b15c-027d-fa23-c5b5a07a8294.png)

## FULL OUTER JOIN
`FULL OUTER JOIN`については先に[元の記事](https://forum.bubble.io/t/sql-joins-vs-bubble/25806/2)を読んで欲しいのですが、英語の記事が苦手な方の為に、要点だけ次に記載しておきます。

要点ですが、[元の記事](https://forum.bubble.io/t/sql-joins-vs-bubble/25806/2)には次の通りの記載があります。
>Note that in SQL you will get TableA or TableB null names back even if there is no match - this does not happen in Bubble.

RDBの場合、Joinの条件に一致するデータが存在しなくとも、どちらかのテーブルのnull名が返されますが、Bubbleではnullのデータが発生しないという旨の事が記載されています。

つまり、RDBの`FULL OUTER JOIN`とは異なる挙動を示すという事ですので、RDB経験者はその点に注意してお読みください。

...ただ、[元の記事](https://forum.bubble.io/t/sql-joins-vs-bubble/25806/2)の出力結果のサンプルを見ると、これは`FULL OUTER JOIN`ではなく`UNION`ではないかと思います。

### 設定内容

Repeating Groupを次の通りに設定。
![FULLOUTER-14.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128060/7a9b1f96-4e14-7b57-c61f-96d8a2fa5184.png)


Text（Relation Sample A表示用）を次の通りに設定。
（今回はデータが１列で出力されるため、設定するTextは１つだけ）
![FULLOUTER-15.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128060/d2fffc77-9260-7916-01bc-f0cfdfe2385e.png)

### 出力結果

次の通りのデータが出力されます。
...`UNION`ですよね？
![FULLOUTER-16.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128060/3a693d26-12ba-ad8e-5a7f-00a0f06f1a04.png)

## RDBのFULL OUTER JOIN
[元の記事](https://forum.bubble.io/t/sql-joins-vs-bubble/25806/2)には記載がありませんが、RDB経験者が想像する`FULL OUTER JOIN`を作成できたので記載します。

### 設定内容

Repeating Groupを次の通りに設定。（ここは先述の`FULL OUTER JOIN`の設定内容と同じです）
![FULLOUTER-14.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128060/7a9b1f96-4e14-7b57-c61f-96d8a2fa5184.png)

Text（Relation Sample A表示用）を次の通りに設定。
![FULLOUTER-17.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128060/d3cdaf5a-53c4-3a7d-ab16-ecc13b87eb31.png)

Text（Relation Sample B表示用）を次の通りに設定。
![FULLOUTER-18.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128060/bc60aa58-43f2-a4a8-aaf0-8321b92a656b.png)

### 出力結果

次の通りのデータが出力されます。
想像通りのデータが表示されました。
![FULLOUTER-20.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128060/36cd151b-1f40-a365-1ae1-9d7a02b068e5.png)

先ほどのデータと並べると、こんな感じになります。
![FULLOUTER-21.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128060/e3c55d04-4ae3-8d94-9907-5e65f96b6c86.png)

# 最後に

[元の記事](https://forum.bubble.io/t/sql-joins-vs-bubble/25806/2)には「FULL OUTER JOIN WITH EXCLUDES」というタイトルで、お互いに存在する値以外の値を取得するものについても記載がありましたが、それについては特に記載する事が無かったので省きました。

Bubbleのリレーションシップに慣れるのであれば、本記事の内容を写経するだけで充分だと思います。

本記事で失敗したのがtypeのフィールド名を「Text」にしてしまった事で、elementsの「Text」と区別がつきづらくなった事です。文脈で判断できるかと思いますが、次回があれば気を付けたいと思います。